You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by mi...@apache.org on 2016/02/11 18:34:07 UTC

[01/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 40ef21e46 -> 8bb348c66


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/distribution-management.html
----------------------------------------------------------------------
diff --git a/distribution-management.html b/distribution-management.html
index 0a54b9e..9866da9 100644
--- a/distribution-management.html
+++ b/distribution-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160210" />
+    <meta name="Date-Revision-yyyymmdd" content="20160211" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Distribution Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -290,7 +290,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-11</li>
             </p>
                 </div>
 


[40/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 4981cda..ad7a774 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -606,22 +606,22 @@
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">BloomType</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="strong">MetricsRegionServerSourceFactoryImpl.FactoryStorage</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="strong">ScannerContext.NextState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionOpeningState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">RegionOpeningState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DeleteTracker.DeleteCompare.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">DeleteTracker.DeleteCompare</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="strong">SplitLogWorker.TaskExecutor.Status</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="strong">ScanType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">Region.FlushResult.Result</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.StoreScannerCompactionRace.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">StoreScanner.StoreScannerCompactionRace</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionMergeTransaction.RegionMergeTransactionPhase.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">RegionMergeTransaction.RegionMergeTransactionPhase</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">DeleteTracker.DeleteResult</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitTransaction.SplitTransactionPhase.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">SplitTransaction.SplitTransactionPhase</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="strong">Region.Operation</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="strong">FlushType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">ScanQueryMatcher.MatchCode</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="strong">DefaultHeapMemoryTuner.StepDirection</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="strong">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="strong">DefaultHeapMemoryTuner.StepDirection</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="strong">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="strong">FlushType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DeleteTracker.DeleteCompare.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">DeleteTracker.DeleteCompare</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">DeleteTracker.DeleteResult</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.StoreScannerCompactionRace.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">StoreScanner.StoreScannerCompactionRace</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitTransaction.SplitTransactionPhase.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">SplitTransaction.SplitTransactionPhase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionOpeningState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">RegionOpeningState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionMergeTransaction.RegionMergeTransactionPhase.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">RegionMergeTransaction.RegionMergeTransactionPhase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">Region.FlushResult.Result</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="strong">SplitLogWorker.TaskExecutor.Status</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="strong">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html
index 7cdfaa3..e6ac66c 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html
@@ -228,6 +228,13 @@ implements org.apache.hadoop.io.Writable, <a href="../../../../../../org/apache/
 <tr class="rowColor">
 <td class="colOne"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#WALEdit(boolean)">WALEdit</a></strong>(boolean&nbsp;isReplay)</code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colOne"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#WALEdit(int)">WALEdit</a></strong>(int&nbsp;cellCount)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colOne"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#WALEdit(int,%20boolean)">WALEdit</a></strong>(int&nbsp;cellCount,
+              boolean&nbsp;isReplay)</code>&nbsp;</td>
+</tr>
 </table>
 </li>
 </ul>
@@ -522,12 +529,31 @@ private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Navigab
 <a name="WALEdit(boolean)">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>WALEdit</h4>
 <pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.119">WALEdit</a>(boolean&nbsp;isReplay)</pre>
 </li>
 </ul>
+<a name="WALEdit(int)">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>WALEdit</h4>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.123">WALEdit</a>(int&nbsp;cellCount)</pre>
+</li>
+</ul>
+<a name="WALEdit(int, boolean)">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>WALEdit</h4>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.127">WALEdit</a>(int&nbsp;cellCount,
+       boolean&nbsp;isReplay)</pre>
+</li>
+</ul>
 </li>
 </ul>
 <!-- ============ METHOD DETAIL ========== -->
@@ -542,7 +568,7 @@ private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Navigab
 <ul class="blockList">
 <li class="blockList">
 <h4>isMetaEditFamily</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.127">isMetaEditFamily</a>(byte[]&nbsp;f)</pre>
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.136">isMetaEditFamily</a>(byte[]&nbsp;f)</pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>f</code> - </dd>
 <dt><span class="strong">Returns:</span></dt><dd>True is <code>f</code> is <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#METAFAMILY"><code>METAFAMILY</code></a></dd></dl>
 </li>
@@ -553,7 +579,7 @@ private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Navigab
 <ul class="blockList">
 <li class="blockList">
 <h4>isMetaEditFamily</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.131">isMetaEditFamily</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.140">isMetaEditFamily</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
 </li>
 </ul>
 <a name="isMetaEdit()">
@@ -562,7 +588,7 @@ private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Navigab
 <ul class="blockList">
 <li class="blockList">
 <h4>isMetaEdit</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.135">isMetaEdit</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.144">isMetaEdit</a>()</pre>
 </li>
 </ul>
 <a name="isReplay()">
@@ -571,7 +597,7 @@ private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Navigab
 <ul class="blockList">
 <li class="blockList">
 <h4>isReplay</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.148">isReplay</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.157">isReplay</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>True when current WALEdit is created by log replay. Replication skips WALEdits from
          replay.</dd></dl>
 </li>
@@ -582,7 +608,7 @@ private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Navigab
 <ul class="blockList">
 <li class="blockList">
 <h4>setCompressionContext</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.152">setCompressionContext</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.html" title="class in org.apache.hadoop.hbase.regionserver.wal">CompressionContext</a>&nbsp;compressionContext)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.161">setCompressionContext</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.html" title="class in org.apache.hadoop.hbase.regionserver.wal">CompressionContext</a>&nbsp;compressionContext)</pre>
 </li>
 </ul>
 <a name="add(org.apache.hadoop.hbase.Cell)">
@@ -591,7 +617,7 @@ private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Navigab
 <ul class="blockList">
 <li class="blockList">
 <h4>add</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALEdit</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.156">add</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALEdit</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.165">add</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
 </li>
 </ul>
 <a name="isEmpty()">
@@ -600,7 +626,7 @@ private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Navigab
 <ul class="blockList">
 <li class="blockList">
 <h4>isEmpty</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.161">isEmpty</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.170">isEmpty</a>()</pre>
 </li>
 </ul>
 <a name="size()">
@@ -609,7 +635,7 @@ private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Navigab
 <ul class="blockList">
 <li class="blockList">
 <h4>size</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.165">size</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.174">size</a>()</pre>
 </li>
 </ul>
 <a name="getCells()">
@@ -618,7 +644,7 @@ private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Navigab
 <ul class="blockList">
 <li class="blockList">
 <h4>getCells</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.169">getCells</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.178">getCells</a>()</pre>
 </li>
 </ul>
 <a name="setCells(java.util.ArrayList)">
@@ -628,7 +654,7 @@ private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Navigab
 <li class="blockList">
 <h4>setCells</h4>
 <pre><a href="../../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Private.html" title="annotation in org.apache.hadoop.hbase.classification">@InterfaceAudience.Private</a>
-public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.181">setCells</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;cells)</pre>
+public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.190">setCells</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;cells)</pre>
 <div class="block">This is not thread safe.
  This will change the WALEdit and shouldn't be used unless you are sure that nothing
  else depends on the contents being immutable.</div>
@@ -641,7 +667,7 @@ public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>getAndRemoveScopes</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/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/regionserver/wal/WALEdit.html#line.185">getAndRemoveScopes</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/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/regionserver/wal/WALEdit.html#line.194">getAndRemoveScopes</a>()</pre>
 </li>
 </ul>
 <a name="readFields(java.io.DataInput)">
@@ -650,7 +676,7 @@ public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>readFields</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.192">readFields</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html?is-external=true" title="class or interface in java.io">DataInput</a>&nbsp;in)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.201">readFields</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html?is-external=true" title="class or interface in java.io">DataInput</a>&nbsp;in)
                 throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -665,7 +691,7 @@ public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>write</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.228">write</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataOutput.html?is-external=true" title="class or interface in java.io">DataOutput</a>&nbsp;out)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.237">write</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/DataOutput.html?is-external=true" title="class or interface in java.io">DataOutput</a>&nbsp;out)
            throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -680,7 +706,7 @@ public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>readFromCells</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.259">readFromCells</a>(<a href="../../../../../../org/apache/hadoop/hbase/codec/Codec.Decoder.html" title="interface in org.apache.hadoop.hbase.codec">Codec.Decoder</a>&nbsp;cellDecoder,
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.268">readFromCells</a>(<a href="../../../../../../org/apache/hadoop/hbase/codec/Codec.Decoder.html" title="interface in org.apache.hadoop.hbase.codec">Codec.Decoder</a>&nbsp;cellDecoder,
                 int&nbsp;expectedCount)
                   throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Reads WALEdit from cells.</div>
@@ -696,7 +722,7 @@ public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>heapSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.269">heapSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.278">heapSize</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/HeapSize.html#heapSize()">heapSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/HeapSize.html" title="interface in org.apache.hadoop.hbase.io">HeapSize</a></code></dd>
@@ -710,7 +736,7 @@ public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/regionserver/wal/WALEdit.html#line.283">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/regionserver/wal/WALEdit.html#line.292">toString</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -723,7 +749,7 @@ public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>createFlushWALEdit</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALEdit</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.298">createFlushWALEdit</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri,
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALEdit</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.307">createFlushWALEdit</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri,
                          org.apache.hadoop.hbase.protobuf.generated.WALProtos.FlushDescriptor&nbsp;f)</pre>
 </li>
 </ul>
@@ -733,7 +759,7 @@ public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>getFlushDescriptor</h4>
-<pre>public static&nbsp;org.apache.hadoop.hbase.protobuf.generated.WALProtos.FlushDescriptor&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.304">getFlushDescriptor</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)
+<pre>public static&nbsp;org.apache.hadoop.hbase.protobuf.generated.WALProtos.FlushDescriptor&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.313">getFlushDescriptor</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)
                                                                                                throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -745,7 +771,7 @@ public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>createRegionEventWALEdit</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALEdit</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.311">createRegionEventWALEdit</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri,
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALEdit</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.320">createRegionEventWALEdit</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri,
                                org.apache.hadoop.hbase.protobuf.generated.WALProtos.RegionEventDescriptor&nbsp;regionEventDesc)</pre>
 </li>
 </ul>
@@ -755,7 +781,7 @@ public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionEventDescriptor</h4>
-<pre>public static&nbsp;org.apache.hadoop.hbase.protobuf.generated.WALProtos.RegionEventDescriptor&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.318">getRegionEventDescriptor</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)
+<pre>public static&nbsp;org.apache.hadoop.hbase.protobuf.generated.WALProtos.RegionEventDescriptor&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.327">getRegionEventDescriptor</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)
                                                                                                            throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -767,7 +793,7 @@ public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>createCompaction</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALEdit</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.330">createCompaction</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri,
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALEdit</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.339">createCompaction</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri,
                        org.apache.hadoop.hbase.protobuf.generated.WALProtos.CompactionDescriptor&nbsp;c)</pre>
 <div class="block">Create a compaction WALEdit</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>c</code> - </dd>
@@ -780,7 +806,7 @@ public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>getRowForRegion</h4>
-<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.337">getRowForRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri)</pre>
+<pre>private static&nbsp;byte[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.346">getRowForRegion</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri)</pre>
 </li>
 </ul>
 <a name="getCompaction(org.apache.hadoop.hbase.Cell)">
@@ -789,7 +815,7 @@ public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompaction</h4>
-<pre>public static&nbsp;org.apache.hadoop.hbase.protobuf.generated.WALProtos.CompactionDescriptor&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.352">getCompaction</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv)
+<pre>public static&nbsp;org.apache.hadoop.hbase.protobuf.generated.WALProtos.CompactionDescriptor&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.361">getCompaction</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv)
                                                                                                throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Deserialized and returns a CompactionDescriptor is the KeyValue contains one.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>kv</code> - the key value</dd>
@@ -804,7 +830,7 @@ public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockList">
 <li class="blockList">
 <h4>createBulkLoadEvent</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALEdit</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.366">createBulkLoadEvent</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri,
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALEdit</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.375">createBulkLoadEvent</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri,
                           org.apache.hadoop.hbase.protobuf.generated.WALProtos.BulkLoadDescriptor&nbsp;bulkLoadDescriptor)</pre>
 <div class="block">Create a bulk loader WALEdit</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>hri</code> - The HRegionInfo for the region in which we are bulk loading</dd><dd><code>bulkLoadDescriptor</code> - The descriptor for the Bulk Loader</dd>
@@ -817,7 +843,7 @@ public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbas
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getBulkLoadDescriptor</h4>
-<pre>public static&nbsp;org.apache.hadoop.hbase.protobuf.generated.WALProtos.BulkLoadDescriptor&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.381">getBulkLoadDescriptor</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)
+<pre>public static&nbsp;org.apache.hadoop.hbase.protobuf.generated.WALProtos.BulkLoadDescriptor&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#line.390">getBulkLoadDescriptor</a>(<a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)
                                                                                                      throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Deserialized and returns a BulkLoadDescriptor from the passed in Cell</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>cell</code> - the key value</dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
----------------------------------------------------------------------
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 546973c..00d2201 100644
--- a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
@@ -101,8 +101,8 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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="strong">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="strong">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="strong">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
----------------------------------------------------------------------
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 1be466e..86e9213 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -140,9 +140,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="strong">AccessControlFilter.Strategy</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="strong">Permission.Action</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="strong">AccessController.OpType</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="strong">Permission.Action</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="strong">AccessControlFilter.Strategy</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html b/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
index 3d53b8b..c79ed50 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
@@ -379,166 +379,166 @@ extends org.jamon.AbstractTemplateProxy.ImplData</pre>
 <pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.110">m_master</a></pre>
 </li>
 </ul>
-<a name="m_serverManager">
+<a name="m_assignmentManager">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_serverManager</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.122">m_serverManager</a></pre>
+<h4>m_assignmentManager</h4>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.122">m_assignmentManager</a></pre>
 </li>
 </ul>
-<a name="m_serverManager__IsNotDefault">
+<a name="m_assignmentManager__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_serverManager__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.127">m_serverManager__IsNotDefault</a></pre>
+<h4>m_assignmentManager__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.127">m_assignmentManager__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_frags">
+<a name="m_serverManager">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_frags</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.139">m_frags</a></pre>
+<h4>m_serverManager</h4>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.139">m_serverManager</a></pre>
 </li>
 </ul>
-<a name="m_frags__IsNotDefault">
+<a name="m_serverManager__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_frags__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.144">m_frags__IsNotDefault</a></pre>
+<h4>m_serverManager__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.144">m_serverManager__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_metaLocation">
+<a name="m_deadServers">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_metaLocation</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.156">m_metaLocation</a></pre>
+<h4>m_deadServers</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.156">m_deadServers</a></pre>
 </li>
 </ul>
-<a name="m_metaLocation__IsNotDefault">
+<a name="m_deadServers__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_metaLocation__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.161">m_metaLocation__IsNotDefault</a></pre>
+<h4>m_deadServers__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.161">m_deadServers__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_assignmentManager">
+<a name="m_format">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_assignmentManager</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.173">m_assignmentManager</a></pre>
+<h4>m_format</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.ImplData.html#line.173">m_format</a></pre>
 </li>
 </ul>
-<a name="m_assignmentManager__IsNotDefault">
+<a name="m_format__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_assignmentManager__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.178">m_assignmentManager__IsNotDefault</a></pre>
+<h4>m_format__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.178">m_format__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_catalogJanitorEnabled">
+<a name="m_servers">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_catalogJanitorEnabled</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.190">m_catalogJanitorEnabled</a></pre>
+<h4>m_servers</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.190">m_servers</a></pre>
 </li>
 </ul>
-<a name="m_catalogJanitorEnabled__IsNotDefault">
+<a name="m_servers__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_catalogJanitorEnabled__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.195">m_catalogJanitorEnabled__IsNotDefault</a></pre>
+<h4>m_servers__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.195">m_servers__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_format">
+<a name="m_metaLocation">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_format</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.ImplData.html#line.207">m_format</a></pre>
+<h4>m_metaLocation</h4>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.207">m_metaLocation</a></pre>
 </li>
 </ul>
-<a name="m_format__IsNotDefault">
+<a name="m_metaLocation__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_format__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.212">m_format__IsNotDefault</a></pre>
+<h4>m_metaLocation__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.212">m_metaLocation__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_filter">
+<a name="m_frags">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_filter</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.ImplData.html#line.224">m_filter</a></pre>
+<h4>m_frags</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.224">m_frags</a></pre>
 </li>
 </ul>
-<a name="m_filter__IsNotDefault">
+<a name="m_frags__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_filter__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.229">m_filter__IsNotDefault</a></pre>
+<h4>m_frags__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.229">m_frags__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_deadServers">
+<a name="m_catalogJanitorEnabled">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_deadServers</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.241">m_deadServers</a></pre>
+<h4>m_catalogJanitorEnabled</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.241">m_catalogJanitorEnabled</a></pre>
 </li>
 </ul>
-<a name="m_deadServers__IsNotDefault">
+<a name="m_catalogJanitorEnabled__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_deadServers__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.246">m_deadServers__IsNotDefault</a></pre>
+<h4>m_catalogJanitorEnabled__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.246">m_catalogJanitorEnabled__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_servers">
+<a name="m_filter">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_servers</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.258">m_servers</a></pre>
+<h4>m_filter</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.ImplData.html#line.258">m_filter</a></pre>
 </li>
 </ul>
-<a name="m_servers__IsNotDefault">
+<a name="m_filter__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>m_servers__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.263">m_servers__IsNotDefault</a></pre>
+<h4>m_filter__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.263">m_filter__IsNotDefault</a></pre>
 </li>
 </ul>
 </li>
@@ -584,247 +584,247 @@ extends org.jamon.AbstractTemplateProxy.ImplData</pre>
 <pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.106">getMaster</a>()</pre>
 </li>
 </ul>
-<a name="setServerManager(org.apache.hadoop.hbase.master.ServerManager)">
+<a name="setAssignmentManager(org.apache.hadoop.hbase.master.AssignmentManager)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setServerManager</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.112">setServerManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;serverManager)</pre>
+<h4>setAssignmentManager</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.112">setAssignmentManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a>&nbsp;assignmentManager)</pre>
 </li>
 </ul>
-<a name="getServerManager()">
+<a name="getAssignmentManager()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getServerManager</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.118">getServerManager</a>()</pre>
+<h4>getAssignmentManager</h4>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.118">getAssignmentManager</a>()</pre>
 </li>
 </ul>
-<a name="getServerManager__IsNotDefault()">
+<a name="getAssignmentManager__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getServerManager__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.123">getServerManager__IsNotDefault</a>()</pre>
+<h4>getAssignmentManager__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.123">getAssignmentManager__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setFrags(java.util.Map)">
+<a name="setServerManager(org.apache.hadoop.hbase.master.ServerManager)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFrags</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.129">setFrags</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;frags)</pre>
+<h4>setServerManager</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.129">setServerManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;serverManager)</pre>
 </li>
 </ul>
-<a name="getFrags()">
+<a name="getServerManager()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFrags</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.ImplData.html#line.135">getFrags</a>()</pre>
+<h4>getServerManager</h4>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.135">getServerManager</a>()</pre>
 </li>
 </ul>
-<a name="getFrags__IsNotDefault()">
+<a name="getServerManager__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFrags__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.140">getFrags__IsNotDefault</a>()</pre>
+<h4>getServerManager__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.140">getServerManager__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setMetaLocation(org.apache.hadoop.hbase.ServerName)">
+<a name="setDeadServers(java.util.Set)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setMetaLocation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.146">setMetaLocation</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;metaLocation)</pre>
+<h4>setDeadServers</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.146">setDeadServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;deadServers)</pre>
 </li>
 </ul>
-<a name="getMetaLocation()">
+<a name="getDeadServers()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getMetaLocation</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.152">getMetaLocation</a>()</pre>
+<h4>getDeadServers</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.152">getDeadServers</a>()</pre>
 </li>
 </ul>
-<a name="getMetaLocation__IsNotDefault()">
+<a name="getDeadServers__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getMetaLocation__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.157">getMetaLocation__IsNotDefault</a>()</pre>
+<h4>getDeadServers__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.157">getDeadServers__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setAssignmentManager(org.apache.hadoop.hbase.master.AssignmentManager)">
+<a name="setFormat(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setAssignmentManager</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.163">setAssignmentManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a>&nbsp;assignmentManager)</pre>
+<h4>setFormat</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.163">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;format)</pre>
 </li>
 </ul>
-<a name="getAssignmentManager()">
+<a name="getFormat()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getAssignmentManager</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.169">getAssignmentManager</a>()</pre>
+<h4>getFormat</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.ImplData.html#line.169">getFormat</a>()</pre>
 </li>
 </ul>
-<a name="getAssignmentManager__IsNotDefault()">
+<a name="getFormat__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getAssignmentManager__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.174">getAssignmentManager__IsNotDefault</a>()</pre>
+<h4>getFormat__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.174">getFormat__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setCatalogJanitorEnabled(boolean)">
+<a name="setServers(java.util.List)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setCatalogJanitorEnabled</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.180">setCatalogJanitorEnabled</a>(boolean&nbsp;catalogJanitorEnabled)</pre>
+<h4>setServers</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.180">setServers</a>(<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
 </li>
 </ul>
-<a name="getCatalogJanitorEnabled()">
+<a name="getServers()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getCatalogJanitorEnabled</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.186">getCatalogJanitorEnabled</a>()</pre>
+<h4>getServers</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.186">getServers</a>()</pre>
 </li>
 </ul>
-<a name="getCatalogJanitorEnabled__IsNotDefault()">
+<a name="getServers__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getCatalogJanitorEnabled__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.191">getCatalogJanitorEnabled__IsNotDefault</a>()</pre>
+<h4>getServers__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.191">getServers__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setFormat(java.lang.String)">
+<a name="setMetaLocation(org.apache.hadoop.hbase.ServerName)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFormat</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.197">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;format)</pre>
+<h4>setMetaLocation</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.197">setMetaLocation</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;metaLocation)</pre>
 </li>
 </ul>
-<a name="getFormat()">
+<a name="getMetaLocation()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFormat</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.ImplData.html#line.203">getFormat</a>()</pre>
+<h4>getMetaLocation</h4>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.203">getMetaLocation</a>()</pre>
 </li>
 </ul>
-<a name="getFormat__IsNotDefault()">
+<a name="getMetaLocation__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFormat__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.208">getFormat__IsNotDefault</a>()</pre>
+<h4>getMetaLocation__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.208">getMetaLocation__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setFilter(java.lang.String)">
+<a name="setFrags(java.util.Map)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.214">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;filter)</pre>
+<h4>setFrags</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.214">setFrags</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;frags)</pre>
 </li>
 </ul>
-<a name="getFilter()">
+<a name="getFrags()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFilter</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.ImplData.html#line.220">getFilter</a>()</pre>
+<h4>getFrags</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.ImplData.html#line.220">getFrags</a>()</pre>
 </li>
 </ul>
-<a name="getFilter__IsNotDefault()">
+<a name="getFrags__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFilter__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.225">getFilter__IsNotDefault</a>()</pre>
+<h4>getFrags__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.225">getFrags__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setDeadServers(java.util.Set)">
+<a name="setCatalogJanitorEnabled(boolean)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setDeadServers</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.231">setDeadServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;deadServers)</pre>
+<h4>setCatalogJanitorEnabled</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.231">setCatalogJanitorEnabled</a>(boolean&nbsp;catalogJanitorEnabled)</pre>
 </li>
 </ul>
-<a name="getDeadServers()">
+<a name="getCatalogJanitorEnabled()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getDeadServers</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.237">getDeadServers</a>()</pre>
+<h4>getCatalogJanitorEnabled</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.237">getCatalogJanitorEnabled</a>()</pre>
 </li>
 </ul>
-<a name="getDeadServers__IsNotDefault()">
+<a name="getCatalogJanitorEnabled__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getDeadServers__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.242">getDeadServers__IsNotDefault</a>()</pre>
+<h4>getCatalogJanitorEnabled__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.242">getCatalogJanitorEnabled__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setServers(java.util.List)">
+<a name="setFilter(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setServers</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.248">setServers</a>(<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
+<h4>setFilter</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.248">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;filter)</pre>
 </li>
 </ul>
-<a name="getServers()">
+<a name="getFilter()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getServers</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.254">getServers</a>()</pre>
+<h4>getFilter</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.ImplData.html#line.254">getFilter</a>()</pre>
 </li>
 </ul>
-<a name="getServers__IsNotDefault()">
+<a name="getFilter__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>getServers__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.259">getServers__IsNotDefault</a>()</pre>
+<h4>getFilter__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.259">getFilter__IsNotDefault</a>()</pre>
 </li>
 </ul>
 </li>


[17/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
index fbdde18..1d64963 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
@@ -2959,7 +2959,7 @@
 <span class="sourceLineNo">2951</span>    Set&lt;byte[]&gt; deletesCfSet = null;<a name="line.2951"></a>
 <span class="sourceLineNo">2952</span>    long currentNonceGroup = HConstants.NO_NONCE;<a name="line.2952"></a>
 <span class="sourceLineNo">2953</span>    long currentNonce = HConstants.NO_NONCE;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    WALEdit walEdit = new WALEdit(replay);<a name="line.2954"></a>
+<span class="sourceLineNo">2954</span>    WALEdit walEdit = null;<a name="line.2954"></a>
 <span class="sourceLineNo">2955</span>    boolean locked = false;<a name="line.2955"></a>
 <span class="sourceLineNo">2956</span>    // reference family maps directly so coprocessors can mutate them if desired<a name="line.2956"></a>
 <span class="sourceLineNo">2957</span>    Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps = new Map[batchOp.operations.length];<a name="line.2957"></a>
@@ -2970,4878 +2970,4890 @@
 <span class="sourceLineNo">2962</span>    int noOfPuts = 0;<a name="line.2962"></a>
 <span class="sourceLineNo">2963</span>    int noOfDeletes = 0;<a name="line.2963"></a>
 <span class="sourceLineNo">2964</span>    WriteEntry writeEntry = null;<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    try {<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>      int numReadyToWrite = 0;<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>          lastIndexExclusive++;<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>          continue;<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>        }<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>        RowLock rowLock = null;<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>        try {<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>        } catch (IOException ioe) {<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span>        }<a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>        if (rowLock == null) {<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>          // We failed to grab another lock<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>          break; // Stop acquiring more rows for this batch<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>        } else {<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>          acquiredRowLocks.add(rowLock);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span>        }<a name="line.2989"></a>
-<span class="sourceLineNo">2990</span><a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>        lastIndexExclusive++;<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>        numReadyToWrite++;<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span><a name="line.2993"></a>
-<span class="sourceLineNo">2994</span>        if (mutation instanceof Put) {<a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>          // If Column Families stay consistent through out all of the<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>          // individual puts then metrics can be reported as a multiput across<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>          // column families in the first put.<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>          if (putsCfSet == null) {<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>          } else {<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span>          }<a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>        } else {<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>          if (deletesCfSet == null) {<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>          } else {<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>          }<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span>        }<a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>      }<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span><a name="line.3013"></a>
-<span class="sourceLineNo">3014</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3014"></a>
-<span class="sourceLineNo">3015</span><a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3020"></a>
-<span class="sourceLineNo">3021</span><a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>        return 0L;<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>      }<a name="line.3025"></a>
+<span class="sourceLineNo">2965</span>    int cellCount = 0;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    try {<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>      int numReadyToWrite = 0;<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>          lastIndexExclusive++;<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span>          continue;<a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>        }<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>        RowLock rowLock = null;<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span>        try {<a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>        } catch (IOException ioe) {<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>        }<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>        if (rowLock == null) {<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>          // We failed to grab another lock<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span>          break; // Stop acquiring more rows for this batch<a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>        } else {<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>          acquiredRowLocks.add(rowLock);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>        }<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span><a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>        lastIndexExclusive++;<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span>        numReadyToWrite++;<a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>        if (replay) {<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>          for (List&lt;Cell&gt; cells : mutation.getFamilyCellMap().values()) {<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>            cellCount += cells.size();<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>          }<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>        }<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span>        if (mutation instanceof Put) {<a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>          // If Column Families stay consistent through out all of the<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>          // individual puts then metrics can be reported as a multiput across<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>          // column families in the first put.<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>          if (putsCfSet == null) {<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>          } else {<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>          }<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>        } else {<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>          if (deletesCfSet == null) {<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>          } else {<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>          }<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>        }<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>      }<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span><a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span><a name="line.3020"></a>
+<span class="sourceLineNo">3021</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3025"></a>
 <span class="sourceLineNo">3026</span><a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span>        // skip invalid<a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>          // lastIndexExclusive was incremented above.<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span>          continue;<a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>        }<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span><a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>        if (mutation instanceof Put) {<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>          noOfPuts++;<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>        } else {<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>          noOfDeletes++;<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>        }<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span>      }<a name="line.3044"></a>
-<span class="sourceLineNo">3045</span><a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>      locked = true;<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span><a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>      // calling the pre CP hook for batch mutation<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>          return 0L;<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>        }<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>      }<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span><a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>      // STEP 3. Build WAL edit<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>          continue;<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>        }<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>        Mutation m = batchOp.getMutation(i);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>          durability = tmpDur;<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>        }<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>          continue;<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span>        }<a name="line.3075"></a>
-<span class="sourceLineNo">3076</span><a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>        long nonce = batchOp.getNonce(i);<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>          // Write what we have so far for nonces out to WAL<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>          walEdit = new WALEdit(replay);<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span>          currentNonceGroup = nonceGroup;<a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>          currentNonce = nonce;<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>        }<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span><a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>        // Add WAL edits by CP<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>        if (fromCP != null) {<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span>            walEdit.add(cell);<a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>          }<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>        }<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span>      }<a name="line.3098"></a>
-<span class="sourceLineNo">3099</span><a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>      WALKey walKey = null;<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>      if (replay) {<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>        // use wal key from the original<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3107"></a>
-<span class="sourceLineNo">3108</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>      }<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>      if (!walEdit.isEmpty()) {<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>        if (!replay) {<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>        }<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>        try {<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span>          long txid =<a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>          if (txid != 0) sync(txid, durability);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span>          writeEntry = walKey.getWriteEntry();<a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>        } catch (IOException ioe) {<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>          throw ioe;<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>        }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>      }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span>      if (walKey == null) {<a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>        writeEntry = mvcc.begin();<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>      }<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span><a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>      // STEP 5. Write back to memstore<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>      long addedSize = 0;<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>          continue;<a name="line.3139"></a>
+<span class="sourceLineNo">3027</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>        return 0L;<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span>      }<a name="line.3030"></a>
+<span class="sourceLineNo">3031</span><a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>        // skip invalid<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>          // lastIndexExclusive was incremented above.<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>          continue;<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span>        }<a name="line.3038"></a>
+<span class="sourceLineNo">3039</span><a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>        if (mutation instanceof Put) {<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>          noOfPuts++;<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>        } else {<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>          noOfDeletes++;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>        }<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span>        if (fromCP != null) {<a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>          cellCount += fromCP.size();<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>        }<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>        for (List&lt;Cell&gt; cells : familyMaps[i].values()) {<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span>          cellCount += cells.size();<a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>        }<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>      }<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>      walEdit = new WALEdit(cellCount, replay);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>      locked = true;<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span><a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>      // calling the pre CP hook for batch mutation<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>          return 0L;<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>        }<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>      }<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>      // STEP 3. Build WAL edit<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span>          continue;<a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>        }<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span><a name="line.3078"></a>
+<span class="sourceLineNo">3079</span>        Mutation m = batchOp.getMutation(i);<a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>          durability = tmpDur;<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>        }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>          continue;<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>        }<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span><a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>        long nonce = batchOp.getNonce(i);<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>          // Write what we have so far for nonces out to WAL<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>          walEdit = new WALEdit(cellCount, replay);<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>          currentNonceGroup = nonceGroup;<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>          currentNonce = nonce;<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>        }<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span><a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>        // Add WAL edits by CP<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span>        if (fromCP != null) {<a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>            walEdit.add(cell);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>          }<a name="line.3107"></a>
+<span class="sourceLineNo">3108</span>        }<a name="line.3108"></a>
+<span class="sourceLineNo">3109</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>      }<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span><a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>      WALKey walKey = null;<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>      if (replay) {<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>        // use wal key from the original<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>      }<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>      if (!walEdit.isEmpty()) {<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span>        if (!replay) {<a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>        }<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>        try {<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>          long txid =<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>          if (txid != 0) sync(txid, durability);<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>          writeEntry = walKey.getWriteEntry();<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>        } catch (IOException ioe) {<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>          throw ioe;<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span>        }<a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span>      }<a name="line.3143"></a>
-<span class="sourceLineNo">3144</span><a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>      // STEP 6. Complete mvcc.<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>      if (replay) {<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>        mvcc.completeAndWait(writeEntry);<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>        writeEntry = null;<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span>      }<a name="line.3151"></a>
-<span class="sourceLineNo">3152</span><a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>      // STEP 7. Release row locks, etc.<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>      if (locked) {<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span>        this.updatesLock.readLock().unlock();<a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>        locked = false;<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>      }<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>      // calling the post CP hook for batch mutation<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>      }<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span><a name="line.3167"></a>
-<span class="sourceLineNo">3168</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>        }<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>      }<a name="line.3172"></a>
-<span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>          // only for successful puts<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span>              != OperationStatusCode.SUCCESS) {<a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>            continue;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>          }<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>          Mutation m = batchOp.getMutation(i);<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>          if (m instanceof Put) {<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>          } else {<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>          }<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>        }<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>      }<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span><a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>      success = true;<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span>      return addedSize;<a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    } finally {<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>      if (locked) {<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span>        this.updatesLock.readLock().unlock();<a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>      }<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span><a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>      // See if the column families were consistent through the whole thing.<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>      // null will be treated as unknown.<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span><a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>      if (noOfPuts &gt; 0) {<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>        // There were some Puts in the batch.<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>        if (this.metricsRegion != null) {<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span>          this.metricsRegion.updatePut();<a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>        }<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>      }<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>      if (noOfDeletes &gt; 0) {<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>        // There were some Deletes in the batch.<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>        if (this.metricsRegion != null) {<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span>          this.metricsRegion.updateDelete();<a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>        }<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>      }<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>      if (!success) {<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>          }<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>        }<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>      }<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>        // call the coprocessor hook to do any finalization steps<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>        // after the put is done<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>                lastIndexExclusive);<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>      }<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span><a name="line.3236"></a>
-<span class="sourceLineNo">3237</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    }<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>  }<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>  throws IOException {<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    if (walEdit.isEmpty()) return;<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>  }<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span><a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>  throws IOException {<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    boolean skip = false;<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    // Skip anything that "ran" already<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>      return true;<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span>    }<a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span>    // store the family map reference to allow for mutations<a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    try {<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>      if (mutation instanceof Put) {<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>        // Check the families in the put. If bad, skip this one.<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>        if (batchOp.isInReplay()) {<a name="line.3271"></a>
-<span class="sourceLineNo">3272</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>        } else {<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>          checkFamilies(familyMap.keySet());<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>        }<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>      } else {<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span>        prepareDelete((Delete)mutation);<a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>      }<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>      skip = true;<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>      skip = true;<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    } catch (WrongRegionException we) {<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>      skip = true;<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    }<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    return skip;<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>  }<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>  /**<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>   * During replay, there could exist column families which are removed between region server<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>   * failure and replay<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>   */<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>        if (nonExistentList == null) {<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span>        }<a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>        nonExistentList.add(family);<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>      }<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>    }<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>    if (nonExistentList != null) {<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>      for (byte[] family : nonExistentList) {<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>        // Perhaps schema was changed between crash and replay<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>        familyMap.remove(family);<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>      }<a name="line.3319"></a>
-<span class="sourceLineNo">3320</span>    }<a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>  }<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span><a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>  /**<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span>   * Returns effective durability from the passed durability and<a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>   * the table descriptor.<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span>   */<a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>  }<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span><a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>  @Override<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      boolean writeToWAL)<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>  throws IOException{<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    checkMutationType(mutation, row);<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>      mutation, writeToWAL);<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>  }<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span><a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>  @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3343"></a>
-<span class="sourceLineNo">3344</span>      boolean writeToWAL)<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>  throws IOException {<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, rm, null,<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>      writeToWAL);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>  }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span><a name="line.3349"></a>
-<span class="sourceLineNo">3350</span>  /**<a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>   * checkAndMutate and checkAndRowMutate are 90% the same. Rather than copy/paste, below has<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>   * switches in the few places where there is deviation.<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span>   */<a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>  private boolean doCheckAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rowMutations,<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>      Mutation mutation, boolean writeToWAL)<a name="line.3356"></a>
+<span class="sourceLineNo">3141</span>      }<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>      if (walKey == null) {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>        writeEntry = mvcc.begin();<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>      }<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span><a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>      // STEP 5. Write back to memstore<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>      long addedSize = 0;<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>          continue;<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>        }<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>      }<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span><a name="line.3156"></a>
+<span class="sourceLineNo">3157</span>      // STEP 6. Complete mvcc.<a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>      if (replay) {<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span>        mvcc.completeAndWait(writeEntry);<a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>        writeEntry = null;<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>      }<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span><a name="line.3164"></a>
+<span class="sourceLineNo">3165</span>      // STEP 7. Release row locks, etc.<a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>      if (locked) {<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>        this.updatesLock.readLock().unlock();<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>        locked = false;<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span>      }<a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span><a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>      // calling the post CP hook for batch mutation<a name="line.3172"></a>
+<span class="sourceLineNo">3173</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3173"></a>
+<span class="sourceLineNo">3174</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span>      }<a name="line.3178"></a>
+<span class="sourceLineNo">3179</span><a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span>        }<a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>      }<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span><a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span>          // only for successful puts<a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>              != OperationStatusCode.SUCCESS) {<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>            continue;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>          }<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span>          Mutation m = batchOp.getMutation(i);<a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>          if (m instanceof Put) {<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>          } else {<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>          }<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>        }<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>      }<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>      success = true;<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>      return addedSize;<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    } finally {<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>      if (locked) {<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>        this.updatesLock.readLock().unlock();<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>      }<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span><a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>      // See if the column families were consistent through the whole thing.<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>      // null will be treated as unknown.<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span><a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>      if (noOfPuts &gt; 0) {<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span>        // There were some Puts in the batch.<a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>        if (this.metricsRegion != null) {<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>          this.metricsRegion.updatePut();<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>        }<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>      }<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>      if (noOfDeletes &gt; 0) {<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span>        // There were some Deletes in the batch.<a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>        if (this.metricsRegion != null) {<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>          this.metricsRegion.updateDelete();<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>        }<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>      }<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span>      if (!success) {<a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>          }<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>        }<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>      }<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>        // call the coprocessor hook to do any finalization steps<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span>        // after the put is done<a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>                lastIndexExclusive);<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span>      }<a name="line.3247"></a>
+<span class="sourceLineNo">3248</span><a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span>    }<a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>  }<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span><a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  throws IOException {<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span>    if (walEdit.isEmpty()) return;<a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  }<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span><a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>  throws IOException {<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    boolean skip = false;<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    // Skip anything that "ran" already<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3271"></a>
+<span class="sourceLineNo">3272</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3272"></a>
+<span class="sourceLineNo">3273</span>      return true;<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    }<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span>    // store the family map reference to allow for mutations<a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span><a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    try {<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>      if (mutation instanceof Put) {<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span>        // Check the families in the put. If bad, skip this one.<a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>        if (batchOp.isInReplay()) {<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>        } else {<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>          checkFamilies(familyMap.keySet());<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>        }<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>      } else {<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>        prepareDelete((Delete)mutation);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>      }<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span>      skip = true;<a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>      skip = true;<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    } catch (WrongRegionException we) {<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>      skip = true;<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    }<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span>    return skip;<a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>  }<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span><a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>  /**<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>   * During replay, there could exist column families which are removed between region server<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>   * failure and replay<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3319"></a>
+<span class="sourceLineNo">3320</span>        if (nonExistentList == null) {<a name="line.3320"></a>
+<span class="sourceLineNo">3321</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>        }<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>        nonExistentList.add(family);<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>      }<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>    }<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>    if (nonExistentList != null) {<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>      for (byte[] family : nonExistentList) {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>        // Perhaps schema was changed between crash and replay<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span>        familyMap.remove(family);<a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>      }<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    }<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>  }<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>  /**<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span>   * Returns effective durability from the passed durability and<a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>   * the table descriptor.<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>   */<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>  }<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span><a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>  @Override<a name="line.3343"></a>
+<span class="sourceLineNo">3344</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3344"></a>
+<span class="sourceLineNo">3345</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>      boolean writeToWAL)<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span>  throws IOException{<a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    checkMutationType(mutation, row);<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>      mutation, writeToWAL);<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>  }<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span><a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>  @Override<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      boolean writeToWAL)<a name="line.3356"></a>
 <span class="sourceLineNo">3357</span>  throws IOException {<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // Could do the below checks but seems wacky with two callers only. Just comment out for now.<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // One caller passes a Mutation, the other passes RowMutation. Presume all good so we don't<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // need these commented out checks.<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // if (rowMutations == null &amp;&amp; mutation == null) throw new DoNotRetryIOException("Both null");<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // if (rowMutations != null &amp;&amp; mutation != null) throw new DoNotRetryIOException("Both set");<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    checkReadOnly();<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // TODO, add check for value length also move this check to the client<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span>    checkResources();<a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    startRegionOperation();<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    try {<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>      Get get = new Get(row);<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>      checkFamily(family);<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>      get.addColumn(family, qualifier);<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>      // Lock row - note that doBatchMutate will relock this row if called<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>      RowLock rowLock = getRowLock(get.getRow());<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>      try {<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>        if (mutation != null &amp;&amp; this.getCoprocessorHost() != null) {<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>          // Call coprocessor.<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>          Boolean processed = null;<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>          if (mutation instanceof Put) {<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>            processed = this.getCoprocessorHost().preCheckAndPutAfterRowLock(row, family,<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>                qualifier, compareOp, comparator, (Put)mutation);<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>          } else if (mutation instanceof Delete) {<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>            processed = this.getCoprocessorHost().preCheckAndDeleteAfterRowLock(row, family,<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span>                qualifier, compareOp, comparator, (Delete)mutation);<a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>          }<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>          if (processed != null) {<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>            return processed;<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>          }<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>        }<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>        // NOTE: We used to wait here until mvcc caught up:  mvcc.await();<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        // Supposition is that now all changes are done under row locks, then when we go to read,<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>        // we'll get the latest on this row.<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        List&lt;Cell&gt; result = get(get, false);<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>        boolean valueIsNull = comparator.getValue() == null || comparator.getValue().length == 0;<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        boolean matches = false;<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>        long cellTs = 0;<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        if (result.size() == 0 &amp;&amp; valueIsNull) {<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>          matches = true;<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>        } else if (result.size() &gt; 0 &amp;&amp; result.get(0).getValueLength() == 0 &amp;&amp; valueIsNull) {<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>          matches = true;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>          cellTs = result.get(0).getTimestamp();<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        } else if (result.size() == 1 &amp;&amp; !valueIsNull) {<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>          Cell kv = result.get(0);<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>          cellTs = kv.getTimestamp();<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>          int compareResult = CellComparator.compareValue(kv, comparator);<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span>          matches = matches(compareOp, compareResult);<a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>        }<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>        // If matches put the new put or delete the new delete<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>        if (matches) {<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>          // We have acquired the row lock already. If the system cl

<TRUNCATED>

[28/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
index ccccc8d..d2f53d2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
@@ -89,16 +89,16 @@
 <span class="sourceLineNo">081</span>      return UNKNOWN_RACK;<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">084</span><a name="line.84"></a>
 <span class="sourceLineNo">085</span>  /**<a name="line.85"></a>
 <span class="sourceLineNo">086</span>   * The constructor that uses the basic MetricsBalancer<a name="line.86"></a>
 <span class="sourceLineNo">087</span>   */<a name="line.87"></a>
 <span class="sourceLineNo">088</span>  protected BaseLoadBalancer() {<a name="line.88"></a>
 <span class="sourceLineNo">089</span>    metricsBalancer = new MetricsBalancer();<a name="line.89"></a>
 <span class="sourceLineNo">090</span>  }<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  <a name="line.91"></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>   * This Constructor accepts an instance of MetricsBalancer, <a name="line.93"></a>
+<span class="sourceLineNo">093</span>   * This Constructor accepts an instance of MetricsBalancer,<a name="line.93"></a>
 <span class="sourceLineNo">094</span>   * which will be used instead of creating a new one<a name="line.94"></a>
 <span class="sourceLineNo">095</span>   */<a name="line.95"></a>
 <span class="sourceLineNo">096</span>  protected BaseLoadBalancer(MetricsBalancer metricsBalancer) {<a name="line.96"></a>
@@ -1287,284 +1287,251 @@
 <span class="sourceLineNo">1279</span>  }<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>   * Generates an immediate assignment plan to be used by a new master for<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   * regions in transition that do not have an already known destination.<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>   *<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>   * Takes a list of regions that need immediate assignment and a list of all<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>   * available servers. Returns a map of regions to the server they should be<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * assigned to.<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   *<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   * This method will return quickly and does not do any intelligent balancing.<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>   * The goal is to make a fast decision not the best decision possible.<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>   *<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>   * Currently this is random.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>   *<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>   * @param regions<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>   * @param servers<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>   * @return map of regions to the server it should be assigned to<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>  public Map&lt;HRegionInfo, ServerName&gt; immediateAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      List&lt;ServerName&gt; servers) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    metricsBalancer.incrMiscInvocations();<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    if (servers == null || servers.isEmpty()) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      LOG.warn("Wanted to do random assignment but no servers to assign to");<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      return null;<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>    Map&lt;HRegionInfo, ServerName&gt; assignments = new TreeMap&lt;HRegionInfo, ServerName&gt;();<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    for (HRegionInfo region : regions) {<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>      assignments.put(region, randomAssignment(region, servers));<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    }<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    return assignments;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>  }<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span><a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>  /**<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>   * Used to assign a single region to a random server.<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>   */<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>  @Override<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>  public ServerName randomAssignment(HRegionInfo regionInfo, List&lt;ServerName&gt; servers) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    metricsBalancer.incrMiscInvocations();<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>        return masterServerName;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      }<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      // Guarantee not to put other regions on master<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      servers.remove(masterServerName);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    }<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span><a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>    if (numServers == 0) {<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      return null;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>    }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      return servers.get(0);<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>    List&lt;HRegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    return randomAssignment(cluster, regionInfo, servers);<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>  }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span><a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  /**<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>   * available/online servers available for assignment.<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>   * &lt;p&gt;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   * completely balanced.<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>   * &lt;p&gt;<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * assigned randomly to available servers.<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   *<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * @param regions regions and existing assignment from meta<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * @param servers available servers<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * @return map of servers and regions to be assigned to them<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   */<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>  @Override<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; retainAssignment(Map&lt;HRegionInfo, ServerName&gt; regions,<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      List&lt;ServerName&gt; servers) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    // Update metrics<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    metricsBalancer.incrMiscInvocations();<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      = assignMasterRegions(regions.keySet(), servers);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      // Guarantee not to put other regions on master<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      servers.remove(masterServerName);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      if (!masterRegions.isEmpty()) {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>        regions = new HashMap&lt;HRegionInfo, ServerName&gt;(regions);<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        for (HRegionInfo region: masterRegions) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>          regions.remove(region);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    if (regions == null || regions.isEmpty()) {<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      return assignments;<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
+<span class="sourceLineNo">1282</span>   * Used to assign a single region to a random server.<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>   */<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>  @Override<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>  public ServerName randomAssignment(HRegionInfo regionInfo, List&lt;ServerName&gt; servers) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>    metricsBalancer.incrMiscInvocations();<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        return masterServerName;<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      // Guarantee not to put other regions on master<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      servers.remove(masterServerName);<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span><a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>    if (numServers == 0) {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      return null;<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      return servers.get(0);<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>    List&lt;HRegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    return randomAssignment(cluster, regionInfo, servers);<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>  }<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span><a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  /**<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>   * available/online servers available for assignment.<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>   * &lt;p&gt;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>   * completely balanced.<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>   * &lt;p&gt;<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>   * assigned randomly to available servers.<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>   *<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>   * @param regions regions and existing assignment from meta<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>   * @param servers available servers<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>   * @return map of servers and regions to be assigned to them<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   */<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>  @Override<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; retainAssignment(Map&lt;HRegionInfo, ServerName&gt; regions,<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      List&lt;ServerName&gt; servers) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>    // Update metrics<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    metricsBalancer.incrMiscInvocations();<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      = assignMasterRegions(regions.keySet(), servers);<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      // Guarantee not to put other regions on master<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      servers.remove(masterServerName);<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      if (!masterRegions.isEmpty()) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        regions = new HashMap&lt;HRegionInfo, ServerName&gt;(regions);<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        for (HRegionInfo region: masterRegions) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          regions.remove(region);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    if (regions == null || regions.isEmpty()) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>      return assignments;<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    }<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    if (numServers == 0) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>      return null;<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      ServerName server = servers.get(0);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions.keySet()));<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>      return assignments;<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    }<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span><a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    // Group all of the old assignments by their hostname.<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    // We can't group directly by ServerName since the servers all have<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    // new start-codes.<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>    // servers on the same host on different ports.<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    for (ServerName server : servers) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>      serversByHostname.put(server.getHostname(), server);<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>    // Collection of the hostnames that used to have regions<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    // assigned, but for which we no longer have any RS running<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>    // after the cluster restart.<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span><a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    int numRandomAssignments = 0;<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    int numRetainedAssigments = 0;<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span><a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1381"></a>
 <span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    if (numServers == 0) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      return null;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    }<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      ServerName server = servers.get(0);<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions.keySet()));<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return assignments;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span><a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    // Group all of the old assignments by their hostname.<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    // We can't group directly by ServerName since the servers all have<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>    // new start-codes.<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span><a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    // servers on the same host on different ports.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    for (ServerName server : servers) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      serversByHostname.put(server.getHostname(), server);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    // Collection of the hostnames that used to have regions<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    // assigned, but for which we no longer have any RS running<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    // after the cluster restart.<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    int numRandomAssignments = 0;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    int numRetainedAssigments = 0;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span><a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    for (Map.Entry&lt;HRegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      HRegionInfo region = entry.getKey();<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>      ServerName oldServerName = entry.getValue();<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;ServerName&gt;();<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      if (oldServerName != null) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        localServers = serversByHostname.get(oldServerName.getHostname());<a name="line.1421"></a>
+<span class="sourceLineNo">1383</span>    for (Map.Entry&lt;HRegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      HRegionInfo region = entry.getKey();<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      ServerName oldServerName = entry.getValue();<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;ServerName&gt;();<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      if (oldServerName != null) {<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        localServers = serversByHostname.get(oldServerName.getHostname());<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      }<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      if (localServers.isEmpty()) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>        // No servers on the new cluster match up with this hostname,<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>        // assign randomly.<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>        ServerName randomServer = randomAssignment(cluster, region, servers);<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>        assignments.get(randomServer).add(region);<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        numRandomAssignments++;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        if (oldServerName != null) oldHostsNoLongerPresent.add(oldServerName.getHostname());<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      } else if (localServers.size() == 1) {<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>        // the usual case - one new server on same host<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>        ServerName target = localServers.get(0);<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>        assignments.get(target).add(region);<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>        cluster.doAssignRegion(region, target);<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>        numRetainedAssigments++;<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      } else {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>        // multiple new servers in the cluster on this same host<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        if (localServers.contains(oldServerName)) {<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>          assignments.get(oldServerName).add(region);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>          cluster.doAssignRegion(region, oldServerName);<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        } else {<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>          ServerName target = null;<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>          for (ServerName tmp: localServers) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>              target = tmp;<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>              break;<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>            }<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>          }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>          if (target == null) {<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>            target = randomAssignment(cluster, region, localServers);<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>          }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>          assignments.get(target).add(region);<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>        }<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>        numRetainedAssigments++;<a name="line.1421"></a>
 <span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      if (localServers.isEmpty()) {<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        // No servers on the new cluster match up with this hostname,<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>        // assign randomly.<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>        ServerName randomServer = randomAssignment(cluster, region, servers);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        assignments.get(randomServer).add(region);<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>        numRandomAssignments++;<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>        if (oldServerName != null) oldHostsNoLongerPresent.add(oldServerName.getHostname());<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      } else if (localServers.size() == 1) {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        // the usual case - one new server on same host<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>        ServerName target = localServers.get(0);<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        assignments.get(target).add(region);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>        cluster.doAssignRegion(region, target);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>        numRetainedAssigments++;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      } else {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        // multiple new servers in the cluster on this same host<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        if (localServers.contains(oldServerName)) {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>          assignments.get(oldServerName).add(region);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>          cluster.doAssignRegion(region, oldServerName);<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        } else {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>          ServerName target = null;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>          for (ServerName tmp: localServers) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>              target = tmp;<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>              break;<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>            }<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          }<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          if (target == null) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            target = randomAssignment(cluster, region, localServers);<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>          }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>          assignments.get(target).add(region);<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>        }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>        numRetainedAssigments++;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    }<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span><a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    String randomAssignMsg = "";<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>    if (numRandomAssignments &gt; 0) {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      randomAssignMsg =<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>          numRandomAssignments + " regions were assigned "<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<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>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    return assignments;<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  }<a name="line.1470"></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>    String randomAssignMsg = "";<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>    if (numRandomAssignments &gt; 0) {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      randomAssignMsg =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>          numRandomAssignments + " regions were assigned "<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    }<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    return assignments;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>  }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span><a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>  @Override<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>  public void initialize() throws HBaseIOException{<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>  }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span><a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>  @Override<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>  public void regionOnline(HRegionInfo regionInfo, ServerName sn) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>  }<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span><a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>  @Override<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>  public void regionOffline(HRegionInfo regionInfo) {<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>  @Override<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>  public boolean isStopped() {<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    return stopped;<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>  }<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span><a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>  @Override<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>  public void stop(String why) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    stopped = true;<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>  }<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span><a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>  /**<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>   * Used to assign a single region to a random server.<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>   */<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>  private ServerName randomAssignment(Cluster cluster, HRegionInfo regionInfo,<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>      List&lt;ServerName&gt; servers) {<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    ServerName sn = null;<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    final int maxIterations = numServers * 4;<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    int iterations = 0;<a name="line.1470"></a>
 <span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  @Override<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  public void initialize() throws HBaseIOException{<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>  }<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span><a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>  @Override<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>  public void regionOnline(HRegionInfo regionInfo, ServerName sn) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>  }<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>  @Override<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>  public void regionOffline(HRegionInfo regionInfo) {<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>  public boolean isStopped() {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>    return stopped;<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>  @Override<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  public void stop(String why) {<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>    stopped = true;<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>  }<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span><a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>  /**<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>   * Used to assign a single region to a random server.<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>   */<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>  private ServerName randomAssignment(Cluster cluster, HRegionInfo regionInfo,<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>      List&lt;ServerName&gt; servers) {<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>    ServerName sn = null;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>    final int maxIterations = numServers * 4;<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    int iterations = 0;<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    do {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>      int i = RANDOM.nextInt(numServers);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      sn = servers.get(i);<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    return sn;<a name="line.1511"></a>
+<span class="sourceLineNo">1472</span>    do {<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      int i = RANDOM.nextInt(numServers);<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      sn = servers.get(i);<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>    return sn;<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>  /**<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>   * Round robin a list of regions to a list of servers<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>   */<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>  private void roundRobinAssignment(Cluster cluster, List&lt;HRegionInfo&gt; regions,<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      List&lt;HRegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments) {<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>    int numServers = servers.size();<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    int numRegions = regions.size();<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>    int serverIdx = 0;<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    if (numServers &gt; 1) {<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    }<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    int regionIdx = 0;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      List&lt;HRegionInfo&gt; serverRegions = new ArrayList&lt;HRegionInfo&gt;(max);<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>        HRegionInfo region = regions.get(i % numRegions);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>          unassignedRegions.add(region);<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>        } else {<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>          serverRegions.add(region);<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>          cluster.doAssignRegion(region, server);<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>      assignments.put(server, serverRegions);<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      regionIdx++;<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    }<a name="line.1511"></a>
 <span class="sourceLineNo">1512</span>  }<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>
-<span class="sourceLineNo">1515</span>   * Round robin a list of regions to a list of servers<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>   */<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>  private void roundRobinAssignment(Cluster cluster, List&lt;HRegionInfo&gt; regions,<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>      List&lt;HRegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments) {<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span><a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    int numServers = servers.size();<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    int numRegions = regions.size();<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    int serverIdx = 0;<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    if (numServers &gt; 1) {<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    }<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>    int regionIdx = 0;<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span><a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>      List&lt;HRegionInfo&gt; serverRegions = new ArrayList&lt;HRegionInfo&gt;(max);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>        HRegionInfo region = regions.get(i % numRegions);<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>          unassignedRegions.add(region);<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>        } else {<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>          serverRegions.add(region);<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>          cluster.doAssignRegion(region, server);<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>        }<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      }<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      assignments.put(server, serverRegions);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>      regionIdx++;<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    }<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>  }<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span><a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>    Collection&lt;HRegionInfo&gt; regions) {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    } else {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      return new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    }<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>  }<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span><a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>  @Override<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>  }<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>}<a name="line.1559"></a>
+<span class="sourceLineNo">1514</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>    Collection&lt;HRegionInfo&gt; regions) {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    } else {<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>      return new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    }<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>  }<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span><a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>  @Override<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>  }<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>}<a name="line.1526"></a>
 
 
 


[14/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.Intf.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.Intf.html b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.Intf.html
index 605e9f5..c719c8a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.Intf.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.Intf.html
@@ -67,15 +67,15 @@
 <span class="sourceLineNo">059</span>  requiredArguments = {<a name="line.59"></a>
 <span class="sourceLineNo">060</span>    @org.jamon.annotations.Argument(name = "master", type = "HMaster")},<a name="line.60"></a>
 <span class="sourceLineNo">061</span>  optionalArguments = {<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    @org.jamon.annotations.Argument(name = "serverManager", type = "ServerManager"),<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    @org.jamon.annotations.Argument(name = "frags", type = "Map&lt;String,Integer&gt;"),<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    @org.jamon.annotations.Argument(name = "metaLocation", type = "ServerName"),<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    @org.jamon.annotations.Argument(name = "assignmentManager", type = "AssignmentManager"),<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    @org.jamon.annotations.Argument(name = "catalogJanitorEnabled", type = "boolean"),<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    @org.jamon.annotations.Argument(name = "filter", type = "String"),<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    @org.jamon.annotations.Argument(name = "deadServers", type = "Set&lt;ServerName&gt;"),<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    @org.jamon.annotations.Argument(name = "servers", type = "List&lt;ServerName&gt;")})<a name="line.70"></a>
+<span class="sourceLineNo">062</span>    @org.jamon.annotations.Argument(name = "assignmentManager", type = "AssignmentManager"),<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    @org.jamon.annotations.Argument(name = "serverManager", type = "ServerManager"),<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    @org.jamon.annotations.Argument(name = "deadServers", type = "Set&lt;ServerName&gt;"),<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    @org.jamon.annotations.Argument(name = "servers", type = "List&lt;ServerName&gt;"),<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    @org.jamon.annotations.Argument(name = "metaLocation", type = "ServerName"),<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    @org.jamon.annotations.Argument(name = "frags", type = "Map&lt;String,Integer&gt;"),<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    @org.jamon.annotations.Argument(name = "catalogJanitorEnabled", type = "boolean"),<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    @org.jamon.annotations.Argument(name = "filter", type = "String")})<a name="line.70"></a>
 <span class="sourceLineNo">071</span>public class MasterStatusTmpl<a name="line.71"></a>
 <span class="sourceLineNo">072</span>  extends org.jamon.AbstractTemplateProxy<a name="line.72"></a>
 <span class="sourceLineNo">073</span>{<a name="line.73"></a>
@@ -116,159 +116,159 @@
 <span class="sourceLineNo">108</span>      return m_master;<a name="line.108"></a>
 <span class="sourceLineNo">109</span>    }<a name="line.109"></a>
 <span class="sourceLineNo">110</span>    private HMaster m_master;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    // 28, 1<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    public void setServerManager(ServerManager serverManager)<a name="line.112"></a>
+<span class="sourceLineNo">111</span>    // 29, 1<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    public void setAssignmentManager(AssignmentManager assignmentManager)<a name="line.112"></a>
 <span class="sourceLineNo">113</span>    {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      // 28, 1<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      m_serverManager = serverManager;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      m_serverManager__IsNotDefault = true;<a name="line.116"></a>
+<span class="sourceLineNo">114</span>      // 29, 1<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      m_assignmentManager = assignmentManager;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      m_assignmentManager__IsNotDefault = true;<a name="line.116"></a>
 <span class="sourceLineNo">117</span>    }<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    public ServerManager getServerManager()<a name="line.118"></a>
+<span class="sourceLineNo">118</span>    public AssignmentManager getAssignmentManager()<a name="line.118"></a>
 <span class="sourceLineNo">119</span>    {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      return m_serverManager;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>      return m_assignmentManager;<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    private ServerManager m_serverManager;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public boolean getServerManager__IsNotDefault()<a name="line.123"></a>
+<span class="sourceLineNo">122</span>    private AssignmentManager m_assignmentManager;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    public boolean getAssignmentManager__IsNotDefault()<a name="line.123"></a>
 <span class="sourceLineNo">124</span>    {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      return m_serverManager__IsNotDefault;<a name="line.125"></a>
+<span class="sourceLineNo">125</span>      return m_assignmentManager__IsNotDefault;<a name="line.125"></a>
 <span class="sourceLineNo">126</span>    }<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    private boolean m_serverManager__IsNotDefault;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    // 21, 1<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    public void setFrags(Map&lt;String,Integer&gt; frags)<a name="line.129"></a>
+<span class="sourceLineNo">127</span>    private boolean m_assignmentManager__IsNotDefault;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    // 28, 1<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    public void setServerManager(ServerManager serverManager)<a name="line.129"></a>
 <span class="sourceLineNo">130</span>    {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      // 21, 1<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      m_frags = frags;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      m_frags__IsNotDefault = true;<a name="line.133"></a>
+<span class="sourceLineNo">131</span>      // 28, 1<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      m_serverManager = serverManager;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      m_serverManager__IsNotDefault = true;<a name="line.133"></a>
 <span class="sourceLineNo">134</span>    }<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    public Map&lt;String,Integer&gt; getFrags()<a name="line.135"></a>
+<span class="sourceLineNo">135</span>    public ServerManager getServerManager()<a name="line.135"></a>
 <span class="sourceLineNo">136</span>    {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      return m_frags;<a name="line.137"></a>
+<span class="sourceLineNo">137</span>      return m_serverManager;<a name="line.137"></a>
 <span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    private Map&lt;String,Integer&gt; m_frags;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    public boolean getFrags__IsNotDefault()<a name="line.140"></a>
+<span class="sourceLineNo">139</span>    private ServerManager m_serverManager;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    public boolean getServerManager__IsNotDefault()<a name="line.140"></a>
 <span class="sourceLineNo">141</span>    {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return m_frags__IsNotDefault;<a name="line.142"></a>
+<span class="sourceLineNo">142</span>      return m_serverManager__IsNotDefault;<a name="line.142"></a>
 <span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    private boolean m_frags__IsNotDefault;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    // 22, 1<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public void setMetaLocation(ServerName metaLocation)<a name="line.146"></a>
+<span class="sourceLineNo">144</span>    private boolean m_serverManager__IsNotDefault;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    // 24, 1<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    public void setDeadServers(Set&lt;ServerName&gt; deadServers)<a name="line.146"></a>
 <span class="sourceLineNo">147</span>    {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      // 22, 1<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      m_metaLocation = metaLocation;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      m_metaLocation__IsNotDefault = true;<a name="line.150"></a>
+<span class="sourceLineNo">148</span>      // 24, 1<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      m_deadServers = deadServers;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      m_deadServers__IsNotDefault = true;<a name="line.150"></a>
 <span class="sourceLineNo">151</span>    }<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    public ServerName getMetaLocation()<a name="line.152"></a>
+<span class="sourceLineNo">152</span>    public Set&lt;ServerName&gt; getDeadServers()<a name="line.152"></a>
 <span class="sourceLineNo">153</span>    {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      return m_metaLocation;<a name="line.154"></a>
+<span class="sourceLineNo">154</span>      return m_deadServers;<a name="line.154"></a>
 <span class="sourceLineNo">155</span>    }<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    private ServerName m_metaLocation;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    public boolean getMetaLocation__IsNotDefault()<a name="line.157"></a>
+<span class="sourceLineNo">156</span>    private Set&lt;ServerName&gt; m_deadServers;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    public boolean getDeadServers__IsNotDefault()<a name="line.157"></a>
 <span class="sourceLineNo">158</span>    {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      return m_metaLocation__IsNotDefault;<a name="line.159"></a>
+<span class="sourceLineNo">159</span>      return m_deadServers__IsNotDefault;<a name="line.159"></a>
 <span class="sourceLineNo">160</span>    }<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    private boolean m_metaLocation__IsNotDefault;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    // 29, 1<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public void setAssignmentManager(AssignmentManager assignmentManager)<a name="line.163"></a>
+<span class="sourceLineNo">161</span>    private boolean m_deadServers__IsNotDefault;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    // 27, 1<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void setFormat(String format)<a name="line.163"></a>
 <span class="sourceLineNo">164</span>    {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      // 29, 1<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      m_assignmentManager = assignmentManager;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      m_assignmentManager__IsNotDefault = true;<a name="line.167"></a>
+<span class="sourceLineNo">165</span>      // 27, 1<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      m_format = format;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      m_format__IsNotDefault = true;<a name="line.167"></a>
 <span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    public AssignmentManager getAssignmentManager()<a name="line.169"></a>
+<span class="sourceLineNo">169</span>    public String getFormat()<a name="line.169"></a>
 <span class="sourceLineNo">170</span>    {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      return m_assignmentManager;<a name="line.171"></a>
+<span class="sourceLineNo">171</span>      return m_format;<a name="line.171"></a>
 <span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private AssignmentManager m_assignmentManager;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    public boolean getAssignmentManager__IsNotDefault()<a name="line.174"></a>
+<span class="sourceLineNo">173</span>    private String m_format;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    public boolean getFormat__IsNotDefault()<a name="line.174"></a>
 <span class="sourceLineNo">175</span>    {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      return m_assignmentManager__IsNotDefault;<a name="line.176"></a>
+<span class="sourceLineNo">176</span>      return m_format__IsNotDefault;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    private boolean m_assignmentManager__IsNotDefault;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    // 25, 1<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    public void setCatalogJanitorEnabled(boolean catalogJanitorEnabled)<a name="line.180"></a>
+<span class="sourceLineNo">178</span>    private boolean m_format__IsNotDefault;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    // 23, 1<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    public void setServers(List&lt;ServerName&gt; servers)<a name="line.180"></a>
 <span class="sourceLineNo">181</span>    {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      // 25, 1<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      m_catalogJanitorEnabled = catalogJanitorEnabled;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      m_catalogJanitorEnabled__IsNotDefault = true;<a name="line.184"></a>
+<span class="sourceLineNo">182</span>      // 23, 1<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      m_servers = servers;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      m_servers__IsNotDefault = true;<a name="line.184"></a>
 <span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    public boolean getCatalogJanitorEnabled()<a name="line.186"></a>
+<span class="sourceLineNo">186</span>    public List&lt;ServerName&gt; getServers()<a name="line.186"></a>
 <span class="sourceLineNo">187</span>    {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      return m_catalogJanitorEnabled;<a name="line.188"></a>
+<span class="sourceLineNo">188</span>      return m_servers;<a name="line.188"></a>
 <span class="sourceLineNo">189</span>    }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    private boolean m_catalogJanitorEnabled;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    public boolean getCatalogJanitorEnabled__IsNotDefault()<a name="line.191"></a>
+<span class="sourceLineNo">190</span>    private List&lt;ServerName&gt; m_servers;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    public boolean getServers__IsNotDefault()<a name="line.191"></a>
 <span class="sourceLineNo">192</span>    {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      return m_catalogJanitorEnabled__IsNotDefault;<a name="line.193"></a>
+<span class="sourceLineNo">193</span>      return m_servers__IsNotDefault;<a name="line.193"></a>
 <span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    private boolean m_catalogJanitorEnabled__IsNotDefault;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    // 27, 1<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    public void setFormat(String format)<a name="line.197"></a>
+<span class="sourceLineNo">195</span>    private boolean m_servers__IsNotDefault;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    // 22, 1<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void setMetaLocation(ServerName metaLocation)<a name="line.197"></a>
 <span class="sourceLineNo">198</span>    {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      // 27, 1<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      m_format = format;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      m_format__IsNotDefault = true;<a name="line.201"></a>
+<span class="sourceLineNo">199</span>      // 22, 1<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      m_metaLocation = metaLocation;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      m_metaLocation__IsNotDefault = true;<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    }<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    public String getFormat()<a name="line.203"></a>
+<span class="sourceLineNo">203</span>    public ServerName getMetaLocation()<a name="line.203"></a>
 <span class="sourceLineNo">204</span>    {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      return m_format;<a name="line.205"></a>
+<span class="sourceLineNo">205</span>      return m_metaLocation;<a name="line.205"></a>
 <span class="sourceLineNo">206</span>    }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private String m_format;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    public boolean getFormat__IsNotDefault()<a name="line.208"></a>
+<span class="sourceLineNo">207</span>    private ServerName m_metaLocation;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    public boolean getMetaLocation__IsNotDefault()<a name="line.208"></a>
 <span class="sourceLineNo">209</span>    {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      return m_format__IsNotDefault;<a name="line.210"></a>
+<span class="sourceLineNo">210</span>      return m_metaLocation__IsNotDefault;<a name="line.210"></a>
 <span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    private boolean m_format__IsNotDefault;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    // 26, 1<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    public void setFilter(String filter)<a name="line.214"></a>
+<span class="sourceLineNo">212</span>    private boolean m_metaLocation__IsNotDefault;<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    // 21, 1<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    public void setFrags(Map&lt;String,Integer&gt; frags)<a name="line.214"></a>
 <span class="sourceLineNo">215</span>    {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      // 26, 1<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      m_filter = filter;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      m_filter__IsNotDefault = true;<a name="line.218"></a>
+<span class="sourceLineNo">216</span>      // 21, 1<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      m_frags = frags;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      m_frags__IsNotDefault = true;<a name="line.218"></a>
 <span class="sourceLineNo">219</span>    }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    public String getFilter()<a name="line.220"></a>
+<span class="sourceLineNo">220</span>    public Map&lt;String,Integer&gt; getFrags()<a name="line.220"></a>
 <span class="sourceLineNo">221</span>    {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      return m_filter;<a name="line.222"></a>
+<span class="sourceLineNo">222</span>      return m_frags;<a name="line.222"></a>
 <span class="sourceLineNo">223</span>    }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    private String m_filter;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    public boolean getFilter__IsNotDefault()<a name="line.225"></a>
+<span class="sourceLineNo">224</span>    private Map&lt;String,Integer&gt; m_frags;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public boolean getFrags__IsNotDefault()<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return m_filter__IsNotDefault;<a name="line.227"></a>
+<span class="sourceLineNo">227</span>      return m_frags__IsNotDefault;<a name="line.227"></a>
 <span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    private boolean m_filter__IsNotDefault;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    // 24, 1<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    public void setDeadServers(Set&lt;ServerName&gt; deadServers)<a name="line.231"></a>
+<span class="sourceLineNo">229</span>    private boolean m_frags__IsNotDefault;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    // 25, 1<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    public void setCatalogJanitorEnabled(boolean catalogJanitorEnabled)<a name="line.231"></a>
 <span class="sourceLineNo">232</span>    {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      // 24, 1<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      m_deadServers = deadServers;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      m_deadServers__IsNotDefault = true;<a name="line.235"></a>
+<span class="sourceLineNo">233</span>      // 25, 1<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      m_catalogJanitorEnabled = catalogJanitorEnabled;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      m_catalogJanitorEnabled__IsNotDefault = true;<a name="line.235"></a>
 <span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    public Set&lt;ServerName&gt; getDeadServers()<a name="line.237"></a>
+<span class="sourceLineNo">237</span>    public boolean getCatalogJanitorEnabled()<a name="line.237"></a>
 <span class="sourceLineNo">238</span>    {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return m_deadServers;<a name="line.239"></a>
+<span class="sourceLineNo">239</span>      return m_catalogJanitorEnabled;<a name="line.239"></a>
 <span class="sourceLineNo">240</span>    }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    private Set&lt;ServerName&gt; m_deadServers;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    public boolean getDeadServers__IsNotDefault()<a name="line.242"></a>
+<span class="sourceLineNo">241</span>    private boolean m_catalogJanitorEnabled;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    public boolean getCatalogJanitorEnabled__IsNotDefault()<a name="line.242"></a>
 <span class="sourceLineNo">243</span>    {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      return m_deadServers__IsNotDefault;<a name="line.244"></a>
+<span class="sourceLineNo">244</span>      return m_catalogJanitorEnabled__IsNotDefault;<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    private boolean m_deadServers__IsNotDefault;<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    // 23, 1<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public void setServers(List&lt;ServerName&gt; servers)<a name="line.248"></a>
+<span class="sourceLineNo">246</span>    private boolean m_catalogJanitorEnabled__IsNotDefault;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // 26, 1<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    public void setFilter(String filter)<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      // 23, 1<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      m_servers = servers;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      m_servers__IsNotDefault = true;<a name="line.252"></a>
+<span class="sourceLineNo">250</span>      // 26, 1<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      m_filter = filter;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      m_filter__IsNotDefault = true;<a name="line.252"></a>
 <span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public List&lt;ServerName&gt; getServers()<a name="line.254"></a>
+<span class="sourceLineNo">254</span>    public String getFilter()<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      return m_servers;<a name="line.256"></a>
+<span class="sourceLineNo">256</span>      return m_filter;<a name="line.256"></a>
 <span class="sourceLineNo">257</span>    }<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    private List&lt;ServerName&gt; m_servers;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    public boolean getServers__IsNotDefault()<a name="line.259"></a>
+<span class="sourceLineNo">258</span>    private String m_filter;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    public boolean getFilter__IsNotDefault()<a name="line.259"></a>
 <span class="sourceLineNo">260</span>    {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      return m_servers__IsNotDefault;<a name="line.261"></a>
+<span class="sourceLineNo">261</span>      return m_filter__IsNotDefault;<a name="line.261"></a>
 <span class="sourceLineNo">262</span>    }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    private boolean m_servers__IsNotDefault;<a name="line.263"></a>
+<span class="sourceLineNo">263</span>    private boolean m_filter__IsNotDefault;<a name="line.263"></a>
 <span class="sourceLineNo">264</span>  }<a name="line.264"></a>
 <span class="sourceLineNo">265</span>  @Override<a name="line.265"></a>
 <span class="sourceLineNo">266</span>  protected org.jamon.AbstractTemplateProxy.ImplData makeImplData()<a name="line.266"></a>
@@ -280,66 +280,66 @@
 <span class="sourceLineNo">272</span>    return (ImplData) super.getImplData();<a name="line.272"></a>
 <span class="sourceLineNo">273</span>  }<a name="line.273"></a>
 <span class="sourceLineNo">274</span>  <a name="line.274"></a>
-<span class="sourceLineNo">275</span>  protected ServerManager serverManager;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServerManager(ServerManager p_serverManager)<a name="line.276"></a>
+<span class="sourceLineNo">275</span>  protected AssignmentManager assignmentManager;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setAssignmentManager(AssignmentManager p_assignmentManager)<a name="line.276"></a>
 <span class="sourceLineNo">277</span>  {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    (getImplData()).setServerManager(p_serverManager);<a name="line.278"></a>
+<span class="sourceLineNo">278</span>    (getImplData()).setAssignmentManager(p_assignmentManager);<a name="line.278"></a>
 <span class="sourceLineNo">279</span>    return this;<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>  protected Map&lt;String,Integer&gt; frags;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFrags(Map&lt;String,Integer&gt; p_frags)<a name="line.283"></a>
+<span class="sourceLineNo">282</span>  protected ServerManager serverManager;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServerManager(ServerManager p_serverManager)<a name="line.283"></a>
 <span class="sourceLineNo">284</span>  {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    (getImplData()).setFrags(p_frags);<a name="line.285"></a>
+<span class="sourceLineNo">285</span>    (getImplData()).setServerManager(p_serverManager);<a name="line.285"></a>
 <span class="sourceLineNo">286</span>    return this;<a name="line.286"></a>
 <span class="sourceLineNo">287</span>  }<a name="line.287"></a>
 <span class="sourceLineNo">288</span>  <a name="line.288"></a>
-<span class="sourceLineNo">289</span>  protected ServerName metaLocation;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setMetaLocation(ServerName p_metaLocation)<a name="line.290"></a>
+<span class="sourceLineNo">289</span>  protected Set&lt;ServerName&gt; deadServers;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setDeadServers(Set&lt;ServerName&gt; p_deadServers)<a name="line.290"></a>
 <span class="sourceLineNo">291</span>  {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    (getImplData()).setMetaLocation(p_metaLocation);<a name="line.292"></a>
+<span class="sourceLineNo">292</span>    (getImplData()).setDeadServers(p_deadServers);<a name="line.292"></a>
 <span class="sourceLineNo">293</span>    return this;<a name="line.293"></a>
 <span class="sourceLineNo">294</span>  }<a name="line.294"></a>
 <span class="sourceLineNo">295</span>  <a name="line.295"></a>
-<span class="sourceLineNo">296</span>  protected AssignmentManager assignmentManager;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setAssignmentManager(AssignmentManager p_assignmentManager)<a name="line.297"></a>
+<span class="sourceLineNo">296</span>  protected String format;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFormat(String p_format)<a name="line.297"></a>
 <span class="sourceLineNo">298</span>  {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    (getImplData()).setAssignmentManager(p_assignmentManager);<a name="line.299"></a>
+<span class="sourceLineNo">299</span>    (getImplData()).setFormat(p_format);<a name="line.299"></a>
 <span class="sourceLineNo">300</span>    return this;<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>  protected boolean catalogJanitorEnabled;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setCatalogJanitorEnabled(boolean p_catalogJanitorEnabled)<a name="line.304"></a>
+<span class="sourceLineNo">303</span>  protected List&lt;ServerName&gt; servers;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServers(List&lt;ServerName&gt; p_servers)<a name="line.304"></a>
 <span class="sourceLineNo">305</span>  {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    (getImplData()).setCatalogJanitorEnabled(p_catalogJanitorEnabled);<a name="line.306"></a>
+<span class="sourceLineNo">306</span>    (getImplData()).setServers(p_servers);<a name="line.306"></a>
 <span class="sourceLineNo">307</span>    return this;<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>  protected String format;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFormat(String p_format)<a name="line.311"></a>
+<span class="sourceLineNo">310</span>  protected ServerName metaLocation;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setMetaLocation(ServerName p_metaLocation)<a name="line.311"></a>
 <span class="sourceLineNo">312</span>  {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    (getImplData()).setFormat(p_format);<a name="line.313"></a>
+<span class="sourceLineNo">313</span>    (getImplData()).setMetaLocation(p_metaLocation);<a name="line.313"></a>
 <span class="sourceLineNo">314</span>    return this;<a name="line.314"></a>
 <span class="sourceLineNo">315</span>  }<a name="line.315"></a>
 <span class="sourceLineNo">316</span>  <a name="line.316"></a>
-<span class="sourceLineNo">317</span>  protected String filter;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFilter(String p_filter)<a name="line.318"></a>
+<span class="sourceLineNo">317</span>  protected Map&lt;String,Integer&gt; frags;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFrags(Map&lt;String,Integer&gt; p_frags)<a name="line.318"></a>
 <span class="sourceLineNo">319</span>  {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    (getImplData()).setFilter(p_filter);<a name="line.320"></a>
+<span class="sourceLineNo">320</span>    (getImplData()).setFrags(p_frags);<a name="line.320"></a>
 <span class="sourceLineNo">321</span>    return this;<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>  protected Set&lt;ServerName&gt; deadServers;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setDeadServers(Set&lt;ServerName&gt; p_deadServers)<a name="line.325"></a>
+<span class="sourceLineNo">324</span>  protected boolean catalogJanitorEnabled;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setCatalogJanitorEnabled(boolean p_catalogJanitorEnabled)<a name="line.325"></a>
 <span class="sourceLineNo">326</span>  {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    (getImplData()).setDeadServers(p_deadServers);<a name="line.327"></a>
+<span class="sourceLineNo">327</span>    (getImplData()).setCatalogJanitorEnabled(p_catalogJanitorEnabled);<a name="line.327"></a>
 <span class="sourceLineNo">328</span>    return this;<a name="line.328"></a>
 <span class="sourceLineNo">329</span>  }<a name="line.329"></a>
 <span class="sourceLineNo">330</span>  <a name="line.330"></a>
-<span class="sourceLineNo">331</span>  protected List&lt;ServerName&gt; servers;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServers(List&lt;ServerName&gt; p_servers)<a name="line.332"></a>
+<span class="sourceLineNo">331</span>  protected String filter;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFilter(String p_filter)<a name="line.332"></a>
 <span class="sourceLineNo">333</span>  {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    (getImplData()).setServers(p_servers);<a name="line.334"></a>
+<span class="sourceLineNo">334</span>    (getImplData()).setFilter(p_filter);<a name="line.334"></a>
 <span class="sourceLineNo">335</span>    return this;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>  }<a name="line.336"></a>
 <span class="sourceLineNo">337</span>  <a name="line.337"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
index 605e9f5..c719c8a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
@@ -67,15 +67,15 @@
 <span class="sourceLineNo">059</span>  requiredArguments = {<a name="line.59"></a>
 <span class="sourceLineNo">060</span>    @org.jamon.annotations.Argument(name = "master", type = "HMaster")},<a name="line.60"></a>
 <span class="sourceLineNo">061</span>  optionalArguments = {<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    @org.jamon.annotations.Argument(name = "serverManager", type = "ServerManager"),<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    @org.jamon.annotations.Argument(name = "frags", type = "Map&lt;String,Integer&gt;"),<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    @org.jamon.annotations.Argument(name = "metaLocation", type = "ServerName"),<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    @org.jamon.annotations.Argument(name = "assignmentManager", type = "AssignmentManager"),<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    @org.jamon.annotations.Argument(name = "catalogJanitorEnabled", type = "boolean"),<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    @org.jamon.annotations.Argument(name = "filter", type = "String"),<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    @org.jamon.annotations.Argument(name = "deadServers", type = "Set&lt;ServerName&gt;"),<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    @org.jamon.annotations.Argument(name = "servers", type = "List&lt;ServerName&gt;")})<a name="line.70"></a>
+<span class="sourceLineNo">062</span>    @org.jamon.annotations.Argument(name = "assignmentManager", type = "AssignmentManager"),<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    @org.jamon.annotations.Argument(name = "serverManager", type = "ServerManager"),<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    @org.jamon.annotations.Argument(name = "deadServers", type = "Set&lt;ServerName&gt;"),<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    @org.jamon.annotations.Argument(name = "servers", type = "List&lt;ServerName&gt;"),<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    @org.jamon.annotations.Argument(name = "metaLocation", type = "ServerName"),<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    @org.jamon.annotations.Argument(name = "frags", type = "Map&lt;String,Integer&gt;"),<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    @org.jamon.annotations.Argument(name = "catalogJanitorEnabled", type = "boolean"),<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    @org.jamon.annotations.Argument(name = "filter", type = "String")})<a name="line.70"></a>
 <span class="sourceLineNo">071</span>public class MasterStatusTmpl<a name="line.71"></a>
 <span class="sourceLineNo">072</span>  extends org.jamon.AbstractTemplateProxy<a name="line.72"></a>
 <span class="sourceLineNo">073</span>{<a name="line.73"></a>
@@ -116,159 +116,159 @@
 <span class="sourceLineNo">108</span>      return m_master;<a name="line.108"></a>
 <span class="sourceLineNo">109</span>    }<a name="line.109"></a>
 <span class="sourceLineNo">110</span>    private HMaster m_master;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    // 28, 1<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    public void setServerManager(ServerManager serverManager)<a name="line.112"></a>
+<span class="sourceLineNo">111</span>    // 29, 1<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    public void setAssignmentManager(AssignmentManager assignmentManager)<a name="line.112"></a>
 <span class="sourceLineNo">113</span>    {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      // 28, 1<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      m_serverManager = serverManager;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      m_serverManager__IsNotDefault = true;<a name="line.116"></a>
+<span class="sourceLineNo">114</span>      // 29, 1<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      m_assignmentManager = assignmentManager;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      m_assignmentManager__IsNotDefault = true;<a name="line.116"></a>
 <span class="sourceLineNo">117</span>    }<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    public ServerManager getServerManager()<a name="line.118"></a>
+<span class="sourceLineNo">118</span>    public AssignmentManager getAssignmentManager()<a name="line.118"></a>
 <span class="sourceLineNo">119</span>    {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      return m_serverManager;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>      return m_assignmentManager;<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    private ServerManager m_serverManager;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public boolean getServerManager__IsNotDefault()<a name="line.123"></a>
+<span class="sourceLineNo">122</span>    private AssignmentManager m_assignmentManager;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    public boolean getAssignmentManager__IsNotDefault()<a name="line.123"></a>
 <span class="sourceLineNo">124</span>    {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      return m_serverManager__IsNotDefault;<a name="line.125"></a>
+<span class="sourceLineNo">125</span>      return m_assignmentManager__IsNotDefault;<a name="line.125"></a>
 <span class="sourceLineNo">126</span>    }<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    private boolean m_serverManager__IsNotDefault;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    // 21, 1<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    public void setFrags(Map&lt;String,Integer&gt; frags)<a name="line.129"></a>
+<span class="sourceLineNo">127</span>    private boolean m_assignmentManager__IsNotDefault;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    // 28, 1<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    public void setServerManager(ServerManager serverManager)<a name="line.129"></a>
 <span class="sourceLineNo">130</span>    {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      // 21, 1<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      m_frags = frags;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      m_frags__IsNotDefault = true;<a name="line.133"></a>
+<span class="sourceLineNo">131</span>      // 28, 1<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      m_serverManager = serverManager;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      m_serverManager__IsNotDefault = true;<a name="line.133"></a>
 <span class="sourceLineNo">134</span>    }<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    public Map&lt;String,Integer&gt; getFrags()<a name="line.135"></a>
+<span class="sourceLineNo">135</span>    public ServerManager getServerManager()<a name="line.135"></a>
 <span class="sourceLineNo">136</span>    {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      return m_frags;<a name="line.137"></a>
+<span class="sourceLineNo">137</span>      return m_serverManager;<a name="line.137"></a>
 <span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    private Map&lt;String,Integer&gt; m_frags;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    public boolean getFrags__IsNotDefault()<a name="line.140"></a>
+<span class="sourceLineNo">139</span>    private ServerManager m_serverManager;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    public boolean getServerManager__IsNotDefault()<a name="line.140"></a>
 <span class="sourceLineNo">141</span>    {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return m_frags__IsNotDefault;<a name="line.142"></a>
+<span class="sourceLineNo">142</span>      return m_serverManager__IsNotDefault;<a name="line.142"></a>
 <span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    private boolean m_frags__IsNotDefault;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    // 22, 1<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public void setMetaLocation(ServerName metaLocation)<a name="line.146"></a>
+<span class="sourceLineNo">144</span>    private boolean m_serverManager__IsNotDefault;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    // 24, 1<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    public void setDeadServers(Set&lt;ServerName&gt; deadServers)<a name="line.146"></a>
 <span class="sourceLineNo">147</span>    {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      // 22, 1<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      m_metaLocation = metaLocation;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      m_metaLocation__IsNotDefault = true;<a name="line.150"></a>
+<span class="sourceLineNo">148</span>      // 24, 1<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      m_deadServers = deadServers;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      m_deadServers__IsNotDefault = true;<a name="line.150"></a>
 <span class="sourceLineNo">151</span>    }<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    public ServerName getMetaLocation()<a name="line.152"></a>
+<span class="sourceLineNo">152</span>    public Set&lt;ServerName&gt; getDeadServers()<a name="line.152"></a>
 <span class="sourceLineNo">153</span>    {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      return m_metaLocation;<a name="line.154"></a>
+<span class="sourceLineNo">154</span>      return m_deadServers;<a name="line.154"></a>
 <span class="sourceLineNo">155</span>    }<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    private ServerName m_metaLocation;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    public boolean getMetaLocation__IsNotDefault()<a name="line.157"></a>
+<span class="sourceLineNo">156</span>    private Set&lt;ServerName&gt; m_deadServers;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    public boolean getDeadServers__IsNotDefault()<a name="line.157"></a>
 <span class="sourceLineNo">158</span>    {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      return m_metaLocation__IsNotDefault;<a name="line.159"></a>
+<span class="sourceLineNo">159</span>      return m_deadServers__IsNotDefault;<a name="line.159"></a>
 <span class="sourceLineNo">160</span>    }<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    private boolean m_metaLocation__IsNotDefault;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    // 29, 1<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public void setAssignmentManager(AssignmentManager assignmentManager)<a name="line.163"></a>
+<span class="sourceLineNo">161</span>    private boolean m_deadServers__IsNotDefault;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    // 27, 1<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void setFormat(String format)<a name="line.163"></a>
 <span class="sourceLineNo">164</span>    {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      // 29, 1<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      m_assignmentManager = assignmentManager;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      m_assignmentManager__IsNotDefault = true;<a name="line.167"></a>
+<span class="sourceLineNo">165</span>      // 27, 1<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      m_format = format;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      m_format__IsNotDefault = true;<a name="line.167"></a>
 <span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    public AssignmentManager getAssignmentManager()<a name="line.169"></a>
+<span class="sourceLineNo">169</span>    public String getFormat()<a name="line.169"></a>
 <span class="sourceLineNo">170</span>    {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      return m_assignmentManager;<a name="line.171"></a>
+<span class="sourceLineNo">171</span>      return m_format;<a name="line.171"></a>
 <span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private AssignmentManager m_assignmentManager;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    public boolean getAssignmentManager__IsNotDefault()<a name="line.174"></a>
+<span class="sourceLineNo">173</span>    private String m_format;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    public boolean getFormat__IsNotDefault()<a name="line.174"></a>
 <span class="sourceLineNo">175</span>    {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      return m_assignmentManager__IsNotDefault;<a name="line.176"></a>
+<span class="sourceLineNo">176</span>      return m_format__IsNotDefault;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    private boolean m_assignmentManager__IsNotDefault;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    // 25, 1<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    public void setCatalogJanitorEnabled(boolean catalogJanitorEnabled)<a name="line.180"></a>
+<span class="sourceLineNo">178</span>    private boolean m_format__IsNotDefault;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    // 23, 1<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    public void setServers(List&lt;ServerName&gt; servers)<a name="line.180"></a>
 <span class="sourceLineNo">181</span>    {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      // 25, 1<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      m_catalogJanitorEnabled = catalogJanitorEnabled;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      m_catalogJanitorEnabled__IsNotDefault = true;<a name="line.184"></a>
+<span class="sourceLineNo">182</span>      // 23, 1<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      m_servers = servers;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      m_servers__IsNotDefault = true;<a name="line.184"></a>
 <span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    public boolean getCatalogJanitorEnabled()<a name="line.186"></a>
+<span class="sourceLineNo">186</span>    public List&lt;ServerName&gt; getServers()<a name="line.186"></a>
 <span class="sourceLineNo">187</span>    {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      return m_catalogJanitorEnabled;<a name="line.188"></a>
+<span class="sourceLineNo">188</span>      return m_servers;<a name="line.188"></a>
 <span class="sourceLineNo">189</span>    }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    private boolean m_catalogJanitorEnabled;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    public boolean getCatalogJanitorEnabled__IsNotDefault()<a name="line.191"></a>
+<span class="sourceLineNo">190</span>    private List&lt;ServerName&gt; m_servers;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    public boolean getServers__IsNotDefault()<a name="line.191"></a>
 <span class="sourceLineNo">192</span>    {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      return m_catalogJanitorEnabled__IsNotDefault;<a name="line.193"></a>
+<span class="sourceLineNo">193</span>      return m_servers__IsNotDefault;<a name="line.193"></a>
 <span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    private boolean m_catalogJanitorEnabled__IsNotDefault;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    // 27, 1<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    public void setFormat(String format)<a name="line.197"></a>
+<span class="sourceLineNo">195</span>    private boolean m_servers__IsNotDefault;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    // 22, 1<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void setMetaLocation(ServerName metaLocation)<a name="line.197"></a>
 <span class="sourceLineNo">198</span>    {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      // 27, 1<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      m_format = format;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      m_format__IsNotDefault = true;<a name="line.201"></a>
+<span class="sourceLineNo">199</span>      // 22, 1<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      m_metaLocation = metaLocation;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      m_metaLocation__IsNotDefault = true;<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    }<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    public String getFormat()<a name="line.203"></a>
+<span class="sourceLineNo">203</span>    public ServerName getMetaLocation()<a name="line.203"></a>
 <span class="sourceLineNo">204</span>    {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      return m_format;<a name="line.205"></a>
+<span class="sourceLineNo">205</span>      return m_metaLocation;<a name="line.205"></a>
 <span class="sourceLineNo">206</span>    }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private String m_format;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    public boolean getFormat__IsNotDefault()<a name="line.208"></a>
+<span class="sourceLineNo">207</span>    private ServerName m_metaLocation;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    public boolean getMetaLocation__IsNotDefault()<a name="line.208"></a>
 <span class="sourceLineNo">209</span>    {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      return m_format__IsNotDefault;<a name="line.210"></a>
+<span class="sourceLineNo">210</span>      return m_metaLocation__IsNotDefault;<a name="line.210"></a>
 <span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    private boolean m_format__IsNotDefault;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    // 26, 1<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    public void setFilter(String filter)<a name="line.214"></a>
+<span class="sourceLineNo">212</span>    private boolean m_metaLocation__IsNotDefault;<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    // 21, 1<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    public void setFrags(Map&lt;String,Integer&gt; frags)<a name="line.214"></a>
 <span class="sourceLineNo">215</span>    {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      // 26, 1<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      m_filter = filter;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      m_filter__IsNotDefault = true;<a name="line.218"></a>
+<span class="sourceLineNo">216</span>      // 21, 1<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      m_frags = frags;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      m_frags__IsNotDefault = true;<a name="line.218"></a>
 <span class="sourceLineNo">219</span>    }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    public String getFilter()<a name="line.220"></a>
+<span class="sourceLineNo">220</span>    public Map&lt;String,Integer&gt; getFrags()<a name="line.220"></a>
 <span class="sourceLineNo">221</span>    {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      return m_filter;<a name="line.222"></a>
+<span class="sourceLineNo">222</span>      return m_frags;<a name="line.222"></a>
 <span class="sourceLineNo">223</span>    }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    private String m_filter;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    public boolean getFilter__IsNotDefault()<a name="line.225"></a>
+<span class="sourceLineNo">224</span>    private Map&lt;String,Integer&gt; m_frags;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public boolean getFrags__IsNotDefault()<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return m_filter__IsNotDefault;<a name="line.227"></a>
+<span class="sourceLineNo">227</span>      return m_frags__IsNotDefault;<a name="line.227"></a>
 <span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    private boolean m_filter__IsNotDefault;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    // 24, 1<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    public void setDeadServers(Set&lt;ServerName&gt; deadServers)<a name="line.231"></a>
+<span class="sourceLineNo">229</span>    private boolean m_frags__IsNotDefault;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    // 25, 1<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    public void setCatalogJanitorEnabled(boolean catalogJanitorEnabled)<a name="line.231"></a>
 <span class="sourceLineNo">232</span>    {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      // 24, 1<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      m_deadServers = deadServers;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      m_deadServers__IsNotDefault = true;<a name="line.235"></a>
+<span class="sourceLineNo">233</span>      // 25, 1<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      m_catalogJanitorEnabled = catalogJanitorEnabled;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      m_catalogJanitorEnabled__IsNotDefault = true;<a name="line.235"></a>
 <span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    public Set&lt;ServerName&gt; getDeadServers()<a name="line.237"></a>
+<span class="sourceLineNo">237</span>    public boolean getCatalogJanitorEnabled()<a name="line.237"></a>
 <span class="sourceLineNo">238</span>    {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return m_deadServers;<a name="line.239"></a>
+<span class="sourceLineNo">239</span>      return m_catalogJanitorEnabled;<a name="line.239"></a>
 <span class="sourceLineNo">240</span>    }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    private Set&lt;ServerName&gt; m_deadServers;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    public boolean getDeadServers__IsNotDefault()<a name="line.242"></a>
+<span class="sourceLineNo">241</span>    private boolean m_catalogJanitorEnabled;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    public boolean getCatalogJanitorEnabled__IsNotDefault()<a name="line.242"></a>
 <span class="sourceLineNo">243</span>    {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      return m_deadServers__IsNotDefault;<a name="line.244"></a>
+<span class="sourceLineNo">244</span>      return m_catalogJanitorEnabled__IsNotDefault;<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    private boolean m_deadServers__IsNotDefault;<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    // 23, 1<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public void setServers(List&lt;ServerName&gt; servers)<a name="line.248"></a>
+<span class="sourceLineNo">246</span>    private boolean m_catalogJanitorEnabled__IsNotDefault;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // 26, 1<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    public void setFilter(String filter)<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      // 23, 1<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      m_servers = servers;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      m_servers__IsNotDefault = true;<a name="line.252"></a>
+<span class="sourceLineNo">250</span>      // 26, 1<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      m_filter = filter;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      m_filter__IsNotDefault = true;<a name="line.252"></a>
 <span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public List&lt;ServerName&gt; getServers()<a name="line.254"></a>
+<span class="sourceLineNo">254</span>    public String getFilter()<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      return m_servers;<a name="line.256"></a>
+<span class="sourceLineNo">256</span>      return m_filter;<a name="line.256"></a>
 <span class="sourceLineNo">257</span>    }<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    private List&lt;ServerName&gt; m_servers;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    public boolean getServers__IsNotDefault()<a name="line.259"></a>
+<span class="sourceLineNo">258</span>    private String m_filter;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    public boolean getFilter__IsNotDefault()<a name="line.259"></a>
 <span class="sourceLineNo">260</span>    {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      return m_servers__IsNotDefault;<a name="line.261"></a>
+<span class="sourceLineNo">261</span>      return m_filter__IsNotDefault;<a name="line.261"></a>
 <span class="sourceLineNo">262</span>    }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    private boolean m_servers__IsNotDefault;<a name="line.263"></a>
+<span class="sourceLineNo">263</span>    private boolean m_filter__IsNotDefault;<a name="line.263"></a>
 <span class="sourceLineNo">264</span>  }<a name="line.264"></a>
 <span class="sourceLineNo">265</span>  @Override<a name="line.265"></a>
 <span class="sourceLineNo">266</span>  protected org.jamon.AbstractTemplateProxy.ImplData makeImplData()<a name="line.266"></a>
@@ -280,66 +280,66 @@
 <span class="sourceLineNo">272</span>    return (ImplData) super.getImplData();<a name="line.272"></a>
 <span class="sourceLineNo">273</span>  }<a name="line.273"></a>
 <span class="sourceLineNo">274</span>  <a name="line.274"></a>
-<span class="sourceLineNo">275</span>  protected ServerManager serverManager;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServerManager(ServerManager p_serverManager)<a name="line.276"></a>
+<span class="sourceLineNo">275</span>  protected AssignmentManager assignmentManager;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setAssignmentManager(AssignmentManager p_assignmentManager)<a name="line.276"></a>
 <span class="sourceLineNo">277</span>  {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    (getImplData()).setServerManager(p_serverManager);<a name="line.278"></a>
+<span class="sourceLineNo">278</span>    (getImplData()).setAssignmentManager(p_assignmentManager);<a name="line.278"></a>
 <span class="sourceLineNo">279</span>    return this;<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>  protected Map&lt;String,Integer&gt; frags;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFrags(Map&lt;String,Integer&gt; p_frags)<a name="line.283"></a>
+<span class="sourceLineNo">282</span>  protected ServerManager serverManager;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServerManager(ServerManager p_serverManager)<a name="line.283"></a>
 <span class="sourceLineNo">284</span>  {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    (getImplData()).setFrags(p_frags);<a name="line.285"></a>
+<span class="sourceLineNo">285</span>    (getImplData()).setServerManager(p_serverManager);<a name="line.285"></a>
 <span class="sourceLineNo">286</span>    return this;<a name="line.286"></a>
 <span class="sourceLineNo">287</span>  }<a name="line.287"></a>
 <span class="sourceLineNo">288</span>  <a name="line.288"></a>
-<span class="sourceLineNo">289</span>  protected ServerName metaLocation;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setMetaLocation(ServerName p_metaLocation)<a name="line.290"></a>
+<span class="sourceLineNo">289</span>  protected Set&lt;ServerName&gt; deadServers;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setDeadServers(Set&lt;ServerName&gt; p_deadServers)<a name="line.290"></a>
 <span class="sourceLineNo">291</span>  {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    (getImplData()).setMetaLocation(p_metaLocation);<a name="line.292"></a>
+<span class="sourceLineNo">292</span>    (getImplData()).setDeadServers(p_deadServers);<a name="line.292"></a>
 <span class="sourceLineNo">293</span>    return this;<a name="line.293"></a>
 <span class="sourceLineNo">294</span>  }<a name="line.294"></a>
 <span class="sourceLineNo">295</span>  <a name="line.295"></a>
-<span class="sourceLineNo">296</span>  protected AssignmentManager assignmentManager;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setAssignmentManager(AssignmentManager p_assignmentManager)<a name="line.297"></a>
+<span class="sourceLineNo">296</span>  protected String format;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFormat(String p_format)<a name="line.297"></a>
 <span class="sourceLineNo">298</span>  {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    (getImplData()).setAssignmentManager(p_assignmentManager);<a name="line.299"></a>
+<span class="sourceLineNo">299</span>    (getImplData()).setFormat(p_format);<a name="line.299"></a>
 <span class="sourceLineNo">300</span>    return this;<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>  protected boolean catalogJanitorEnabled;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setCatalogJanitorEnabled(boolean p_catalogJanitorEnabled)<a name="line.304"></a>
+<span class="sourceLineNo">303</span>  protected List&lt;ServerName&gt; servers;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServers(List&lt;ServerName&gt; p_servers)<a name="line.304"></a>
 <span class="sourceLineNo">305</span>  {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    (getImplData()).setCatalogJanitorEnabled(p_catalogJanitorEnabled);<a name="line.306"></a>
+<span class="sourceLineNo">306</span>    (getImplData()).setServers(p_servers);<a name="line.306"></a>
 <span class="sourceLineNo">307</span>    return this;<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>  protected String format;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFormat(String p_format)<a name="line.311"></a>
+<span class="sourceLineNo">310</span>  protected ServerName metaLocation;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setMetaLocation(ServerName p_metaLocation)<a name="line.311"></a>
 <span class="sourceLineNo">312</span>  {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    (getImplData()).setFormat(p_format);<a name="line.313"></a>
+<span class="sourceLineNo">313</span>    (getImplData()).setMetaLocation(p_metaLocation);<a name="line.313"></a>
 <span class="sourceLineNo">314</span>    return this;<a name="line.314"></a>
 <span class="sourceLineNo">315</span>  }<a name="line.315"></a>
 <span class="sourceLineNo">316</span>  <a name="line.316"></a>
-<span class="sourceLineNo">317</span>  protected String filter;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFilter(String p_filter)<a name="line.318"></a>
+<span class="sourceLineNo">317</span>  protected Map&lt;String,Integer&gt; frags;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFrags(Map&lt;String,Integer&gt; p_frags)<a name="line.318"></a>
 <span class="sourceLineNo">319</span>  {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    (getImplData()).setFilter(p_filter);<a name="line.320"></a>
+<span class="sourceLineNo">320</span>    (getImplData()).setFrags(p_frags);<a name="line.320"></a>
 <span class="sourceLineNo">321</span>    return this;<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>  protected Set&lt;ServerName&gt; deadServers;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setDeadServers(Set&lt;ServerName&gt; p_deadServers)<a name="line.325"></a>
+<span class="sourceLineNo">324</span>  protected boolean catalogJanitorEnabled;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setCatalogJanitorEnabled(boolean p_catalogJanitorEnabled)<a name="line.325"></a>
 <span class="sourceLineNo">326</span>  {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    (getImplData()).setDeadServers(p_deadServers);<a name="line.327"></a>
+<span class="sourceLineNo">327</span>    (getImplData()).setCatalogJanitorEnabled(p_catalogJanitorEnabled);<a name="line.327"></a>
 <span class="sourceLineNo">328</span>    return this;<a name="line.328"></a>
 <span class="sourceLineNo">329</span>  }<a name="line.329"></a>
 <span class="sourceLineNo">330</span>  <a name="line.330"></a>
-<span class="sourceLineNo">331</span>  protected List&lt;ServerName&gt; servers;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServers(List&lt;ServerName&gt; p_servers)<a name="line.332"></a>
+<span class="sourceLineNo">331</span>  protected String filter;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFilter(String p_filter)<a name="line.332"></a>
 <span class="sourceLineNo">333</span>  {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    (getImplData()).setServers(p_servers);<a name="line.334"></a>
+<span class="sourceLineNo">334</span>    (getImplData()).setFilter(p_filter);<a name="line.334"></a>
 <span class="sourceLineNo">335</span>    return this;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>  }<a name="line.336"></a>
 <span class="sourceLineNo">337</span>  <a name="line.337"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
index 66485b5..de32052 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
@@ -68,15 +68,15 @@
 <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>  private final HMaster master;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>  private final ServerManager serverManager;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private final Map&lt;String,Integer&gt; frags;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  private final ServerName metaLocation;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  private final AssignmentManager assignmentManager;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>  private final boolean catalogJanitorEnabled;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  private final String format;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  private final String filter;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>  private final Set&lt;ServerName&gt; deadServers;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private final List&lt;ServerName&gt; servers;<a name="line.71"></a>
+<span class="sourceLineNo">063</span>  private final AssignmentManager assignmentManager;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>  private final ServerManager serverManager;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>  private final Set&lt;ServerName&gt; deadServers;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  private final String format;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  private final List&lt;ServerName&gt; servers;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  private final ServerName metaLocation;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  private final Map&lt;String,Integer&gt; frags;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  private final boolean catalogJanitorEnabled;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  private final String filter;<a name="line.71"></a>
 <span class="sourceLineNo">072</span>  // 68, 1<a name="line.72"></a>
 <span class="sourceLineNo">073</span>  <a name="line.73"></a>
 <span class="sourceLineNo">074</span>  public String formatZKString() {<a name="line.74"></a>
@@ -106,41 +106,41 @@
 <span class="sourceLineNo">098</span><a name="line.98"></a>
 <span class="sourceLineNo">099</span>  protected static org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.ImplData __jamon_setOptionalArguments(org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.ImplData p_implData)<a name="line.99"></a>
 <span class="sourceLineNo">100</span>  {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    if(! p_implData.getServerManager__IsNotDefault())<a name="line.101"></a>
+<span class="sourceLineNo">101</span>    if(! p_implData.getAssignmentManager__IsNotDefault())<a name="line.101"></a>
 <span class="sourceLineNo">102</span>    {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      p_implData.setServerManager(null);<a name="line.103"></a>
+<span class="sourceLineNo">103</span>      p_implData.setAssignmentManager(null);<a name="line.103"></a>
 <span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    if(! p_implData.getFrags__IsNotDefault())<a name="line.105"></a>
+<span class="sourceLineNo">105</span>    if(! p_implData.getServerManager__IsNotDefault())<a name="line.105"></a>
 <span class="sourceLineNo">106</span>    {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      p_implData.setFrags(null);<a name="line.107"></a>
+<span class="sourceLineNo">107</span>      p_implData.setServerManager(null);<a name="line.107"></a>
 <span class="sourceLineNo">108</span>    }<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    if(! p_implData.getMetaLocation__IsNotDefault())<a name="line.109"></a>
+<span class="sourceLineNo">109</span>    if(! p_implData.getDeadServers__IsNotDefault())<a name="line.109"></a>
 <span class="sourceLineNo">110</span>    {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>      p_implData.setMetaLocation(null);<a name="line.111"></a>
+<span class="sourceLineNo">111</span>      p_implData.setDeadServers(null);<a name="line.111"></a>
 <span class="sourceLineNo">112</span>    }<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    if(! p_implData.getAssignmentManager__IsNotDefault())<a name="line.113"></a>
+<span class="sourceLineNo">113</span>    if(! p_implData.getFormat__IsNotDefault())<a name="line.113"></a>
 <span class="sourceLineNo">114</span>    {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      p_implData.setAssignmentManager(null);<a name="line.115"></a>
+<span class="sourceLineNo">115</span>      p_implData.setFormat("html");<a name="line.115"></a>
 <span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    if(! p_implData.getCatalogJanitorEnabled__IsNotDefault())<a name="line.117"></a>
+<span class="sourceLineNo">117</span>    if(! p_implData.getServers__IsNotDefault())<a name="line.117"></a>
 <span class="sourceLineNo">118</span>    {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      p_implData.setCatalogJanitorEnabled(true);<a name="line.119"></a>
+<span class="sourceLineNo">119</span>      p_implData.setServers(null);<a name="line.119"></a>
 <span class="sourceLineNo">120</span>    }<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    if(! p_implData.getFormat__IsNotDefault())<a name="line.121"></a>
+<span class="sourceLineNo">121</span>    if(! p_implData.getMetaLocation__IsNotDefault())<a name="line.121"></a>
 <span class="sourceLineNo">122</span>    {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      p_implData.setFormat("html");<a name="line.123"></a>
+<span class="sourceLineNo">123</span>      p_implData.setMetaLocation(null);<a name="line.123"></a>
 <span class="sourceLineNo">124</span>    }<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    if(! p_implData.getFilter__IsNotDefault())<a name="line.125"></a>
+<span class="sourceLineNo">125</span>    if(! p_implData.getFrags__IsNotDefault())<a name="line.125"></a>
 <span class="sourceLineNo">126</span>    {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      p_implData.setFilter("general");<a name="line.127"></a>
+<span class="sourceLineNo">127</span>      p_implData.setFrags(null);<a name="line.127"></a>
 <span class="sourceLineNo">128</span>    }<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    if(! p_implData.getDeadServers__IsNotDefault())<a name="line.129"></a>
+<span class="sourceLineNo">129</span>    if(! p_implData.getCatalogJanitorEnabled__IsNotDefault())<a name="line.129"></a>
 <span class="sourceLineNo">130</span>    {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      p_implData.setDeadServers(null);<a name="line.131"></a>
+<span class="sourceLineNo">131</span>      p_implData.setCatalogJanitorEnabled(true);<a name="line.131"></a>
 <span class="sourceLineNo">132</span>    }<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    if(! p_implData.getServers__IsNotDefault())<a name="line.133"></a>
+<span class="sourceLineNo">133</span>    if(! p_implData.getFilter__IsNotDefault())<a name="line.133"></a>
 <span class="sourceLineNo">134</span>    {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      p_implData.setServers(null);<a name="line.135"></a>
+<span class="sourceLineNo">135</span>      p_implData.setFilter("general");<a name="line.135"></a>
 <span class="sourceLineNo">136</span>    }<a name="line.136"></a>
 <span class="sourceLineNo">137</span>    return p_implData;<a name="line.137"></a>
 <span class="sourceLineNo">138</span>  }<a name="line.138"></a>
@@ -148,15 +148,15 @@
 <span class="sourceLineNo">140</span>  {<a name="line.140"></a>
 <span class="sourceLineNo">141</span>    super(p_templateManager, __jamon_setOptionalArguments(p_implData));<a name="line.141"></a>
 <span class="sourceLineNo">142</span>    master = p_implData.getMaster();<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    serverManager = p_implData.getServerManager();<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    frags = p_implData.getFrags();<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    metaLocation = p_implData.getMetaLocation();<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    assignmentManager = p_implData.getAssignmentManager();<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    catalogJanitorEnabled = p_implData.getCatalogJanitorEnabled();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    format = p_implData.getFormat();<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    filter = p_implData.getFilter();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    deadServers = p_implData.getDeadServers();<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    servers = p_implData.getServers();<a name="line.151"></a>
+<span class="sourceLineNo">143</span>    assignmentManager = p_implData.getAssignmentManager();<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    serverManager = p_implData.getServerManager();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    deadServers = p_implData.getDeadServers();<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    format = p_implData.getFormat();<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    servers = p_implData.getServers();<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    metaLocation = p_implData.getMetaLocation();<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    frags = p_implData.getFrags();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    catalogJanitorEnabled = p_implData.getCatalogJanitorEnabled();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    filter = p_implData.getFilter();<a name="line.151"></a>
 <span class="sourceLineNo">152</span>  }<a name="line.152"></a>
 <span class="sourceLineNo">153</span>  <a name="line.153"></a>
 <span class="sourceLineNo">154</span>  @Override public void renderNoFlush(final java.io.Writer jamonWriter)<a name="line.154"></a>
@@ -170,8 +170,8 @@
 <span class="sourceLineNo">162</span>      // 60, 3<a name="line.162"></a>
 <span class="sourceLineNo">163</span>      {<a name="line.163"></a>
 <span class="sourceLineNo">164</span>        org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl __jamon__var_6 = new org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl(this.getTemplateManager());<a name="line.164"></a>
-<span class="sourceLineNo">165</span>        __jamon__var_6.setFormat("json" );<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        __jamon__var_6.setFilter(filter);<a name="line.166"></a>
+<span class="sourceLineNo">165</span>        __jamon__var_6.setFilter(filter);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        __jamon__var_6.setFormat("json" );<a name="line.166"></a>
 <span class="sourceLineNo">167</span>        __jamon__var_6.renderNoFlush(jamonWriter);<a name="line.167"></a>
 <span class="sourceLineNo">168</span>      }<a name="line.168"></a>
 <span class="sourceLineNo">169</span>      // 60, 68<a name="line.169"></a>


[37/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html
index f9da92e..d77d3ab 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html
@@ -157,184 +157,189 @@
 <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">152</span>  /**<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * Encapsulate the ugly casting and RuntimeException conversion in private method.<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * @param conf configuration<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * @return The compressor to use on this client.<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   */<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static CompressionCodec getCompressor(final Configuration conf) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    String className = conf.get("hbase.client.rpc.compressor", null);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    if (className == null || className.isEmpty()) return null;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    try {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        return (CompressionCodec)Class.forName(className).newInstance();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    } catch (Exception e) {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      throw new RuntimeException("Failed getting compressor " + className, e);<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><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  /**<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * Return the pool type specified in the configuration, which must be set to<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * either {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#RoundRobin} or<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#ThreadLocal},<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * otherwise default to the former.<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   *<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * For applications with many user threads, use a small round-robin pool. For<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * applications with few user threads, you may want to try using a<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * thread-local pool. In any case, the number of {@link org.apache.hadoop.hbase.ipc.RpcClient}<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * instances should not exceed the operating system's hard limit on the number of<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   * connections.<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   *<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   * @param config configuration<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @return either a {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#RoundRobin} or<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   *         {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#ThreadLocal}<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   */<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  protected static PoolMap.PoolType getPoolType(Configuration config) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    return PoolMap.PoolType<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        .valueOf(config.get(HConstants.HBASE_CLIENT_IPC_POOL_TYPE), PoolMap.PoolType.RoundRobin,<a name="line.185"></a>
-<span class="sourceLineNo">186</span>            PoolMap.PoolType.ThreadLocal);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  }<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * Return the pool size specified in the configuration, which is applicable only if<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * the pool type is {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#RoundRobin}.<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   *<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * @param config configuration<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * @return the maximum pool size<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   */<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  protected static int getPoolSize(Configuration config) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    return config.getInt(HConstants.HBASE_CLIENT_IPC_POOL_SIZE, 1);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  }<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  /**<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   * Make a blocking call. Throws exceptions if there are network problems or if the remote code<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   * threw an exception.<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   *<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   * @param ticket Be careful which ticket you pass. A new user will mean a new Connection.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   *               {@link UserProvider#getCurrent()} makes a new instance of User each time so<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   *               will be a<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   *               new Connection each time.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * @return A pair with the Message response and the Cell data (if any).<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  Message callBlockingMethod(Descriptors.MethodDescriptor md, PayloadCarryingRpcController pcrc,<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      Message param, Message returnType, final User ticket, final InetSocketAddress isa)<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      throws ServiceException {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    if (pcrc == null) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      pcrc = new PayloadCarryingRpcController();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    Pair&lt;Message, CellScanner&gt; val;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    try {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      final MetricsConnection.CallStats cs = MetricsConnection.newCallStats();<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      cs.setStartTime(EnvironmentEdgeManager.currentTime());<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      val = call(pcrc, md, param, returnType, ticket, isa, cs);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      // Shove the results into controller so can be carried across the proxy/pb service void.<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      pcrc.setCellScanner(val.getSecond());<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>      cs.setCallTimeMs(EnvironmentEdgeManager.currentTime() - cs.getStartTime());<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      if (metrics != null) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        metrics.updateRpc(md, param, cs);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      }<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      if (LOG.isTraceEnabled()) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        LOG.trace("Call: " + md.getName() + ", callTime: " + cs.getCallTimeMs() + "ms");<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return val.getFirst();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    } catch (Throwable e) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      throw new ServiceException(e);<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><a name="line.237"></a>
-<span class="sourceLineNo">238</span>  /**<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * Make a call, passing &lt;code&gt;param&lt;/code&gt;, to the IPC server running at<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * &lt;code&gt;address&lt;/code&gt; which is servicing the &lt;code&gt;protocol&lt;/code&gt; protocol,<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   * with the &lt;code&gt;ticket&lt;/code&gt; credentials, returning the value.<a name="line.241"></a>
-<span class="sourceLineNo">242</span>   * Throws exceptions if there are network problems or if the remote code<a name="line.242"></a>
-<span class="sourceLineNo">243</span>   * threw an exception.<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   *<a name="line.244"></a>
-<span class="sourceLineNo">245</span>   * @param ticket Be careful which ticket you pass. A new user will mean a new Connection.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   *               {@link UserProvider#getCurrent()} makes a new instance of User each time so<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   *               will be a<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   *               new Connection each time.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   * @return A pair with the Message response and the Cell data (if any).<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * @throws InterruptedException<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * @throws java.io.IOException<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  protected abstract Pair&lt;Message, CellScanner&gt; call(PayloadCarryingRpcController pcrc,<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      Descriptors.MethodDescriptor md, Message param, Message returnType, User ticket,<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      InetSocketAddress isa, MetricsConnection.CallStats callStats)<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      throws IOException, InterruptedException;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  @Override<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  public BlockingRpcChannel createBlockingRpcChannel(final ServerName sn, final User ticket,<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      int defaultOperationTimeout) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    return new BlockingRpcChannelImplementation(this, sn, ticket, defaultOperationTimeout);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>  }<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>  /**<a name="line.264"></a>
-<span class="sourceLineNo">265</span>   * Takes an Exception and the address we were trying to connect to and return an IOException with<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * the input exception as the cause. The new exception provides the stack trace of the place where<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * the exception is thrown and some extra diagnostics information. If the exception is<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * ConnectException or SocketTimeoutException, return a new one of the same type; Otherwise return<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   * an IOException.<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   * @param addr target address<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * @param exception the relevant exception<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * @return an exception to throw<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  protected IOException wrapException(InetSocketAddress addr, Exception exception) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    if (exception instanceof ConnectException) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      // connection refused; include the host:port in the error<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      return (ConnectException) new ConnectException("Call to " + addr<a name="line.277"></a>
-<span class="sourceLineNo">278</span>          + " failed on connection exception: " + exception).initCause(exception);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    } else if (exception instanceof SocketTimeoutException) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      return (SocketTimeoutException) new SocketTimeoutException("Call to " + addr<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          + " failed because " + exception).initCause(exception);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    } else if (exception instanceof ConnectionClosingException) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      return (ConnectionClosingException) new ConnectionClosingException("Call to " + addr<a name="line.283"></a>
-<span class="sourceLineNo">284</span>          + " failed on local exception: " + exception).initCause(exception);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    } else {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      return (IOException) new IOException("Call to " + addr + " failed on local exception: "<a name="line.286"></a>
-<span class="sourceLineNo">287</span>          + exception).initCause(exception);<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><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  /**<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * Blocking rpc channel that goes via hbase rpc.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   */<a name="line.293"></a>
-<span class="sourceLineNo">294</span>  @VisibleForTesting<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  public static class BlockingRpcChannelImplementation implements BlockingRpcChannel {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    private final InetSocketAddress isa;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    private final AbstractRpcClient rpcClient;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    private final User ticket;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    private final int channelOperationTimeout;<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>     * @param channelOperationTimeout - the default timeout when no timeout is given<a name="line.302"></a>
-<span class="sourceLineNo">303</span>     */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    protected BlockingRpcChannelImplementation(final AbstractRpcClient rpcClient,<a name="line.304"></a>
-<span class="sourceLineNo">305</span>        final ServerName sn, final User ticket, int channelOperationTimeout) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      this.isa = new InetSocketAddress(sn.getHostname(), sn.getPort());<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      this.rpcClient = rpcClient;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      this.ticket = ticket;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      this.channelOperationTimeout = channelOperationTimeout;<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 Message callBlockingMethod(Descriptors.MethodDescriptor md, RpcController controller,<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        Message param, Message returnType) throws ServiceException {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      PayloadCarryingRpcController pcrc;<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      if (controller != null) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        pcrc = (PayloadCarryingRpcController) controller;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>        if (!pcrc.hasCallTimeout()) {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>          pcrc.setCallTimeout(channelOperationTimeout);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        }<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      } else {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        pcrc = new PayloadCarryingRpcController();<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        pcrc.setCallTimeout(channelOperationTimeout);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      }<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>      return this.rpcClient.callBlockingMethod(md, pcrc, param, returnType, this.ticket, this.isa);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>}<a name="line.329"></a>
+<span class="sourceLineNo">152</span>  @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  public boolean hasCellBlockSupport() {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    return this.codec != null;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  }<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  /**<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * Encapsulate the ugly casting and RuntimeException conversion in private method.<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * @param conf configuration<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   * @return The compressor to use on this client.<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   */<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  private static CompressionCodec getCompressor(final Configuration conf) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    String className = conf.get("hbase.client.rpc.compressor", null);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    if (className == null || className.isEmpty()) return null;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    try {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        return (CompressionCodec)Class.forName(className).newInstance();<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    } catch (Exception e) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      throw new RuntimeException("Failed getting compressor " + className, e);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  }<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>   * Return the pool type specified in the configuration, which must be set to<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   * either {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#RoundRobin} or<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   * {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#ThreadLocal},<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * otherwise default to the former.<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   *<a name="line.177"></a>
+<span class="sourceLineNo">178</span>   * For applications with many user threads, use a small round-robin pool. For<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * applications with few user threads, you may want to try using a<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * thread-local pool. In any case, the number of {@link org.apache.hadoop.hbase.ipc.RpcClient}<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * instances should not exceed the operating system's hard limit on the number of<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * connections.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   *<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * @param config configuration<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * @return either a {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#RoundRobin} or<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   *         {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#ThreadLocal}<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   */<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  protected static PoolMap.PoolType getPoolType(Configuration config) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    return PoolMap.PoolType<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        .valueOf(config.get(HConstants.HBASE_CLIENT_IPC_POOL_TYPE), PoolMap.PoolType.RoundRobin,<a name="line.190"></a>
+<span class="sourceLineNo">191</span>            PoolMap.PoolType.ThreadLocal);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  /**<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * Return the pool size specified in the configuration, which is applicable only if<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   * the pool type is {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#RoundRobin}.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   *<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * @param config configuration<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * @return the maximum pool size<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   */<a name="line.200"></a>
+<span class="sourceLineNo">201</span>  protected static int getPoolSize(Configuration config) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    return config.getInt(HConstants.HBASE_CLIENT_IPC_POOL_SIZE, 1);<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  /**<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   * Make a blocking call. Throws exceptions if there are network problems or if the remote code<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   * threw an exception.<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   *<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * @param ticket Be careful which ticket you pass. A new user will mean a new Connection.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   *               {@link UserProvider#getCurrent()} makes a new instance of User each time so<a name="line.210"></a>
+<span class="sourceLineNo">211</span>   *               will be a<a name="line.211"></a>
+<span class="sourceLineNo">212</span>   *               new Connection each time.<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * @return A pair with the Message response and the Cell data (if any).<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  Message callBlockingMethod(Descriptors.MethodDescriptor md, PayloadCarryingRpcController pcrc,<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      Message param, Message returnType, final User ticket, final InetSocketAddress isa)<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      throws ServiceException {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    if (pcrc == null) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      pcrc = new PayloadCarryingRpcController();<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    }<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>    Pair&lt;Message, CellScanner&gt; val;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    try {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      final MetricsConnection.CallStats cs = MetricsConnection.newCallStats();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      cs.setStartTime(EnvironmentEdgeManager.currentTime());<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      val = call(pcrc, md, param, returnType, ticket, isa, cs);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      // Shove the results into controller so can be carried across the proxy/pb service void.<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      pcrc.setCellScanner(val.getSecond());<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>      cs.setCallTimeMs(EnvironmentEdgeManager.currentTime() - cs.getStartTime());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      if (metrics != null) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        metrics.updateRpc(md, param, cs);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      if (LOG.isTraceEnabled()) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        LOG.trace("Call: " + md.getName() + ", callTime: " + cs.getCallTimeMs() + "ms");<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      return val.getFirst();<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    } catch (Throwable e) {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      throw new ServiceException(e);<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><a name="line.242"></a>
+<span class="sourceLineNo">243</span>  /**<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * Make a call, passing &lt;code&gt;param&lt;/code&gt;, to the IPC server running at<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * &lt;code&gt;address&lt;/code&gt; which is servicing the &lt;code&gt;protocol&lt;/code&gt; protocol,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * with the &lt;code&gt;ticket&lt;/code&gt; credentials, returning the value.<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * Throws exceptions if there are network problems or if the remote code<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * threw an exception.<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   *<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * @param ticket Be careful which ticket you pass. A new user will mean a new Connection.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   *               {@link UserProvider#getCurrent()} makes a new instance of User each time so<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   *               will be a<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   *               new Connection each time.<a name="line.253"></a>
+<span class="sourceLineNo">254</span>   * @return A pair with the Message response and the Cell data (if any).<a name="line.254"></a>
+<span class="sourceLineNo">255</span>   * @throws InterruptedException<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * @throws java.io.IOException<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   */<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  protected abstract Pair&lt;Message, CellScanner&gt; call(PayloadCarryingRpcController pcrc,<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      Descriptors.MethodDescriptor md, Message param, Message returnType, User ticket,<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      InetSocketAddress isa, MetricsConnection.CallStats callStats)<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      throws IOException, InterruptedException;<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  @Override<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  public BlockingRpcChannel createBlockingRpcChannel(final ServerName sn, final User ticket,<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      int defaultOperationTimeout) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    return new BlockingRpcChannelImplementation(this, sn, ticket, defaultOperationTimeout);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  }<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>   * Takes an Exception and the address we were trying to connect to and return an IOException with<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * the input exception as the cause. The new exception provides the stack trace of the place where<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * the exception is thrown and some extra diagnostics information. If the exception is<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * ConnectException or SocketTimeoutException, return a new one of the same type; Otherwise return<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * an IOException.<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   * @param addr target address<a name="line.275"></a>
+<span class="sourceLineNo">276</span>   * @param exception the relevant exception<a name="line.276"></a>
+<span class="sourceLineNo">277</span>   * @return an exception to throw<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   */<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  protected IOException wrapException(InetSocketAddress addr, Exception exception) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    if (exception instanceof ConnectException) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // connection refused; include the host:port in the error<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      return (ConnectException) new ConnectException("Call to " + addr<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          + " failed on connection exception: " + exception).initCause(exception);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    } else if (exception instanceof SocketTimeoutException) {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      return (SocketTimeoutException) new SocketTimeoutException("Call to " + addr<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          + " failed because " + exception).initCause(exception);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    } else if (exception instanceof ConnectionClosingException) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      return (ConnectionClosingException) new ConnectionClosingException("Call to " + addr<a name="line.288"></a>
+<span class="sourceLineNo">289</span>          + " failed on local exception: " + exception).initCause(exception);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    } else {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      return (IOException) new IOException("Call to " + addr + " failed on local exception: "<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          + exception).initCause(exception);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    }<a name="line.293"></a>
+<span class="sourceLineNo">294</span>  }<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>  /**<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * Blocking rpc channel that goes via hbase rpc.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  @VisibleForTesting<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public static class BlockingRpcChannelImplementation implements BlockingRpcChannel {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    private final InetSocketAddress isa;<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    private final AbstractRpcClient rpcClient;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    private final User ticket;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    private final int channelOperationTimeout;<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>    /**<a name="line.306"></a>
+<span class="sourceLineNo">307</span>     * @param channelOperationTimeout - the default timeout when no timeout is given<a name="line.307"></a>
+<span class="sourceLineNo">308</span>     */<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    protected BlockingRpcChannelImplementation(final AbstractRpcClient rpcClient,<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        final ServerName sn, final User ticket, int channelOperationTimeout) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      this.isa = new InetSocketAddress(sn.getHostname(), sn.getPort());<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      this.rpcClient = rpcClient;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      this.ticket = ticket;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      this.channelOperationTimeout = channelOperationTimeout;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>    @Override<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    public Message callBlockingMethod(Descriptors.MethodDescriptor md, RpcController controller,<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        Message param, Message returnType) throws ServiceException {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      PayloadCarryingRpcController pcrc;<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      if (controller != null) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        pcrc = (PayloadCarryingRpcController) controller;<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        if (!pcrc.hasCallTimeout()) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          pcrc.setCallTimeout(channelOperationTimeout);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>        }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      } else {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        pcrc = new PayloadCarryingRpcController();<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        pcrc.setCallTimeout(channelOperationTimeout);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      }<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>      return this.rpcClient.callBlockingMethod(md, pcrc, param, returnType, this.ticket, this.isa);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>}<a name="line.334"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html
index f9da92e..d77d3ab 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html
@@ -157,184 +157,189 @@
 <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">152</span>  /**<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * Encapsulate the ugly casting and RuntimeException conversion in private method.<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * @param conf configuration<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * @return The compressor to use on this client.<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   */<a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static CompressionCodec getCompressor(final Configuration conf) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    String className = conf.get("hbase.client.rpc.compressor", null);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    if (className == null || className.isEmpty()) return null;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    try {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        return (CompressionCodec)Class.forName(className).newInstance();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    } catch (Exception e) {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      throw new RuntimeException("Failed getting compressor " + className, e);<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><a name="line.166"></a>
-<span class="sourceLineNo">167</span>  /**<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * Return the pool type specified in the configuration, which must be set to<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   * either {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#RoundRobin} or<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#ThreadLocal},<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * otherwise default to the former.<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   *<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * For applications with many user threads, use a small round-robin pool. For<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * applications with few user threads, you may want to try using a<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * thread-local pool. In any case, the number of {@link org.apache.hadoop.hbase.ipc.RpcClient}<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * instances should not exceed the operating system's hard limit on the number of<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   * connections.<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   *<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   * @param config configuration<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @return either a {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#RoundRobin} or<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   *         {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#ThreadLocal}<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   */<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  protected static PoolMap.PoolType getPoolType(Configuration config) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    return PoolMap.PoolType<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        .valueOf(config.get(HConstants.HBASE_CLIENT_IPC_POOL_TYPE), PoolMap.PoolType.RoundRobin,<a name="line.185"></a>
-<span class="sourceLineNo">186</span>            PoolMap.PoolType.ThreadLocal);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  }<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * Return the pool size specified in the configuration, which is applicable only if<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * the pool type is {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#RoundRobin}.<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   *<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * @param config configuration<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * @return the maximum pool size<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   */<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  protected static int getPoolSize(Configuration config) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    return config.getInt(HConstants.HBASE_CLIENT_IPC_POOL_SIZE, 1);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  }<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  /**<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   * Make a blocking call. Throws exceptions if there are network problems or if the remote code<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   * threw an exception.<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   *<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   * @param ticket Be careful which ticket you pass. A new user will mean a new Connection.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   *               {@link UserProvider#getCurrent()} makes a new instance of User each time so<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   *               will be a<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   *               new Connection each time.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * @return A pair with the Message response and the Cell data (if any).<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  Message callBlockingMethod(Descriptors.MethodDescriptor md, PayloadCarryingRpcController pcrc,<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      Message param, Message returnType, final User ticket, final InetSocketAddress isa)<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      throws ServiceException {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    if (pcrc == null) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      pcrc = new PayloadCarryingRpcController();<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>    Pair&lt;Message, CellScanner&gt; val;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    try {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      final MetricsConnection.CallStats cs = MetricsConnection.newCallStats();<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      cs.setStartTime(EnvironmentEdgeManager.currentTime());<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      val = call(pcrc, md, param, returnType, ticket, isa, cs);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      // Shove the results into controller so can be carried across the proxy/pb service void.<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      pcrc.setCellScanner(val.getSecond());<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>      cs.setCallTimeMs(EnvironmentEdgeManager.currentTime() - cs.getStartTime());<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      if (metrics != null) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        metrics.updateRpc(md, param, cs);<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      }<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      if (LOG.isTraceEnabled()) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        LOG.trace("Call: " + md.getName() + ", callTime: " + cs.getCallTimeMs() + "ms");<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return val.getFirst();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    } catch (Throwable e) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      throw new ServiceException(e);<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><a name="line.237"></a>
-<span class="sourceLineNo">238</span>  /**<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * Make a call, passing &lt;code&gt;param&lt;/code&gt;, to the IPC server running at<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * &lt;code&gt;address&lt;/code&gt; which is servicing the &lt;code&gt;protocol&lt;/code&gt; protocol,<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   * with the &lt;code&gt;ticket&lt;/code&gt; credentials, returning the value.<a name="line.241"></a>
-<span class="sourceLineNo">242</span>   * Throws exceptions if there are network problems or if the remote code<a name="line.242"></a>
-<span class="sourceLineNo">243</span>   * threw an exception.<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   *<a name="line.244"></a>
-<span class="sourceLineNo">245</span>   * @param ticket Be careful which ticket you pass. A new user will mean a new Connection.<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   *               {@link UserProvider#getCurrent()} makes a new instance of User each time so<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   *               will be a<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   *               new Connection each time.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   * @return A pair with the Message response and the Cell data (if any).<a name="line.249"></a>
-<span class="sourceLineNo">250</span>   * @throws InterruptedException<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * @throws java.io.IOException<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  protected abstract Pair&lt;Message, CellScanner&gt; call(PayloadCarryingRpcController pcrc,<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      Descriptors.MethodDescriptor md, Message param, Message returnType, User ticket,<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      InetSocketAddress isa, MetricsConnection.CallStats callStats)<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      throws IOException, InterruptedException;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  @Override<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  public BlockingRpcChannel createBlockingRpcChannel(final ServerName sn, final User ticket,<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      int defaultOperationTimeout) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    return new BlockingRpcChannelImplementation(this, sn, ticket, defaultOperationTimeout);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>  }<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>  /**<a name="line.264"></a>
-<span class="sourceLineNo">265</span>   * Takes an Exception and the address we were trying to connect to and return an IOException with<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * the input exception as the cause. The new exception provides the stack trace of the place where<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * the exception is thrown and some extra diagnostics information. If the exception is<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * ConnectException or SocketTimeoutException, return a new one of the same type; Otherwise return<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   * an IOException.<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   * @param addr target address<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * @param exception the relevant exception<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * @return an exception to throw<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  protected IOException wrapException(InetSocketAddress addr, Exception exception) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    if (exception instanceof ConnectException) {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      // connection refused; include the host:port in the error<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      return (ConnectException) new ConnectException("Call to " + addr<a name="line.277"></a>
-<span class="sourceLineNo">278</span>          + " failed on connection exception: " + exception).initCause(exception);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    } else if (exception instanceof SocketTimeoutException) {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      return (SocketTimeoutException) new SocketTimeoutException("Call to " + addr<a name="line.280"></a>
-<span class="sourceLineNo">281</span>          + " failed because " + exception).initCause(exception);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    } else if (exception instanceof ConnectionClosingException) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      return (ConnectionClosingException) new ConnectionClosingException("Call to " + addr<a name="line.283"></a>
-<span class="sourceLineNo">284</span>          + " failed on local exception: " + exception).initCause(exception);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    } else {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      return (IOException) new IOException("Call to " + addr + " failed on local exception: "<a name="line.286"></a>
-<span class="sourceLineNo">287</span>          + exception).initCause(exception);<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><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  /**<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * Blocking rpc channel that goes via hbase rpc.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   */<a name="line.293"></a>
-<span class="sourceLineNo">294</span>  @VisibleForTesting<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  public static class BlockingRpcChannelImplementation implements BlockingRpcChannel {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    private final InetSocketAddress isa;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    private final AbstractRpcClient rpcClient;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    private final User ticket;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    private final int channelOperationTimeout;<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>     * @param channelOperationTimeout - the default timeout when no timeout is given<a name="line.302"></a>
-<span class="sourceLineNo">303</span>     */<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    protected BlockingRpcChannelImplementation(final AbstractRpcClient rpcClient,<a name="line.304"></a>
-<span class="sourceLineNo">305</span>        final ServerName sn, final User ticket, int channelOperationTimeout) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      this.isa = new InetSocketAddress(sn.getHostname(), sn.getPort());<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      this.rpcClient = rpcClient;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      this.ticket = ticket;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      this.channelOperationTimeout = channelOperationTimeout;<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 Message callBlockingMethod(Descriptors.MethodDescriptor md, RpcController controller,<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        Message param, Message returnType) throws ServiceException {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      PayloadCarryingRpcController pcrc;<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      if (controller != null) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        pcrc = (PayloadCarryingRpcController) controller;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>        if (!pcrc.hasCallTimeout()) {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>          pcrc.setCallTimeout(channelOperationTimeout);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        }<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      } else {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        pcrc = new PayloadCarryingRpcController();<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        pcrc.setCallTimeout(channelOperationTimeout);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      }<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>      return this.rpcClient.callBlockingMethod(md, pcrc, param, returnType, this.ticket, this.isa);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>}<a name="line.329"></a>
+<span class="sourceLineNo">152</span>  @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  public boolean hasCellBlockSupport() {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    return this.codec != null;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  }<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  /**<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * Encapsulate the ugly casting and RuntimeException conversion in private method.<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * @param conf configuration<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   * @return The compressor to use on this client.<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   */<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  private static CompressionCodec getCompressor(final Configuration conf) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    String className = conf.get("hbase.client.rpc.compressor", null);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    if (className == null || className.isEmpty()) return null;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    try {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        return (CompressionCodec)Class.forName(className).newInstance();<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    } catch (Exception e) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      throw new RuntimeException("Failed getting compressor " + className, e);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  }<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>   * Return the pool type specified in the configuration, which must be set to<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   * either {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#RoundRobin} or<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   * {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#ThreadLocal},<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   * otherwise default to the former.<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   *<a name="line.177"></a>
+<span class="sourceLineNo">178</span>   * For applications with many user threads, use a small round-robin pool. For<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * applications with few user threads, you may want to try using a<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * thread-local pool. In any case, the number of {@link org.apache.hadoop.hbase.ipc.RpcClient}<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * instances should not exceed the operating system's hard limit on the number of<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * connections.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   *<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * @param config configuration<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * @return either a {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#RoundRobin} or<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   *         {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#ThreadLocal}<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   */<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  protected static PoolMap.PoolType getPoolType(Configuration config) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    return PoolMap.PoolType<a name="line.189"></a>
+<span class="sourceLineNo">190</span>        .valueOf(config.get(HConstants.HBASE_CLIENT_IPC_POOL_TYPE), PoolMap.PoolType.RoundRobin,<a name="line.190"></a>
+<span class="sourceLineNo">191</span>            PoolMap.PoolType.ThreadLocal);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  /**<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * Return the pool size specified in the configuration, which is applicable only if<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   * the pool type is {@link org.apache.hadoop.hbase.util.PoolMap.PoolType#RoundRobin}.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   *<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * @param config configuration<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * @return the maximum pool size<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   */<a name="line.200"></a>
+<span class="sourceLineNo">201</span>  protected static int getPoolSize(Configuration config) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    return config.getInt(HConstants.HBASE_CLIENT_IPC_POOL_SIZE, 1);<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  }<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>  /**<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   * Make a blocking call. Throws exceptions if there are network problems or if the remote code<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   * threw an exception.<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   *<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * @param ticket Be careful which ticket you pass. A new user will mean a new Connection.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   *               {@link UserProvider#getCurrent()} makes a new instance of User each time so<a name="line.210"></a>
+<span class="sourceLineNo">211</span>   *               will be a<a name="line.211"></a>
+<span class="sourceLineNo">212</span>   *               new Connection each time.<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * @return A pair with the Message response and the Cell data (if any).<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  Message callBlockingMethod(Descriptors.MethodDescriptor md, PayloadCarryingRpcController pcrc,<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      Message param, Message returnType, final User ticket, final InetSocketAddress isa)<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      throws ServiceException {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    if (pcrc == null) {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      pcrc = new PayloadCarryingRpcController();<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    }<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>    Pair&lt;Message, CellScanner&gt; val;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    try {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      final MetricsConnection.CallStats cs = MetricsConnection.newCallStats();<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      cs.setStartTime(EnvironmentEdgeManager.currentTime());<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      val = call(pcrc, md, param, returnType, ticket, isa, cs);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      // Shove the results into controller so can be carried across the proxy/pb service void.<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      pcrc.setCellScanner(val.getSecond());<a name="line.228"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>      cs.setCallTimeMs(EnvironmentEdgeManager.currentTime() - cs.getStartTime());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      if (metrics != null) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        metrics.updateRpc(md, param, cs);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      if (LOG.isTraceEnabled()) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        LOG.trace("Call: " + md.getName() + ", callTime: " + cs.getCallTimeMs() + "ms");<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      return val.getFirst();<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    } catch (Throwable e) {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      throw new ServiceException(e);<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><a name="line.242"></a>
+<span class="sourceLineNo">243</span>  /**<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * Make a call, passing &lt;code&gt;param&lt;/code&gt;, to the IPC server running at<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * &lt;code&gt;address&lt;/code&gt; which is servicing the &lt;code&gt;protocol&lt;/code&gt; protocol,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * with the &lt;code&gt;ticket&lt;/code&gt; credentials, returning the value.<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * Throws exceptions if there are network problems or if the remote code<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * threw an exception.<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   *<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * @param ticket Be careful which ticket you pass. A new user will mean a new Connection.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   *               {@link UserProvider#getCurrent()} makes a new instance of User each time so<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   *               will be a<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   *               new Connection each time.<a name="line.253"></a>
+<span class="sourceLineNo">254</span>   * @return A pair with the Message response and the Cell data (if any).<a name="line.254"></a>
+<span class="sourceLineNo">255</span>   * @throws InterruptedException<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * @throws java.io.IOException<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   */<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  protected abstract Pair&lt;Message, CellScanner&gt; call(PayloadCarryingRpcController pcrc,<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      Descriptors.MethodDescriptor md, Message param, Message returnType, User ticket,<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      InetSocketAddress isa, MetricsConnection.CallStats callStats)<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      throws IOException, InterruptedException;<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  @Override<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  public BlockingRpcChannel createBlockingRpcChannel(final ServerName sn, final User ticket,<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      int defaultOperationTimeout) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    return new BlockingRpcChannelImplementation(this, sn, ticket, defaultOperationTimeout);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  }<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>   * Takes an Exception and the address we were trying to connect to and return an IOException with<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * the input exception as the cause. The new exception provides the stack trace of the place where<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * the exception is thrown and some extra diagnostics information. If the exception is<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * ConnectException or SocketTimeoutException, return a new one of the same type; Otherwise return<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * an IOException.<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   * @param addr target address<a name="line.275"></a>
+<span class="sourceLineNo">276</span>   * @param exception the relevant exception<a name="line.276"></a>
+<span class="sourceLineNo">277</span>   * @return an exception to throw<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   */<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  protected IOException wrapException(InetSocketAddress addr, Exception exception) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    if (exception instanceof ConnectException) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // connection refused; include the host:port in the error<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      return (ConnectException) new ConnectException("Call to " + addr<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          + " failed on connection exception: " + exception).initCause(exception);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    } else if (exception instanceof SocketTimeoutException) {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      return (SocketTimeoutException) new SocketTimeoutException("Call to " + addr<a name="line.285"></a>
+<span class="sourceLineNo">286</span>          + " failed because " + exception).initCause(exception);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    } else if (exception instanceof ConnectionClosingException) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      return (ConnectionClosingException) new ConnectionClosingException("Call to " + addr<a name="line.288"></a>
+<span class="sourceLineNo">289</span>          + " failed on local exception: " + exception).initCause(exception);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    } else {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      return (IOException) new IOException("Call to " + addr + " failed on local exception: "<a name="line.291"></a>
+<span class="sourceLineNo">292</span>          + exception).initCause(exception);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    }<a name="line.293"></a>
+<span class="sourceLineNo">294</span>  }<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>  /**<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * Blocking rpc channel that goes via hbase rpc.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  @VisibleForTesting<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public static class BlockingRpcChannelImplementation implements BlockingRpcChannel {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    private final InetSocketAddress isa;<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    private final AbstractRpcClient rpcClient;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    private final User ticket;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    private final int channelOperationTimeout;<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>    /**<a name="line.306"></a>
+<span class="sourceLineNo">307</span>     * @param channelOperationTimeout - the default timeout when no timeout is given<a name="line.307"></a>
+<span class="sourceLineNo">308</span>     */<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    protected BlockingRpcChannelImplementation(final AbstractRpcClient rpcClient,<a name="line.309"></a>
+<span class="sourceLineNo">310</span>        final ServerName sn, final User ticket, int channelOperationTimeout) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      this.isa = new InetSocketAddress(sn.getHostname(), sn.getPort());<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      this.rpcClient = rpcClient;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      this.ticket = ticket;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      this.channelOperationTimeout = channelOperationTimeout;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    }<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>    @Override<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    public Message callBlockingMethod(Descriptors.MethodDescriptor md, RpcController controller,<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        Message param, Message returnType) throws ServiceException {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      PayloadCarryingRpcController pcrc;<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      if (controller != null) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        pcrc = (PayloadCarryingRpcController) controller;<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        if (!pcrc.hasCallTimeout()) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          pcrc.setCallTimeout(channelOperationTimeout);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>        }<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      } else {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        pcrc = new PayloadCarryingRpcController();<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        pcrc.setCallTimeout(channelOperationTimeout);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      }<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>      return this.rpcClient.callBlockingMethod(md, pcrc, param, returnType, this.ticket, this.isa);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>}<a name="line.334"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClient.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClient.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClient.html
index 7d4db73..016609c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClient.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/RpcClient.html
@@ -91,7 +91,13 @@
 <span class="sourceLineNo">083</span>   * using this client.<a name="line.83"></a>
 <span class="sourceLineNo">084</span>   */<a name="line.84"></a>
 <span class="sourceLineNo">085</span>  @Override public void close();<a name="line.85"></a>
-<span class="sourceLineNo">086</span>}<a name="line.86"></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>   * @return true when this client uses a {@link org.apache.hadoop.hbase.codec.Codec} and so<a name="line.88"></a>
+<span class="sourceLineNo">089</span>   *         supports cell blocks.<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  boolean hasCellBlockSupport();<a name="line.91"></a>
+<span class="sourceLineNo">092</span>}<a name="line.92"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html
index 5344a96..6c2b2de 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html
@@ -274,7 +274,7 @@
 <span class="sourceLineNo">266</span>        }<a name="line.266"></a>
 <span class="sourceLineNo">267</span>        List&lt;InputSplit&gt; splits = new ArrayList&lt;InputSplit&gt;(1);<a name="line.267"></a>
 <span class="sourceLineNo">268</span>        long regionSize = sizeCalculator.getRegionSize(regLoc.getRegionInfo().getRegionName());<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        TableSplit split = new TableSplit(tableName,<a name="line.269"></a>
+<span class="sourceLineNo">269</span>        TableSplit split = new TableSplit(tableName, scan,<a name="line.269"></a>
 <span class="sourceLineNo">270</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY, regLoc<a name="line.270"></a>
 <span class="sourceLineNo">271</span>                .getHostnamePort().split(Addressing.HOSTNAME_PORT_SEPARATOR)[0], regionSize);<a name="line.271"></a>
 <span class="sourceLineNo">272</span>        splits.add(split);<a name="line.272"></a>
@@ -317,7 +317,7 @@
 <span class="sourceLineNo">309</span>  <a name="line.309"></a>
 <span class="sourceLineNo">310</span>          byte[] regionName = location.getRegionInfo().getRegionName();<a name="line.310"></a>
 <span class="sourceLineNo">311</span>          long regionSize = sizeCalculator.getRegionSize(regionName);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          TableSplit split = new TableSplit(tableName,<a name="line.312"></a>
+<span class="sourceLineNo">312</span>          TableSplit split = new TableSplit(tableName, scan,<a name="line.312"></a>
 <span class="sourceLineNo">313</span>            splitStart, splitStop, regionLocation, regionSize);<a name="line.313"></a>
 <span class="sourceLineNo">314</span>          splits.add(split);<a name="line.314"></a>
 <span class="sourceLineNo">315</span>          if (LOG.isDebugEnabled()) {<a name="line.315"></a>
@@ -405,9 +405,9 @@
 <span class="sourceLineNo">397</span>        byte[] splitKey = getSplitKey(ts.getStartRow(), ts.getEndRow(), isTextKey);<a name="line.397"></a>
 <span class="sourceLineNo">398</span>         //Set the size of child TableSplit as 1/2 of the region size. The exact size of the<a name="line.398"></a>
 <span class="sourceLineNo">399</span>         // MapReduce input splits is not far off.<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        TableSplit t1 = new TableSplit(tableName, ts.getStartRow(), splitKey, regionLocation,<a name="line.400"></a>
+<span class="sourceLineNo">400</span>        TableSplit t1 = new TableSplit(tableName, scan, ts.getStartRow(), splitKey, regionLocation,<a name="line.400"></a>
 <span class="sourceLineNo">401</span>                regionSize / 2);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        TableSplit t2 = new TableSplit(tableName, splitKey, ts.getEndRow(), regionLocation,<a name="line.402"></a>
+<span class="sourceLineNo">402</span>        TableSplit t2 = new TableSplit(tableName, scan, splitKey, ts.getEndRow(), regionLocation,<a name="line.402"></a>
 <span class="sourceLineNo">403</span>                regionSize - regionSize / 2);<a name="line.403"></a>
 <span class="sourceLineNo">404</span>        resultList.add(t1);<a name="line.404"></a>
 <span class="sourceLineNo">405</span>        resultList.add(t2);<a name="line.405"></a>
@@ -434,7 +434,7 @@
 <span class="sourceLineNo">426</span>            break;<a name="line.426"></a>
 <span class="sourceLineNo">427</span>          }<a name="line.427"></a>
 <span class="sourceLineNo">428</span>        }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        TableSplit t = new TableSplit(tableName, splitStartKey, splitEndKey,<a name="line.429"></a>
+<span class="sourceLineNo">429</span>        TableSplit t = new TableSplit(tableName, scan, splitStartKey, splitEndKey,<a name="line.429"></a>
 <span class="sourceLineNo">430</span>                regionLocation, totalSize);<a name="line.430"></a>
 <span class="sourceLineNo">431</span>        resultList.add(t);<a name="line.431"></a>
 <span class="sourceLineNo">432</span>      }<a name="line.432"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
index 4bcfbd0..a5703ad 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
@@ -569,7 +569,7 @@
 <span class="sourceLineNo">561</span>   * @return The scan saved in a Base64 encoded string.<a name="line.561"></a>
 <span class="sourceLineNo">562</span>   * @throws IOException When writing the scan fails.<a name="line.562"></a>
 <span class="sourceLineNo">563</span>   */<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  static String convertScanToString(Scan scan) throws IOException {<a name="line.564"></a>
+<span class="sourceLineNo">564</span>  public static String convertScanToString(Scan scan) throws IOException {<a name="line.564"></a>
 <span class="sourceLineNo">565</span>    ClientProtos.Scan proto = ProtobufUtil.toScan(scan);<a name="line.565"></a>
 <span class="sourceLineNo">566</span>    return Base64.encodeBytes(proto.toByteArray());<a name="line.566"></a>
 <span class="sourceLineNo">567</span>  }<a name="line.567"></a>
@@ -581,7 +581,7 @@
 <span class="sourceLineNo">573</span>   * @return The newly created Scan instance.<a name="line.573"></a>
 <span class="sourceLineNo">574</span>   * @throws IOException When reading the scan instance fails.<a name="line.574"></a>
 <span class="sourceLineNo">575</span>   */<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  static Scan convertStringToScan(String base64) throws IOException {<a name="line.576"></a>
+<span class="sourceLineNo">576</span>  public static Scan convertStringToScan(String base64) throws IOException {<a name="line.576"></a>
 <span class="sourceLineNo">577</span>    byte [] decoded = Base64.decode(base64);<a name="line.577"></a>
 <span class="sourceLineNo">578</span>    ClientProtos.Scan scan;<a name="line.578"></a>
 <span class="sourceLineNo">579</span>    try {<a name="line.579"></a>


[23/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatch.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatch.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatch.html
index fbdde18..1d64963 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatch.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatch.html
@@ -2959,7 +2959,7 @@
 <span class="sourceLineNo">2951</span>    Set&lt;byte[]&gt; deletesCfSet = null;<a name="line.2951"></a>
 <span class="sourceLineNo">2952</span>    long currentNonceGroup = HConstants.NO_NONCE;<a name="line.2952"></a>
 <span class="sourceLineNo">2953</span>    long currentNonce = HConstants.NO_NONCE;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    WALEdit walEdit = new WALEdit(replay);<a name="line.2954"></a>
+<span class="sourceLineNo">2954</span>    WALEdit walEdit = null;<a name="line.2954"></a>
 <span class="sourceLineNo">2955</span>    boolean locked = false;<a name="line.2955"></a>
 <span class="sourceLineNo">2956</span>    // reference family maps directly so coprocessors can mutate them if desired<a name="line.2956"></a>
 <span class="sourceLineNo">2957</span>    Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps = new Map[batchOp.operations.length];<a name="line.2957"></a>
@@ -2970,4878 +2970,4890 @@
 <span class="sourceLineNo">2962</span>    int noOfPuts = 0;<a name="line.2962"></a>
 <span class="sourceLineNo">2963</span>    int noOfDeletes = 0;<a name="line.2963"></a>
 <span class="sourceLineNo">2964</span>    WriteEntry writeEntry = null;<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    try {<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>      int numReadyToWrite = 0;<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>          lastIndexExclusive++;<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>          continue;<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>        }<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>        RowLock rowLock = null;<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>        try {<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>        } catch (IOException ioe) {<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span>        }<a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>        if (rowLock == null) {<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>          // We failed to grab another lock<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>          break; // Stop acquiring more rows for this batch<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>        } else {<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>          acquiredRowLocks.add(rowLock);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span>        }<a name="line.2989"></a>
-<span class="sourceLineNo">2990</span><a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>        lastIndexExclusive++;<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>        numReadyToWrite++;<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span><a name="line.2993"></a>
-<span class="sourceLineNo">2994</span>        if (mutation instanceof Put) {<a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>          // If Column Families stay consistent through out all of the<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>          // individual puts then metrics can be reported as a multiput across<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>          // column families in the first put.<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>          if (putsCfSet == null) {<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>          } else {<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span>          }<a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>        } else {<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>          if (deletesCfSet == null) {<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>          } else {<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>          }<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span>        }<a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>      }<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span><a name="line.3013"></a>
-<span class="sourceLineNo">3014</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3014"></a>
-<span class="sourceLineNo">3015</span><a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3020"></a>
-<span class="sourceLineNo">3021</span><a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>        return 0L;<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>      }<a name="line.3025"></a>
+<span class="sourceLineNo">2965</span>    int cellCount = 0;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    try {<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>      int numReadyToWrite = 0;<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>          lastIndexExclusive++;<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span>          continue;<a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>        }<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>        RowLock rowLock = null;<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span>        try {<a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>        } catch (IOException ioe) {<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>        }<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>        if (rowLock == null) {<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>          // We failed to grab another lock<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span>          break; // Stop acquiring more rows for this batch<a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>        } else {<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>          acquiredRowLocks.add(rowLock);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>        }<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span><a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>        lastIndexExclusive++;<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span>        numReadyToWrite++;<a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>        if (replay) {<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>          for (List&lt;Cell&gt; cells : mutation.getFamilyCellMap().values()) {<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>            cellCount += cells.size();<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>          }<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>        }<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span>        if (mutation instanceof Put) {<a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>          // If Column Families stay consistent through out all of the<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>          // individual puts then metrics can be reported as a multiput across<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>          // column families in the first put.<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>          if (putsCfSet == null) {<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>          } else {<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>          }<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>        } else {<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>          if (deletesCfSet == null) {<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>          } else {<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>          }<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>        }<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>      }<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span><a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span><a name="line.3020"></a>
+<span class="sourceLineNo">3021</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3025"></a>
 <span class="sourceLineNo">3026</span><a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span>        // skip invalid<a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>          // lastIndexExclusive was incremented above.<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span>          continue;<a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>        }<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span><a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>        if (mutation instanceof Put) {<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>          noOfPuts++;<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>        } else {<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>          noOfDeletes++;<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>        }<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span>      }<a name="line.3044"></a>
-<span class="sourceLineNo">3045</span><a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>      locked = true;<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span><a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>      // calling the pre CP hook for batch mutation<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>          return 0L;<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>        }<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>      }<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span><a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>      // STEP 3. Build WAL edit<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>          continue;<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>        }<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>        Mutation m = batchOp.getMutation(i);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>          durability = tmpDur;<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>        }<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>          continue;<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span>        }<a name="line.3075"></a>
-<span class="sourceLineNo">3076</span><a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>        long nonce = batchOp.getNonce(i);<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>          // Write what we have so far for nonces out to WAL<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>          walEdit = new WALEdit(replay);<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span>          currentNonceGroup = nonceGroup;<a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>          currentNonce = nonce;<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>        }<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span><a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>        // Add WAL edits by CP<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>        if (fromCP != null) {<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span>            walEdit.add(cell);<a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>          }<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>        }<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span>      }<a name="line.3098"></a>
-<span class="sourceLineNo">3099</span><a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>      WALKey walKey = null;<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>      if (replay) {<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>        // use wal key from the original<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3107"></a>
-<span class="sourceLineNo">3108</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>      }<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>      if (!walEdit.isEmpty()) {<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>        if (!replay) {<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>        }<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>        try {<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span>          long txid =<a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>          if (txid != 0) sync(txid, durability);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span>          writeEntry = walKey.getWriteEntry();<a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>        } catch (IOException ioe) {<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>          throw ioe;<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>        }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>      }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span>      if (walKey == null) {<a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>        writeEntry = mvcc.begin();<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>      }<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span><a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>      // STEP 5. Write back to memstore<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>      long addedSize = 0;<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>          continue;<a name="line.3139"></a>
+<span class="sourceLineNo">3027</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>        return 0L;<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span>      }<a name="line.3030"></a>
+<span class="sourceLineNo">3031</span><a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>        // skip invalid<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>          // lastIndexExclusive was incremented above.<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>          continue;<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span>        }<a name="line.3038"></a>
+<span class="sourceLineNo">3039</span><a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>        if (mutation instanceof Put) {<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>          noOfPuts++;<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>        } else {<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>          noOfDeletes++;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>        }<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span>        if (fromCP != null) {<a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>          cellCount += fromCP.size();<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>        }<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>        for (List&lt;Cell&gt; cells : familyMaps[i].values()) {<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span>          cellCount += cells.size();<a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>        }<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>      }<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>      walEdit = new WALEdit(cellCount, replay);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>      locked = true;<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span><a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>      // calling the pre CP hook for batch mutation<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>          return 0L;<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>        }<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>      }<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>      // STEP 3. Build WAL edit<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span>          continue;<a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>        }<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span><a name="line.3078"></a>
+<span class="sourceLineNo">3079</span>        Mutation m = batchOp.getMutation(i);<a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>          durability = tmpDur;<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>        }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>          continue;<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>        }<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span><a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>        long nonce = batchOp.getNonce(i);<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>          // Write what we have so far for nonces out to WAL<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>          walEdit = new WALEdit(cellCount, replay);<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>          currentNonceGroup = nonceGroup;<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>          currentNonce = nonce;<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>        }<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span><a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>        // Add WAL edits by CP<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span>        if (fromCP != null) {<a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>            walEdit.add(cell);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>          }<a name="line.3107"></a>
+<span class="sourceLineNo">3108</span>        }<a name="line.3108"></a>
+<span class="sourceLineNo">3109</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>      }<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span><a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>      WALKey walKey = null;<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>      if (replay) {<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>        // use wal key from the original<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>      }<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>      if (!walEdit.isEmpty()) {<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span>        if (!replay) {<a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>        }<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>        try {<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>          long txid =<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>          if (txid != 0) sync(txid, durability);<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>          writeEntry = walKey.getWriteEntry();<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>        } catch (IOException ioe) {<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>          throw ioe;<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span>        }<a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span>      }<a name="line.3143"></a>
-<span class="sourceLineNo">3144</span><a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>      // STEP 6. Complete mvcc.<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>      if (replay) {<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>        mvcc.completeAndWait(writeEntry);<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>        writeEntry = null;<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span>      }<a name="line.3151"></a>
-<span class="sourceLineNo">3152</span><a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>      // STEP 7. Release row locks, etc.<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>      if (locked) {<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span>        this.updatesLock.readLock().unlock();<a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>        locked = false;<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>      }<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>      // calling the post CP hook for batch mutation<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>      }<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span><a name="line.3167"></a>
-<span class="sourceLineNo">3168</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>        }<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>      }<a name="line.3172"></a>
-<span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>          // only for successful puts<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span>              != OperationStatusCode.SUCCESS) {<a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>            continue;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>          }<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>          Mutation m = batchOp.getMutation(i);<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>          if (m instanceof Put) {<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>          } else {<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>          }<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>        }<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>      }<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span><a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>      success = true;<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span>      return addedSize;<a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    } finally {<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>      if (locked) {<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span>        this.updatesLock.readLock().unlock();<a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>      }<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span><a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>      // See if the column families were consistent through the whole thing.<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>      // null will be treated as unknown.<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span><a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>      if (noOfPuts &gt; 0) {<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>        // There were some Puts in the batch.<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>        if (this.metricsRegion != null) {<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span>          this.metricsRegion.updatePut();<a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>        }<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>      }<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>      if (noOfDeletes &gt; 0) {<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>        // There were some Deletes in the batch.<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>        if (this.metricsRegion != null) {<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span>          this.metricsRegion.updateDelete();<a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>        }<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>      }<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>      if (!success) {<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>          }<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>        }<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>      }<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>        // call the coprocessor hook to do any finalization steps<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>        // after the put is done<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>                lastIndexExclusive);<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>      }<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span><a name="line.3236"></a>
-<span class="sourceLineNo">3237</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    }<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>  }<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>  throws IOException {<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    if (walEdit.isEmpty()) return;<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>  }<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span><a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>  throws IOException {<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    boolean skip = false;<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    // Skip anything that "ran" already<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>      return true;<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span>    }<a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span>    // store the family map reference to allow for mutations<a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    try {<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>      if (mutation instanceof Put) {<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>        // Check the families in the put. If bad, skip this one.<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>        if (batchOp.isInReplay()) {<a name="line.3271"></a>
-<span class="sourceLineNo">3272</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>        } else {<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>          checkFamilies(familyMap.keySet());<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>        }<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>      } else {<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span>        prepareDelete((Delete)mutation);<a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>      }<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>      skip = true;<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>      skip = true;<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    } catch (WrongRegionException we) {<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>      skip = true;<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    }<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    return skip;<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>  }<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>  /**<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>   * During replay, there could exist column families which are removed between region server<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>   * failure and replay<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>   */<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>        if (nonExistentList == null) {<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span>        }<a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>        nonExistentList.add(family);<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>      }<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>    }<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>    if (nonExistentList != null) {<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>      for (byte[] family : nonExistentList) {<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>        // Perhaps schema was changed between crash and replay<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>        familyMap.remove(family);<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>      }<a name="line.3319"></a>
-<span class="sourceLineNo">3320</span>    }<a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>  }<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span><a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>  /**<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span>   * Returns effective durability from the passed durability and<a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>   * the table descriptor.<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span>   */<a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>  }<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span><a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>  @Override<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      boolean writeToWAL)<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>  throws IOException{<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    checkMutationType(mutation, row);<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>      mutation, writeToWAL);<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>  }<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span><a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>  @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3343"></a>
-<span class="sourceLineNo">3344</span>      boolean writeToWAL)<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>  throws IOException {<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, rm, null,<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>      writeToWAL);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>  }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span><a name="line.3349"></a>
-<span class="sourceLineNo">3350</span>  /**<a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>   * checkAndMutate and checkAndRowMutate are 90% the same. Rather than copy/paste, below has<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>   * switches in the few places where there is deviation.<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span>   */<a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>  private boolean doCheckAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rowMutations,<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>      Mutation mutation, boolean writeToWAL)<a name="line.3356"></a>
+<span class="sourceLineNo">3141</span>      }<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>      if (walKey == null) {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>        writeEntry = mvcc.begin();<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>      }<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span><a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>      // STEP 5. Write back to memstore<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>      long addedSize = 0;<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>          continue;<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>        }<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>      }<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span><a name="line.3156"></a>
+<span class="sourceLineNo">3157</span>      // STEP 6. Complete mvcc.<a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>      if (replay) {<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span>        mvcc.completeAndWait(writeEntry);<a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>        writeEntry = null;<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>      }<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span><a name="line.3164"></a>
+<span class="sourceLineNo">3165</span>      // STEP 7. Release row locks, etc.<a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>      if (locked) {<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>        this.updatesLock.readLock().unlock();<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>        locked = false;<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span>      }<a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span><a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>      // calling the post CP hook for batch mutation<a name="line.3172"></a>
+<span class="sourceLineNo">3173</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3173"></a>
+<span class="sourceLineNo">3174</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span>      }<a name="line.3178"></a>
+<span class="sourceLineNo">3179</span><a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span>        }<a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>      }<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span><a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span>          // only for successful puts<a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>              != OperationStatusCode.SUCCESS) {<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>            continue;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>          }<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span>          Mutation m = batchOp.getMutation(i);<a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>          if (m instanceof Put) {<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>          } else {<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>          }<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>        }<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>      }<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>      success = true;<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>      return addedSize;<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    } finally {<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>      if (locked) {<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>        this.updatesLock.readLock().unlock();<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>      }<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span><a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>      // See if the column families were consistent through the whole thing.<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>      // null will be treated as unknown.<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span><a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>      if (noOfPuts &gt; 0) {<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span>        // There were some Puts in the batch.<a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>        if (this.metricsRegion != null) {<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>          this.metricsRegion.updatePut();<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>        }<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>      }<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>      if (noOfDeletes &gt; 0) {<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span>        // There were some Deletes in the batch.<a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>        if (this.metricsRegion != null) {<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>          this.metricsRegion.updateDelete();<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>        }<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>      }<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span>      if (!success) {<a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>          }<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>        }<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>      }<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>        // call the coprocessor hook to do any finalization steps<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span>        // after the put is done<a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>                lastIndexExclusive);<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span>      }<a name="line.3247"></a>
+<span class="sourceLineNo">3248</span><a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span>    }<a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>  }<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span><a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  throws IOException {<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span>    if (walEdit.isEmpty()) return;<a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  }<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span><a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>  throws IOException {<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    boolean skip = false;<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    // Skip anything that "ran" already<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3271"></a>
+<span class="sourceLineNo">3272</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3272"></a>
+<span class="sourceLineNo">3273</span>      return true;<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    }<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span>    // store the family map reference to allow for mutations<a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span><a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    try {<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>      if (mutation instanceof Put) {<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span>        // Check the families in the put. If bad, skip this one.<a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>        if (batchOp.isInReplay()) {<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>        } else {<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>          checkFamilies(familyMap.keySet());<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>        }<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>      } else {<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>        prepareDelete((Delete)mutation);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>      }<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span>      skip = true;<a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>      skip = true;<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    } catch (WrongRegionException we) {<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>      skip = true;<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    }<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span>    return skip;<a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>  }<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span><a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>  /**<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>   * During replay, there could exist column families which are removed between region server<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>   * failure and replay<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3319"></a>
+<span class="sourceLineNo">3320</span>        if (nonExistentList == null) {<a name="line.3320"></a>
+<span class="sourceLineNo">3321</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>        }<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>        nonExistentList.add(family);<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>      }<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>    }<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>    if (nonExistentList != null) {<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>      for (byte[] family : nonExistentList) {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>        // Perhaps schema was changed between crash and replay<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span>        familyMap.remove(family);<a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>      }<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    }<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>  }<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>  /**<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span>   * Returns effective durability from the passed durability and<a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>   * the table descriptor.<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>   */<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>  }<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span><a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>  @Override<a name="line.3343"></a>
+<span class="sourceLineNo">3344</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3344"></a>
+<span class="sourceLineNo">3345</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>      boolean writeToWAL)<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span>  throws IOException{<a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    checkMutationType(mutation, row);<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>      mutation, writeToWAL);<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>  }<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span><a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>  @Override<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      boolean writeToWAL)<a name="line.3356"></a>
 <span class="sourceLineNo">3357</span>  throws IOException {<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // Could do the below checks but seems wacky with two callers only. Just comment out for now.<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // One caller passes a Mutation, the other passes RowMutation. Presume all good so we don't<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // need these commented out checks.<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // if (rowMutations == null &amp;&amp; mutation == null) throw new DoNotRetryIOException("Both null");<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // if (rowMutations != null &amp;&amp; mutation != null) throw new DoNotRetryIOException("Both set");<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    checkReadOnly();<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // TODO, add check for value length also move this check to the client<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span>    checkResources();<a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    startRegionOperation();<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    try {<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>      Get get = new Get(row);<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>      checkFamily(family);<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>      get.addColumn(family, qualifier);<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>      // Lock row - note that doBatchMutate will relock this row if called<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>      RowLock rowLock = getRowLock(get.getRow());<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>      try {<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>        if (mutation != null &amp;&amp; this.getCoprocessorHost() != null) {<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>          // Call coprocessor.<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>          Boolean processed = null;<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>          if (mutation instanceof Put) {<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>            processed = this.getCoprocessorHost().preCheckAndPutAfterRowLock(row, family,<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>                qualifier, compareOp, comparator, (Put)mutation);<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>          } else if (mutation instanceof Delete) {<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>            processed = this.getCoprocessorHost().preCheckAndDeleteAfterRowLock(row, family,<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span>                qualifier, compareOp, comparator, (Delete)mutation);<a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>          }<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>          if (processed != null) {<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>            return processed;<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>          }<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>        }<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>        // NOTE: We used to wait here until mvcc caught up:  mvcc.await();<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        // Supposition is that now all changes are done under row locks, then when we go to read,<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>        // we'll get the latest on this row.<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        List&lt;Cell&gt; result = get(get, false);<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>        boolean valueIsNull = comparator.getValue() == null || comparator.getValue().length == 0;<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        boolean matches = false;<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>        long cellTs = 0;<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        if (result.size() == 0 &amp;&amp; valueIsNull) {<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>          matches = true;<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>        } else if (result.size() &gt; 0 &amp;&amp; result.get(0).getValueLength() == 0 &amp;&amp; valueIsNull) {<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>          matches = true;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>          cellTs = result.get(0).getTimestamp();<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        } else if (result.size() == 1 &amp;&amp; !valueIsNull) {<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>          Cell kv = result.get(0);<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>          cellTs = kv.getTimestamp();<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>          int compareResult = CellComparator.compareValue(kv, comparator);<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span>          matches = matches(compareOp, compareResult);<a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>        }<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>        // If matches put the new put or delete the new delete<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>        if (matches) {<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>          // We have acquired the row lock already. I

<TRUNCATED>

[20/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatch.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatch.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatch.html
index fbdde18..1d64963 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatch.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatch.html
@@ -2959,7 +2959,7 @@
 <span class="sourceLineNo">2951</span>    Set&lt;byte[]&gt; deletesCfSet = null;<a name="line.2951"></a>
 <span class="sourceLineNo">2952</span>    long currentNonceGroup = HConstants.NO_NONCE;<a name="line.2952"></a>
 <span class="sourceLineNo">2953</span>    long currentNonce = HConstants.NO_NONCE;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    WALEdit walEdit = new WALEdit(replay);<a name="line.2954"></a>
+<span class="sourceLineNo">2954</span>    WALEdit walEdit = null;<a name="line.2954"></a>
 <span class="sourceLineNo">2955</span>    boolean locked = false;<a name="line.2955"></a>
 <span class="sourceLineNo">2956</span>    // reference family maps directly so coprocessors can mutate them if desired<a name="line.2956"></a>
 <span class="sourceLineNo">2957</span>    Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps = new Map[batchOp.operations.length];<a name="line.2957"></a>
@@ -2970,4878 +2970,4890 @@
 <span class="sourceLineNo">2962</span>    int noOfPuts = 0;<a name="line.2962"></a>
 <span class="sourceLineNo">2963</span>    int noOfDeletes = 0;<a name="line.2963"></a>
 <span class="sourceLineNo">2964</span>    WriteEntry writeEntry = null;<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    try {<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>      int numReadyToWrite = 0;<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>          lastIndexExclusive++;<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>          continue;<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>        }<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>        RowLock rowLock = null;<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>        try {<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>        } catch (IOException ioe) {<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span>        }<a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>        if (rowLock == null) {<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>          // We failed to grab another lock<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>          break; // Stop acquiring more rows for this batch<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>        } else {<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>          acquiredRowLocks.add(rowLock);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span>        }<a name="line.2989"></a>
-<span class="sourceLineNo">2990</span><a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>        lastIndexExclusive++;<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>        numReadyToWrite++;<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span><a name="line.2993"></a>
-<span class="sourceLineNo">2994</span>        if (mutation instanceof Put) {<a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>          // If Column Families stay consistent through out all of the<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>          // individual puts then metrics can be reported as a multiput across<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>          // column families in the first put.<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>          if (putsCfSet == null) {<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>          } else {<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span>          }<a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>        } else {<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>          if (deletesCfSet == null) {<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>          } else {<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>          }<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span>        }<a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>      }<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span><a name="line.3013"></a>
-<span class="sourceLineNo">3014</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3014"></a>
-<span class="sourceLineNo">3015</span><a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3020"></a>
-<span class="sourceLineNo">3021</span><a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>        return 0L;<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>      }<a name="line.3025"></a>
+<span class="sourceLineNo">2965</span>    int cellCount = 0;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    try {<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>      int numReadyToWrite = 0;<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>          lastIndexExclusive++;<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span>          continue;<a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>        }<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>        RowLock rowLock = null;<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span>        try {<a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>        } catch (IOException ioe) {<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>        }<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>        if (rowLock == null) {<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>          // We failed to grab another lock<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span>          break; // Stop acquiring more rows for this batch<a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>        } else {<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>          acquiredRowLocks.add(rowLock);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>        }<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span><a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>        lastIndexExclusive++;<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span>        numReadyToWrite++;<a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>        if (replay) {<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>          for (List&lt;Cell&gt; cells : mutation.getFamilyCellMap().values()) {<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>            cellCount += cells.size();<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>          }<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>        }<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span>        if (mutation instanceof Put) {<a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>          // If Column Families stay consistent through out all of the<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>          // individual puts then metrics can be reported as a multiput across<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>          // column families in the first put.<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>          if (putsCfSet == null) {<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>          } else {<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>          }<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>        } else {<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>          if (deletesCfSet == null) {<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>          } else {<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>          }<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>        }<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>      }<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span><a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span><a name="line.3020"></a>
+<span class="sourceLineNo">3021</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3025"></a>
 <span class="sourceLineNo">3026</span><a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span>        // skip invalid<a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>          // lastIndexExclusive was incremented above.<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span>          continue;<a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>        }<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span><a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>        if (mutation instanceof Put) {<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>          noOfPuts++;<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>        } else {<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>          noOfDeletes++;<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>        }<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span>      }<a name="line.3044"></a>
-<span class="sourceLineNo">3045</span><a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>      locked = true;<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span><a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>      // calling the pre CP hook for batch mutation<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>          return 0L;<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>        }<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>      }<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span><a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>      // STEP 3. Build WAL edit<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>          continue;<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>        }<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>        Mutation m = batchOp.getMutation(i);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>          durability = tmpDur;<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>        }<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>          continue;<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span>        }<a name="line.3075"></a>
-<span class="sourceLineNo">3076</span><a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>        long nonce = batchOp.getNonce(i);<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>          // Write what we have so far for nonces out to WAL<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>          walEdit = new WALEdit(replay);<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span>          currentNonceGroup = nonceGroup;<a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>          currentNonce = nonce;<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>        }<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span><a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>        // Add WAL edits by CP<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>        if (fromCP != null) {<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span>            walEdit.add(cell);<a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>          }<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>        }<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span>      }<a name="line.3098"></a>
-<span class="sourceLineNo">3099</span><a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>      WALKey walKey = null;<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>      if (replay) {<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>        // use wal key from the original<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3107"></a>
-<span class="sourceLineNo">3108</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>      }<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>      if (!walEdit.isEmpty()) {<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>        if (!replay) {<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>        }<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>        try {<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span>          long txid =<a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>          if (txid != 0) sync(txid, durability);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span>          writeEntry = walKey.getWriteEntry();<a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>        } catch (IOException ioe) {<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>          throw ioe;<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>        }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>      }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span>      if (walKey == null) {<a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>        writeEntry = mvcc.begin();<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>      }<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span><a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>      // STEP 5. Write back to memstore<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>      long addedSize = 0;<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>          continue;<a name="line.3139"></a>
+<span class="sourceLineNo">3027</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>        return 0L;<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span>      }<a name="line.3030"></a>
+<span class="sourceLineNo">3031</span><a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>        // skip invalid<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>          // lastIndexExclusive was incremented above.<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>          continue;<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span>        }<a name="line.3038"></a>
+<span class="sourceLineNo">3039</span><a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>        if (mutation instanceof Put) {<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>          noOfPuts++;<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>        } else {<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>          noOfDeletes++;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>        }<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span>        if (fromCP != null) {<a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>          cellCount += fromCP.size();<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>        }<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>        for (List&lt;Cell&gt; cells : familyMaps[i].values()) {<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span>          cellCount += cells.size();<a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>        }<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>      }<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>      walEdit = new WALEdit(cellCount, replay);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>      locked = true;<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span><a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>      // calling the pre CP hook for batch mutation<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>          return 0L;<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>        }<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>      }<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>      // STEP 3. Build WAL edit<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span>          continue;<a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>        }<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span><a name="line.3078"></a>
+<span class="sourceLineNo">3079</span>        Mutation m = batchOp.getMutation(i);<a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>          durability = tmpDur;<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>        }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>          continue;<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>        }<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span><a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>        long nonce = batchOp.getNonce(i);<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>          // Write what we have so far for nonces out to WAL<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>          walEdit = new WALEdit(cellCount, replay);<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>          currentNonceGroup = nonceGroup;<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>          currentNonce = nonce;<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>        }<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span><a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>        // Add WAL edits by CP<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span>        if (fromCP != null) {<a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>            walEdit.add(cell);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>          }<a name="line.3107"></a>
+<span class="sourceLineNo">3108</span>        }<a name="line.3108"></a>
+<span class="sourceLineNo">3109</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>      }<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span><a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>      WALKey walKey = null;<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>      if (replay) {<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>        // use wal key from the original<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>      }<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>      if (!walEdit.isEmpty()) {<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span>        if (!replay) {<a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>        }<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>        try {<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>          long txid =<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>          if (txid != 0) sync(txid, durability);<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>          writeEntry = walKey.getWriteEntry();<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>        } catch (IOException ioe) {<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>          throw ioe;<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span>        }<a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span>      }<a name="line.3143"></a>
-<span class="sourceLineNo">3144</span><a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>      // STEP 6. Complete mvcc.<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>      if (replay) {<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>        mvcc.completeAndWait(writeEntry);<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>        writeEntry = null;<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span>      }<a name="line.3151"></a>
-<span class="sourceLineNo">3152</span><a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>      // STEP 7. Release row locks, etc.<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>      if (locked) {<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span>        this.updatesLock.readLock().unlock();<a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>        locked = false;<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>      }<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>      // calling the post CP hook for batch mutation<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>      }<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span><a name="line.3167"></a>
-<span class="sourceLineNo">3168</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>        }<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>      }<a name="line.3172"></a>
-<span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>          // only for successful puts<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span>              != OperationStatusCode.SUCCESS) {<a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>            continue;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>          }<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>          Mutation m = batchOp.getMutation(i);<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>          if (m instanceof Put) {<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>          } else {<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>          }<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>        }<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>      }<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span><a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>      success = true;<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span>      return addedSize;<a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    } finally {<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>      if (locked) {<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span>        this.updatesLock.readLock().unlock();<a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>      }<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span><a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>      // See if the column families were consistent through the whole thing.<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>      // null will be treated as unknown.<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span><a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>      if (noOfPuts &gt; 0) {<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>        // There were some Puts in the batch.<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>        if (this.metricsRegion != null) {<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span>          this.metricsRegion.updatePut();<a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>        }<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>      }<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>      if (noOfDeletes &gt; 0) {<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>        // There were some Deletes in the batch.<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>        if (this.metricsRegion != null) {<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span>          this.metricsRegion.updateDelete();<a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>        }<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>      }<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>      if (!success) {<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>          }<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>        }<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>      }<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>        // call the coprocessor hook to do any finalization steps<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>        // after the put is done<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>                lastIndexExclusive);<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>      }<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span><a name="line.3236"></a>
-<span class="sourceLineNo">3237</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    }<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>  }<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>  throws IOException {<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    if (walEdit.isEmpty()) return;<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>  }<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span><a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>  throws IOException {<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    boolean skip = false;<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    // Skip anything that "ran" already<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>      return true;<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span>    }<a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span>    // store the family map reference to allow for mutations<a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    try {<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>      if (mutation instanceof Put) {<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>        // Check the families in the put. If bad, skip this one.<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>        if (batchOp.isInReplay()) {<a name="line.3271"></a>
-<span class="sourceLineNo">3272</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>        } else {<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>          checkFamilies(familyMap.keySet());<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>        }<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>      } else {<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span>        prepareDelete((Delete)mutation);<a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>      }<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>      skip = true;<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>      skip = true;<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    } catch (WrongRegionException we) {<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>      skip = true;<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    }<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    return skip;<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>  }<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>  /**<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>   * During replay, there could exist column families which are removed between region server<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>   * failure and replay<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>   */<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>        if (nonExistentList == null) {<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span>        }<a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>        nonExistentList.add(family);<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>      }<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>    }<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>    if (nonExistentList != null) {<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>      for (byte[] family : nonExistentList) {<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>        // Perhaps schema was changed between crash and replay<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>        familyMap.remove(family);<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>      }<a name="line.3319"></a>
-<span class="sourceLineNo">3320</span>    }<a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>  }<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span><a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>  /**<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span>   * Returns effective durability from the passed durability and<a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>   * the table descriptor.<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span>   */<a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>  }<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span><a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>  @Override<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      boolean writeToWAL)<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>  throws IOException{<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    checkMutationType(mutation, row);<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>      mutation, writeToWAL);<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>  }<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span><a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>  @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3343"></a>
-<span class="sourceLineNo">3344</span>      boolean writeToWAL)<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>  throws IOException {<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, rm, null,<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>      writeToWAL);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>  }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span><a name="line.3349"></a>
-<span class="sourceLineNo">3350</span>  /**<a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>   * checkAndMutate and checkAndRowMutate are 90% the same. Rather than copy/paste, below has<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>   * switches in the few places where there is deviation.<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span>   */<a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>  private boolean doCheckAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rowMutations,<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>      Mutation mutation, boolean writeToWAL)<a name="line.3356"></a>
+<span class="sourceLineNo">3141</span>      }<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>      if (walKey == null) {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>        writeEntry = mvcc.begin();<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>      }<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span><a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>      // STEP 5. Write back to memstore<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>      long addedSize = 0;<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>          continue;<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>        }<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>      }<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span><a name="line.3156"></a>
+<span class="sourceLineNo">3157</span>      // STEP 6. Complete mvcc.<a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>      if (replay) {<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span>        mvcc.completeAndWait(writeEntry);<a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>        writeEntry = null;<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>      }<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span><a name="line.3164"></a>
+<span class="sourceLineNo">3165</span>      // STEP 7. Release row locks, etc.<a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>      if (locked) {<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>        this.updatesLock.readLock().unlock();<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>        locked = false;<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span>      }<a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span><a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>      // calling the post CP hook for batch mutation<a name="line.3172"></a>
+<span class="sourceLineNo">3173</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3173"></a>
+<span class="sourceLineNo">3174</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span>      }<a name="line.3178"></a>
+<span class="sourceLineNo">3179</span><a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span>        }<a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>      }<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span><a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span>          // only for successful puts<a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>              != OperationStatusCode.SUCCESS) {<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>            continue;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>          }<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span>          Mutation m = batchOp.getMutation(i);<a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>          if (m instanceof Put) {<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>          } else {<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>          }<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>        }<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>      }<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>      success = true;<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>      return addedSize;<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    } finally {<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>      if (locked) {<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>        this.updatesLock.readLock().unlock();<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>      }<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span><a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>      // See if the column families were consistent through the whole thing.<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>      // null will be treated as unknown.<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span><a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>      if (noOfPuts &gt; 0) {<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span>        // There were some Puts in the batch.<a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>        if (this.metricsRegion != null) {<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>          this.metricsRegion.updatePut();<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>        }<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>      }<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>      if (noOfDeletes &gt; 0) {<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span>        // There were some Deletes in the batch.<a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>        if (this.metricsRegion != null) {<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>          this.metricsRegion.updateDelete();<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>        }<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>      }<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span>      if (!success) {<a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>          }<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>        }<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>      }<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>        // call the coprocessor hook to do any finalization steps<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span>        // after the put is done<a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>                lastIndexExclusive);<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span>      }<a name="line.3247"></a>
+<span class="sourceLineNo">3248</span><a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span>    }<a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>  }<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span><a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  throws IOException {<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span>    if (walEdit.isEmpty()) return;<a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  }<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span><a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>  throws IOException {<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    boolean skip = false;<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    // Skip anything that "ran" already<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3271"></a>
+<span class="sourceLineNo">3272</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3272"></a>
+<span class="sourceLineNo">3273</span>      return true;<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    }<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span>    // store the family map reference to allow for mutations<a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span><a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    try {<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>      if (mutation instanceof Put) {<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span>        // Check the families in the put. If bad, skip this one.<a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>        if (batchOp.isInReplay()) {<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>        } else {<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>          checkFamilies(familyMap.keySet());<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>        }<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>      } else {<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>        prepareDelete((Delete)mutation);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>      }<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span>      skip = true;<a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>      skip = true;<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    } catch (WrongRegionException we) {<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>      skip = true;<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    }<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span>    return skip;<a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>  }<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span><a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>  /**<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>   * During replay, there could exist column families which are removed between region server<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>   * failure and replay<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3319"></a>
+<span class="sourceLineNo">3320</span>        if (nonExistentList == null) {<a name="line.3320"></a>
+<span class="sourceLineNo">3321</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>        }<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>        nonExistentList.add(family);<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>      }<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>    }<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>    if (nonExistentList != null) {<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>      for (byte[] family : nonExistentList) {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>        // Perhaps schema was changed between crash and replay<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span>        familyMap.remove(family);<a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>      }<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    }<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>  }<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>  /**<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span>   * Returns effective durability from the passed durability and<a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>   * the table descriptor.<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>   */<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>  }<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span><a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>  @Override<a name="line.3343"></a>
+<span class="sourceLineNo">3344</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3344"></a>
+<span class="sourceLineNo">3345</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>      boolean writeToWAL)<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span>  throws IOException{<a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    checkMutationType(mutation, row);<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>      mutation, writeToWAL);<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>  }<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span><a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>  @Override<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      boolean writeToWAL)<a name="line.3356"></a>
 <span class="sourceLineNo">3357</span>  throws IOException {<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // Could do the below checks but seems wacky with two callers only. Just comment out for now.<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // One caller passes a Mutation, the other passes RowMutation. Presume all good so we don't<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // need these commented out checks.<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // if (rowMutations == null &amp;&amp; mutation == null) throw new DoNotRetryIOException("Both null");<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // if (rowMutations != null &amp;&amp; mutation != null) throw new DoNotRetryIOException("Both set");<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    checkReadOnly();<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // TODO, add check for value length also move this check to the client<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span>    checkResources();<a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    startRegionOperation();<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    try {<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>      Get get = new Get(row);<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>      checkFamily(family);<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>      get.addColumn(family, qualifier);<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>      // Lock row - note that doBatchMutate will relock this row if called<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>      RowLock rowLock = getRowLock(get.getRow());<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>      try {<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>        if (mutation != null &amp;&amp; this.getCoprocessorHost() != null) {<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>          // Call coprocessor.<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>          Boolean processed = null;<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>          if (mutation instanceof Put) {<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>            processed = this.getCoprocessorHost().preCheckAndPutAfterRowLock(row, family,<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>                qualifier, compareOp, comparator, (Put)mutation);<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>          } else if (mutation instanceof Delete) {<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>            processed = this.getCoprocessorHost().preCheckAndDeleteAfterRowLock(row, family,<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span>                qualifier, compareOp, comparator, (Delete)mutation);<a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>          }<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>          if (processed != null) {<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>            return processed;<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>          }<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>        }<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>        // NOTE: We used to wait here until mvcc caught up:  mvcc.await();<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        // Supposition is that now all changes are done under row locks, then when we go to read,<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>        // we'll get the latest on this row.<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        List&lt;Cell&gt; result = get(get, false);<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>        boolean valueIsNull = comparator.getValue() == null || comparator.getValue().length == 0;<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        boolean matches = false;<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>        long cellTs = 0;<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        if (result.size() == 0 &amp;&amp; valueIsNull) {<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>          matches = true;<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>        } else if (result.size() &gt; 0 &amp;&amp; result.get(0).getValueLength() == 0 &amp;&amp; valueIsNull) {<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>          matches = true;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>          cellTs = result.get(0).getTimestamp();<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        } else if (result.size() == 1 &amp;&amp; !valueIsNull) {<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>          Cell kv = result.get(0);<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>          cellTs = kv.getTimestamp();<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>          int compareResult = CellComparator.compareValue(kv, comparator);<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span>          matches = matches(compareOp, compareResult);<a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>        }<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>        // If matches put the new put or delete the new delete<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>        if (matches) {<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>          // We have acquired the row lock already. If the syst

<TRUNCATED>

[44/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/mapreduce/TableSplit.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/TableSplit.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/TableSplit.html
index 37d50ed..27922c3 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/TableSplit.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/TableSplit.html
@@ -675,7 +675,7 @@ public static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../
 <ul class="blockList">
 <li class="blockList">
 <h4>compareTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html#line.320">compareTo</a>(<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.html" title="class in org.apache.hadoop.hbase.mapreduce">TableSplit</a>&nbsp;split)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html#line.331">compareTo</a>(<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.html" title="class in org.apache.hadoop.hbase.mapreduce">TableSplit</a>&nbsp;split)</pre>
 <div class="block">Compares this split against the given one.</div>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -690,7 +690,7 @@ public static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../
 <ul class="blockList">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html#line.330">equals</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;o)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html#line.341">equals</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;o)</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -703,7 +703,7 @@ public static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../
 <ul class="blockListLast">
 <li class="blockList">
 <h4>hashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html#line.341">hashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html#line.352">hashCode</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.lang">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index e166280..8697762 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -267,9 +267,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="strong">SyncTable.SyncMapper.Counter</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="strong">TableSplit.Version</span></a></li>
 <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="strong">CellCounter.CellCounterMapper.Counters</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="strong">SyncTable.SyncMapper.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="strong">RowCounter.RowCounterMapper.Counters</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/master/LoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/LoadBalancer.html b/devapidocs/org/apache/hadoop/hbase/master/LoadBalancer.html
index 2d881ad..a2d2ca1 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/LoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/LoadBalancer.html
@@ -96,7 +96,7 @@
 <hr>
 <br>
 <pre><a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Private.html" title="annotation in org.apache.hadoop.hbase.classification">@InterfaceAudience.Private</a>
-public interface <a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.53">LoadBalancer</a>
+public interface <a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.49">LoadBalancer</a>
 extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/hadoop/hbase/Stoppable.html" title="interface in org.apache.hadoop.hbase">Stoppable</a>, <a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationObserver.html" title="interface in org.apache.hadoop.hbase.conf">ConfigurationObserver</a></pre>
 <div class="block">Makes decisions about the placement and movement of Regions across
  RegionServers.
@@ -104,10 +104,6 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
  <p>Cluster-wide load balancing will occur only when there are no regions in
  transition and according to a fixed period of a time using <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#balanceCluster(java.util.Map)"><code>balanceCluster(Map)</code></a>.
 
- <p>Inline region placement with <a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)"><code>immediateAssignment(java.util.List&lt;org.apache.hadoop.hbase.HRegionInfo&gt;, java.util.List&lt;org.apache.hadoop.hbase.ServerName&gt;)</code></a> can be used when
- the Master needs to handle closed regions that it currently does not have
- a destination set for.  This can happen during master failover.
-
  <p>On cluster startup, bulk assignment can be used to determine
  locations for all Regions in a cluster.
 
@@ -144,66 +140,59 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 </td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)">immediateAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
-                                      <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
-<div class="block">Sync assign a region</div>
-</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#initialize()">initialize</a></strong>()</code>
 <div class="block">Initialize the load balancer.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#onConfigurationChange(org.apache.hadoop.conf.Configuration)">onConfigurationChange</a></strong>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>
 <div class="block">This method would be called by the <a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf"><code>ConfigurationManager</code></a>
  object when the <code>Configuration</code> object is reloaded from disk.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#randomAssignment(org.apache.hadoop.hbase.HRegionInfo,%20java.util.List)">randomAssignment</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Get a random region server from the list</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#regionOffline(org.apache.hadoop.hbase.HRegionInfo)">regionOffline</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>
 <div class="block">Marks the region as offline at balancer.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#regionOnline(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.ServerName)">regionOnline</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                         <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</code>
 <div class="block">Marks the region as online at balancer.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Assign regions to the previously hosting region server</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#roundRobinAssignment(java.util.List,%20java.util.List)">roundRobinAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                         <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Perform a Round Robin assignment of regions.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setClusterStatus(org.apache.hadoop.hbase.ClusterStatus)">setClusterStatus</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/ClusterStatus.html" title="class in org.apache.hadoop.hbase">ClusterStatus</a>&nbsp;st)</code>
 <div class="block">Set the current cluster status.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#setMasterServices(org.apache.hadoop.hbase.master.MasterServices)">setMasterServices</a></strong>(<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>
@@ -244,7 +233,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>setClusterStatus</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.59">setClusterStatus</a>(<a href="../../../../../org/apache/hadoop/hbase/ClusterStatus.html" title="class in org.apache.hadoop.hbase">ClusterStatus</a>&nbsp;st)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.55">setClusterStatus</a>(<a href="../../../../../org/apache/hadoop/hbase/ClusterStatus.html" title="class in org.apache.hadoop.hbase">ClusterStatus</a>&nbsp;st)</pre>
 <div class="block">Set the current cluster status.  This allows a LoadBalancer to map host name to a server</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>st</code> - </dd></dl>
 </li>
@@ -255,7 +244,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>setMasterServices</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.66">setMasterServices</a>(<a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;masterServices)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.62">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">Set the master service.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>masterServices</code> - </dd></dl>
 </li>
@@ -266,7 +255,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>balanceCluster</h4>
-<pre><a href="http://docs.oracle.com/javase/7/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/LoadBalancer.html#line.74">balanceCluster</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre><a href="http://docs.oracle.com/javase/7/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/LoadBalancer.html#line.70">balanceCluster</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                               <a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;clusterState)
                                 throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block">Perform the major balance operation</div>
@@ -282,7 +271,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>balanceCluster</h4>
-<pre><a href="http://docs.oracle.com/javase/7/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/LoadBalancer.html#line.82">balanceCluster</a>(<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;clusterState)
+<pre><a href="http://docs.oracle.com/javase/7/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/LoadBalancer.html#line.78">balanceCluster</a>(<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;clusterState)
                                 throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block">Perform the major balance operation</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>clusterState</code> - </dd>
@@ -297,7 +286,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>roundRobinAssignment</h4>
-<pre><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.91">roundRobinAssignment</a>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
+<pre><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.87">roundRobinAssignment</a>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                                      <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)
                                                        throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block">Perform a Round Robin assignment of regions.</div>
@@ -314,7 +303,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <li class="blockList">
 <h4>retainAssignment</h4>
 <pre><a href="http://docs.oracle.com/javase/7/docs/api/javax/annotation/Nullable.html?is-external=true" title="class or interface in javax.annotation">@Nullable</a>
-<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.103">retainAssignment</a>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apa
 che.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
+<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.99">retainAssignment</a>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apac
 he.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                                                           <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)
                                                    throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block">Assign regions to the previously hosting region server</div>
@@ -324,29 +313,13 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></code></dd></dl>
 </li>
 </ul>
-<a name="immediateAssignment(java.util.List, java.util.List)">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>immediateAssignment</h4>
-<pre><a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.114">immediateAssignment</a>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
-                                              <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)
-                                                throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
-<div class="block">Sync assign a region</div>
-<dl><dt><span class="strong">Parameters:</span></dt><dd><code>regions</code> - </dd><dd><code>servers</code> - </dd>
-<dt><span class="strong">Returns:</span></dt><dd>Map regioninfos to servernames</dd>
-<dt><span class="strong">Throws:</span></dt>
-<dd><code><a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></code></dd></dl>
-</li>
-</ul>
 <a name="randomAssignment(org.apache.hadoop.hbase.HRegionInfo, java.util.List)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>randomAssignment</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.125">randomAssignment</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
+<pre><a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.110">randomAssignment</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                           <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)
                             throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block">Get a random region server from the list</div>
@@ -362,7 +335,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>initialize</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.133">initialize</a>()
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.118">initialize</a>()
                 throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block">Initialize the load balancer. Must be called after setters.</div>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -375,7 +348,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>regionOnline</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.140">regionOnline</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.125">regionOnline</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                 <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</pre>
 <div class="block">Marks the region as online at balancer.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>regionInfo</code> - </dd><dd><code>sn</code> - </dd></dl>
@@ -387,7 +360,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockList">
 <li class="blockList">
 <h4>regionOffline</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.146">regionOffline</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.131">regionOffline</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
 <div class="block">Marks the region as offline at balancer.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>regionInfo</code> - </dd></dl>
 </li>
@@ -398,7 +371,7 @@ extends org.apache.hadoop.conf.Configurable, <a href="../../../../../org/apache/
 <ul class="blockListLast">
 <li class="blockList">
 <h4>onConfigurationChange</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.152">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/LoadBalancer.html#line.137">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationObserver.html#onConfigurationChange(org.apache.hadoop.conf.Configuration)">ConfigurationObserver</a></code></strong></div>
 <div class="block">This method would be called by the <a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf"><code>ConfigurationManager</code></a>
  object when the <code>Configuration</code> object is reloaded from disk.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
index 709514e..d778df2 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html
@@ -242,7 +242,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <tr class="rowColor">
 <td class="colFirst"><code>protected </code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#BaseLoadBalancer(org.apache.hadoop.hbase.master.balancer.MetricsBalancer)">BaseLoadBalancer</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/MetricsBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">MetricsBalancer</a>&nbsp;metricsBalancer)</code>
-<div class="block">This Constructor accepts an instance of MetricsBalancer, 
+<div class="block">This Constructor accepts an instance of MetricsBalancer,
  which will be used instead of creating a new one</div>
 </td>
 </tr>
@@ -303,35 +303,27 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 </td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
-<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)">immediateAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
-                                      <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
-<div class="block">Generates an immediate assignment plan to be used by a new master for
- regions in transition that do not have an already known destination.</div>
-</td>
-</tr>
-<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#initialize()">initialize</a></strong>()</code>
 <div class="block">Initialize the load balancer.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#isStopped()">isStopped</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#needsBalance(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster)">needsBalance</a></strong>(<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)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#onConfigurationChange(org.apache.hadoop.conf.Configuration)">onConfigurationChange</a></strong>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>
 <div class="block">This method would be called by the <a href="../../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf"><code>ConfigurationManager</code></a>
  object when the <code>Configuration</code> object is reloaded from disk.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#randomAssignment(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster,%20org.apache.hadoop.hbase.HRegionInfo,%20java.util.List)">randomAssignment</a></strong>(<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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
@@ -339,27 +331,27 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <div class="block">Used to assign a single region to a random server.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#randomAssignment(org.apache.hadoop.hbase.HRegionInfo,%20java.util.List)">randomAssignment</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Used to assign a single region to a random server.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOffline(org.apache.hadoop.hbase.HRegionInfo)">regionOffline</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>
 <div class="block">Marks the region as offline at balancer.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOnline(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.ServerName)">regionOnline</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                         <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</code>
 <div class="block">Marks the region as online at balancer.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
@@ -368,7 +360,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
  available/online servers available for assignment.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster,%20java.util.List,%20java.util.List,%20java.util.List,%20java.util.Map)">roundRobinAssignment</a></strong>(<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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
@@ -378,7 +370,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <div class="block">Round robin a list of regions to a list of servers</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment(java.util.List,%20java.util.List)">roundRobinAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                         <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
@@ -386,43 +378,43 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
  simple round-robin assignment.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setClusterStatus(org.apache.hadoop.hbase.ClusterStatus)">setClusterStatus</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/ClusterStatus.html" title="class in org.apache.hadoop.hbase">ClusterStatus</a>&nbsp;st)</code>
 <div class="block">Set the current cluster status.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setConf(org.apache.hadoop.conf.Configuration)">setConf</a></strong>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setMasterServices(org.apache.hadoop.hbase.master.MasterServices)">setMasterServices</a></strong>(<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 class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setRackManager(org.apache.hadoop.hbase.master.RackManager)">setRackManager</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/master/RackManager.html" title="class in org.apache.hadoop.hbase.master">RackManager</a>&nbsp;rackManager)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setSlop(org.apache.hadoop.conf.Configuration)">setSlop</a></strong>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#shouldBeOnMaster(org.apache.hadoop.hbase.HRegionInfo)">shouldBeOnMaster</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region)</code>
 <div class="block">Check if a region belongs to some small system table.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#stop(java.lang.String)">stop</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;why)</code>
 <div class="block">Stop this service.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#tablesOnMaster(org.apache.hadoop.conf.Configuration)">tablesOnMaster</a></strong>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>
 <div class="block">Check if configured to put any tables on the active master</div>
@@ -628,7 +620,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <li class="blockList">
 <h4>BaseLoadBalancer</h4>
 <pre>protected&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.96">BaseLoadBalancer</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/MetricsBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">MetricsBalancer</a>&nbsp;metricsBalancer)</pre>
-<div class="block">This Constructor accepts an instance of MetricsBalancer, 
+<div class="block">This Constructor accepts an instance of MetricsBalancer,
  which will be used instead of creating a new one</div>
 </li>
 </ul>
@@ -828,39 +820,13 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
                                      <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions)</pre>
 </li>
 </ul>
-<a name="immediateAssignment(java.util.List, java.util.List)">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>immediateAssignment</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1299">immediateAssignment</a>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
-                                              <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
-<div class="block">Generates an immediate assignment plan to be used by a new master for
- regions in transition that do not have an already known destination.
-
- Takes a list of regions that need immediate assignment and a list of all
- available servers. Returns a map of regions to the server they should be
- assigned to.
-
- This method will return quickly and does not do any intelligent balancing.
- The goal is to make a fast decision not the best decision possible.
-
- Currently this is random.</div>
-<dl>
-<dt><strong>Specified by:</strong></dt>
-<dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)">immediateAssignment</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="strong">Parameters:</span></dt><dd><code>regions</code> - </dd><dd><code>servers</code> - </dd>
-<dt><span class="strong">Returns:</span></dt><dd>map of regions to the server it should be assigned to</dd></dl>
-</li>
-</ul>
 <a name="randomAssignment(org.apache.hadoop.hbase.HRegionInfo, java.util.List)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>randomAssignment</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1318">randomAssignment</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1285">randomAssignment</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                           <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
 <div class="block">Used to assign a single region to a random server.</div>
 <dl>
@@ -876,7 +842,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>retainAssignment</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1361">retainAssignment</a>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../../org/apache/hadoop/
 hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1328">retainAssignment</a>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../../org/apache/hadoop/
 hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                                                  <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
 <div class="block">Generates a bulk assignment startup plan, attempting to reuse the existing
  assignment information from META, but adjusting for the specified list of
@@ -902,7 +868,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>initialize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1473">initialize</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1440">initialize</a>()
                 throws <a href="../../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#initialize()">LoadBalancer</a></code></strong></div>
 <div class="block">Initialize the load balancer. Must be called after setters.</div>
@@ -919,7 +885,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>regionOnline</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1477">regionOnline</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1444">regionOnline</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                 <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#regionOnline(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.ServerName)">LoadBalancer</a></code></strong></div>
 <div class="block">Marks the region as online at balancer.</div>
@@ -935,7 +901,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>regionOffline</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1481">regionOffline</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1448">regionOffline</a>(<a href="../../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#regionOffline(org.apache.hadoop.hbase.HRegionInfo)">LoadBalancer</a></code></strong></div>
 <div class="block">Marks the region as offline at balancer.</div>
 <dl>
@@ -950,7 +916,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>isStopped</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1485">isStopped</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1452">isStopped</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html#isStopped()">isStopped</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html" title="interface in org.apache.hadoop.hbase">Stoppable</a></code></dd>
@@ -963,7 +929,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1490">stop</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;why)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1457">stop</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;why)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/Stoppable.html#stop(java.lang.String)">Stoppable</a></code></strong></div>
 <div class="block">Stop this service.</div>
 <dl>
@@ -978,7 +944,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>randomAssignment</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1498">randomAssignment</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>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1465">randomAssignment</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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                           <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</pre>
 <div class="block">Used to assign a single region to a random server.</div>
@@ -990,7 +956,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>roundRobinAssignment</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1517">roundRobinAssignment</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>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1484">roundRobinAssignment</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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                         <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;unassignedRegions,
                         <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers,
@@ -1004,7 +970,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionAssignmentsByServer</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1547">getRegionAssignmentsByServer</a>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions
 )</pre>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1514">getRegionAssignmentsByServer</a>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions
 )</pre>
 </li>
 </ul>
 <a name="onConfigurationChange(org.apache.hadoop.conf.Configuration)">
@@ -1013,7 +979,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalance
 <ul class="blockListLast">
 <li class="blockList">
 <h4>onConfigurationChange</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#line.1557">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/BaseLoadBalancer.html#line.1524">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/conf/ConfigurationObserver.html#onConfigurationChange(org.apache.hadoop.conf.Configuration)">ConfigurationObserver</a></code></strong></div>
 <div class="block">This method would be called by the <a href="../../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf"><code>ConfigurationManager</code></a>
  object when the <code>Configuration</code> object is reloaded from disk.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html
index 3621a92..a37a28e 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html
@@ -281,7 +281,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <!--   -->
 </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#areSomeRegionReplicasColocated(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster)">areSomeRegionReplicasColocated</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#assignMasterRegions(java.util.Collection,%20java.util.List)">assignMasterRegions</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,%20java.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)">getRegionAssignmentsBySe
 rver</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getTablesOnMaster(org.apache.hadoop.conf.Configuration)">getTablesOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)">immediateAssignment</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#needsBalance(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster)">needsBalance</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#onConfigurationChange(org.apache.hadoop.conf.Configuration)">onConfigurationChange</a>, <a href="../../../../../../org/apache/hadoop/hbas
 e/master/balancer/BaseLoadBalancer.html#regionOffline(org.apache.hadoop.hbase.HRegionInfo)">regionOffline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOnline(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.ServerName)">regionOnline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setClusterStatus(org.apache.hadoop.hbase.ClusterStatus)">setClusterStatus</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#setSlop(org.apache.hadoop.conf.Configuration)">setSlop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#shouldBeOnMaster(org.apache.hadoop.hbase.HRegionInfo)">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#tablesOnMaster(org.apache.hadoop.conf.Configuration)">tablesOnMaster</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#areSomeRegionReplicasColocated(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster)">areSomeRegionReplicasColocated</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#assignMasterRegions(java.util.Collection,%20java.util.List)">assignMasterRegions</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,%20java.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)">getRegionAssignmentsBySe
 rver</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getTablesOnMaster(org.apache.hadoop.conf.Configuration)">getTablesOnMaster</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#needsBalance(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster)">needsBalance</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#onConfigurationChange(org.apache.hadoop.conf.Configuration)">onConfigurationChange</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOffline(org.apache.hadoop.hbase.HRegionInfo)">regionOffline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/
 balancer/BaseLoadBalancer.html#regionOnline(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.ServerName)">regionOnline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setClusterStatus(org.apache.hadoop.hbase.ClusterStatus)">setClusterStatus</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#setSlop(org.apache.hadoop.conf.Configuration)">setSlop</a>, <a href="../../../../../../org/ap
 ache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#shouldBeOnMaster(org.apache.hadoop.hbase.HRegionInfo)">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#tablesOnMaster(org.apache.hadoop.conf.Configuration)">tablesOnMaster</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html
index 9cedc92..ad3b85e 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html
@@ -99,7 +99,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html#line.76">SimpleLoadBalancer.BalanceInfo</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html#line.72">SimpleLoadBalancer.BalanceInfo</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Stores additional per-server information about the regions added/removed
  during the run of the balancing algorithm.
@@ -206,7 +206,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>nextRegionForUnload</h4>
-<pre>private final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html#line.78">nextRegionForUnload</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html#line.74">nextRegionForUnload</a></pre>
 </li>
 </ul>
 <a name="numRegionsAdded">
@@ -215,7 +215,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>numRegionsAdded</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html#line.79">numRegionsAdded</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html#line.75">numRegionsAdded</a></pre>
 </li>
 </ul>
 </li>
@@ -232,7 +232,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SimpleLoadBalancer.BalanceInfo</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html#line.81">SimpleLoadBalancer.BalanceInfo</a>(int&nbsp;nextRegionForUnload,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html#line.77">SimpleLoadBalancer.BalanceInfo</a>(int&nbsp;nextRegionForUnload,
                               int&nbsp;numRegionsAdded)</pre>
 </li>
 </ul>
@@ -250,7 +250,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getNextRegionForUnload</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html#line.86">getNextRegionForUnload</a>()</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html#line.82">getNextRegionForUnload</a>()</pre>
 </li>
 </ul>
 <a name="getNumRegionsAdded()">
@@ -259,7 +259,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumRegionsAdded</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html#line.90">getNumRegionsAdded</a>()</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html#line.86">getNumRegionsAdded</a>()</pre>
 </li>
 </ul>
 <a name="setNumRegionsAdded(int)">
@@ -268,7 +268,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>setNumRegionsAdded</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html#line.94">setNumRegionsAdded</a>(int&nbsp;numAdded)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html#line.90">setNumRegionsAdded</a>(int&nbsp;numAdded)</pre>
 </li>
 </ul>
 </li>


[39/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html b/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
index 2c0a2e3..ba9c81f 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html
@@ -323,85 +323,85 @@ extends org.jamon.AbstractTemplateProxy</pre>
 <!--   -->
 </a>
 <h3>Field Detail</h3>
-<a name="serverManager">
+<a name="assignmentManager">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>serverManager</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.275">serverManager</a></pre>
+<h4>assignmentManager</h4>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.275">assignmentManager</a></pre>
 </li>
 </ul>
-<a name="frags">
+<a name="serverManager">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>frags</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.282">frags</a></pre>
+<h4>serverManager</h4>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.282">serverManager</a></pre>
 </li>
 </ul>
-<a name="metaLocation">
+<a name="deadServers">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>metaLocation</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.289">metaLocation</a></pre>
+<h4>deadServers</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.289">deadServers</a></pre>
 </li>
 </ul>
-<a name="assignmentManager">
+<a name="format">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>assignmentManager</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.296">assignmentManager</a></pre>
+<h4>format</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.html#line.296">format</a></pre>
 </li>
 </ul>
-<a name="catalogJanitorEnabled">
+<a name="servers">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>catalogJanitorEnabled</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.303">catalogJanitorEnabled</a></pre>
+<h4>servers</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.303">servers</a></pre>
 </li>
 </ul>
-<a name="format">
+<a name="metaLocation">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>format</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.html#line.310">format</a></pre>
+<h4>metaLocation</h4>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.310">metaLocation</a></pre>
 </li>
 </ul>
-<a name="filter">
+<a name="frags">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>filter</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.html#line.317">filter</a></pre>
+<h4>frags</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.317">frags</a></pre>
 </li>
 </ul>
-<a name="deadServers">
+<a name="catalogJanitorEnabled">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>deadServers</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.324">deadServers</a></pre>
+<h4>catalogJanitorEnabled</h4>
+<pre>protected&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.324">catalogJanitorEnabled</a></pre>
 </li>
 </ul>
-<a name="servers">
+<a name="filter">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>servers</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.331">servers</a></pre>
+<h4>filter</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmpl.html#line.331">filter</a></pre>
 </li>
 </ul>
 </li>
@@ -473,85 +473,85 @@ extends org.jamon.AbstractTemplateProxy</pre>
 </dl>
 </li>
 </ul>
-<a name="setServerManager(org.apache.hadoop.hbase.master.ServerManager)">
+<a name="setAssignmentManager(org.apache.hadoop.hbase.master.AssignmentManager)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setServerManager</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.276">setServerManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;p_serverManager)</pre>
+<h4>setAssignmentManager</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.276">setAssignmentManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a>&nbsp;p_assignmentManager)</pre>
 </li>
 </ul>
-<a name="setFrags(java.util.Map)">
+<a name="setServerManager(org.apache.hadoop.hbase.master.ServerManager)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFrags</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.283">setFrags</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;p_frags)</pre>
+<h4>setServerManager</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.283">setServerManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;p_serverManager)</pre>
 </li>
 </ul>
-<a name="setMetaLocation(org.apache.hadoop.hbase.ServerName)">
+<a name="setDeadServers(java.util.Set)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setMetaLocation</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.290">setMetaLocation</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;p_metaLocation)</pre>
+<h4>setDeadServers</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.290">setDeadServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;p_deadServers)</pre>
 </li>
 </ul>
-<a name="setAssignmentManager(org.apache.hadoop.hbase.master.AssignmentManager)">
+<a name="setFormat(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setAssignmentManager</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.297">setAssignmentManager</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a>&nbsp;p_assignmentManager)</pre>
+<h4>setFormat</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.297">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_format)</pre>
 </li>
 </ul>
-<a name="setCatalogJanitorEnabled(boolean)">
+<a name="setServers(java.util.List)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setCatalogJanitorEnabled</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.304">setCatalogJanitorEnabled</a>(boolean&nbsp;p_catalogJanitorEnabled)</pre>
+<h4>setServers</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.304">setServers</a>(<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;p_servers)</pre>
 </li>
 </ul>
-<a name="setFormat(java.lang.String)">
+<a name="setMetaLocation(org.apache.hadoop.hbase.ServerName)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFormat</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.311">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_format)</pre>
+<h4>setMetaLocation</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.311">setMetaLocation</a>(<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;p_metaLocation)</pre>
 </li>
 </ul>
-<a name="setFilter(java.lang.String)">
+<a name="setFrags(java.util.Map)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFilter</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.318">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_filter)</pre>
+<h4>setFrags</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.318">setFrags</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;p_frags)</pre>
 </li>
 </ul>
-<a name="setDeadServers(java.util.Set)">
+<a name="setCatalogJanitorEnabled(boolean)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setDeadServers</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.325">setDeadServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;p_deadServers)</pre>
+<h4>setCatalogJanitorEnabled</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.325">setCatalogJanitorEnabled</a>(boolean&nbsp;p_catalogJanitorEnabled)</pre>
 </li>
 </ul>
-<a name="setServers(java.util.List)">
+<a name="setFilter(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setServers</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.332">setServers</a>(<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;p_servers)</pre>
+<h4>setFilter</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.332">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_filter)</pre>
 </li>
 </ul>
 <a name="constructImpl(java.lang.Class)">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html b/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
index 3859712..5f76072 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html
@@ -264,85 +264,85 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/tmpl/master/Master
 <pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.62">master</a></pre>
 </li>
 </ul>
-<a name="serverManager">
+<a name="assignmentManager">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>serverManager</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.63">serverManager</a></pre>
+<h4>assignmentManager</h4>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.63">assignmentManager</a></pre>
 </li>
 </ul>
-<a name="frags">
+<a name="serverManager">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>frags</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.64">frags</a></pre>
+<h4>serverManager</h4>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.64">serverManager</a></pre>
 </li>
 </ul>
-<a name="metaLocation">
+<a name="deadServers">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>metaLocation</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.65">metaLocation</a></pre>
+<h4>deadServers</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.65">deadServers</a></pre>
 </li>
 </ul>
-<a name="assignmentManager">
+<a name="format">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>assignmentManager</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master">AssignmentManager</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.66">assignmentManager</a></pre>
+<h4>format</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmplImpl.html#line.66">format</a></pre>
 </li>
 </ul>
-<a name="catalogJanitorEnabled">
+<a name="servers">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>catalogJanitorEnabled</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.67">catalogJanitorEnabled</a></pre>
+<h4>servers</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.67">servers</a></pre>
 </li>
 </ul>
-<a name="format">
+<a name="metaLocation">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>format</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmplImpl.html#line.68">format</a></pre>
+<h4>metaLocation</h4>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.68">metaLocation</a></pre>
 </li>
 </ul>
-<a name="filter">
+<a name="frags">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>filter</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmplImpl.html#line.69">filter</a></pre>
+<h4>frags</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.69">frags</a></pre>
 </li>
 </ul>
-<a name="deadServers">
+<a name="catalogJanitorEnabled">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>deadServers</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.70">deadServers</a></pre>
+<h4>catalogJanitorEnabled</h4>
+<pre>private final&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.70">catalogJanitorEnabled</a></pre>
 </li>
 </ul>
-<a name="servers">
+<a name="filter">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>servers</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.71">servers</a></pre>
+<h4>filter</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/master/MasterStatusTmplImpl.html#line.71">filter</a></pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
index 0b5d3ba..cbe270e 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
@@ -279,76 +279,76 @@ extends org.jamon.AbstractTemplateProxy.ImplData</pre>
 <pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.71">m_regionServer</a></pre>
 </li>
 </ul>
-<a name="m_format">
+<a name="m_filter">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_format</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.83">m_format</a></pre>
+<h4>m_filter</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.83">m_filter</a></pre>
 </li>
 </ul>
-<a name="m_format__IsNotDefault">
+<a name="m_filter__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_format__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.88">m_format__IsNotDefault</a></pre>
+<h4>m_filter__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.88">m_filter__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_bcn">
+<a name="m_format">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_bcn</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.100">m_bcn</a></pre>
+<h4>m_format</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.100">m_format</a></pre>
 </li>
 </ul>
-<a name="m_bcn__IsNotDefault">
+<a name="m_format__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_bcn__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.105">m_bcn__IsNotDefault</a></pre>
+<h4>m_format__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.105">m_format__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_bcv">
+<a name="m_bcn">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_bcv</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.117">m_bcv</a></pre>
+<h4>m_bcn</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.117">m_bcn</a></pre>
 </li>
 </ul>
-<a name="m_bcv__IsNotDefault">
+<a name="m_bcn__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_bcv__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.122">m_bcv__IsNotDefault</a></pre>
+<h4>m_bcn__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.122">m_bcn__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_filter">
+<a name="m_bcv">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>m_filter</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.134">m_filter</a></pre>
+<h4>m_bcv</h4>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.134">m_bcv</a></pre>
 </li>
 </ul>
-<a name="m_filter__IsNotDefault">
+<a name="m_bcv__IsNotDefault">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>m_filter__IsNotDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.139">m_filter__IsNotDefault</a></pre>
+<h4>m_bcv__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.139">m_bcv__IsNotDefault</a></pre>
 </li>
 </ul>
 </li>
@@ -394,112 +394,112 @@ extends org.jamon.AbstractTemplateProxy.ImplData</pre>
 <pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.67">getRegionServer</a>()</pre>
 </li>
 </ul>
-<a name="setFormat(java.lang.String)">
+<a name="setFilter(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFormat</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.73">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;format)</pre>
+<h4>setFilter</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.73">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;filter)</pre>
 </li>
 </ul>
-<a name="getFormat()">
+<a name="getFilter()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFormat</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.79">getFormat</a>()</pre>
+<h4>getFilter</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.79">getFilter</a>()</pre>
 </li>
 </ul>
-<a name="getFormat__IsNotDefault()">
+<a name="getFilter__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFormat__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.84">getFormat__IsNotDefault</a>()</pre>
+<h4>getFilter__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.84">getFilter__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setBcn(java.lang.String)">
+<a name="setFormat(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setBcn</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.90">setBcn</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;bcn)</pre>
+<h4>setFormat</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.90">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;format)</pre>
 </li>
 </ul>
-<a name="getBcn()">
+<a name="getFormat()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getBcn</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.96">getBcn</a>()</pre>
+<h4>getFormat</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.96">getFormat</a>()</pre>
 </li>
 </ul>
-<a name="getBcn__IsNotDefault()">
+<a name="getFormat__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getBcn__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.101">getBcn__IsNotDefault</a>()</pre>
+<h4>getFormat__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.101">getFormat__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setBcv(java.lang.String)">
+<a name="setBcn(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setBcv</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.107">setBcv</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;bcv)</pre>
+<h4>setBcn</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.107">setBcn</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;bcn)</pre>
 </li>
 </ul>
-<a name="getBcv()">
+<a name="getBcn()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getBcv</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.113">getBcv</a>()</pre>
+<h4>getBcn</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.113">getBcn</a>()</pre>
 </li>
 </ul>
-<a name="getBcv__IsNotDefault()">
+<a name="getBcn__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getBcv__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.118">getBcv__IsNotDefault</a>()</pre>
+<h4>getBcn__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.118">getBcn__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setFilter(java.lang.String)">
+<a name="setBcv(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.124">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;filter)</pre>
+<h4>setBcv</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.124">setBcv</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;bcv)</pre>
 </li>
 </ul>
-<a name="getFilter()">
+<a name="getBcv()">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>getFilter</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.130">getFilter</a>()</pre>
+<h4>getBcv</h4>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.130">getBcv</a>()</pre>
 </li>
 </ul>
-<a name="getFilter__IsNotDefault()">
+<a name="getBcv__IsNotDefault()">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>getFilter__IsNotDefault</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.135">getFilter__IsNotDefault</a>()</pre>
+<h4>getBcv__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.135">getBcv__IsNotDefault</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
index 3968982..6286b2b 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
@@ -283,40 +283,40 @@ extends org.jamon.AbstractTemplateProxy</pre>
 <!--   -->
 </a>
 <h3>Field Detail</h3>
-<a name="format">
+<a name="filter">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>format</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.html#line.151">format</a></pre>
+<h4>filter</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.html#line.151">filter</a></pre>
 </li>
 </ul>
-<a name="bcn">
+<a name="format">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>bcn</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.html#line.158">bcn</a></pre>
+<h4>format</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.html#line.158">format</a></pre>
 </li>
 </ul>
-<a name="bcv">
+<a name="bcn">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>bcv</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.html#line.165">bcv</a></pre>
+<h4>bcn</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.html#line.165">bcn</a></pre>
 </li>
 </ul>
-<a name="filter">
+<a name="bcv">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>filter</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.html#line.172">filter</a></pre>
+<h4>bcv</h4>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmpl.html#line.172">bcv</a></pre>
 </li>
 </ul>
 </li>
@@ -388,40 +388,40 @@ extends org.jamon.AbstractTemplateProxy</pre>
 </dl>
 </li>
 </ul>
-<a name="setFormat(java.lang.String)">
+<a name="setFilter(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFormat</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.152">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_format)</pre>
+<h4>setFilter</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.152">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_filter)</pre>
 </li>
 </ul>
-<a name="setBcn(java.lang.String)">
+<a name="setFormat(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setBcn</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.159">setBcn</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_bcn)</pre>
+<h4>setFormat</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.159">setFormat</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_format)</pre>
 </li>
 </ul>
-<a name="setBcv(java.lang.String)">
+<a name="setBcn(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setBcv</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.166">setBcv</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_bcv)</pre>
+<h4>setBcn</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.166">setBcn</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_bcn)</pre>
 </li>
 </ul>
-<a name="setFilter(java.lang.String)">
+<a name="setBcv(java.lang.String)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>setFilter</h4>
-<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.173">setFilter</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_filter)</pre>
+<h4>setBcv</h4>
+<pre>public final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.regionserver">RSStatusTmpl</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html#line.173">setBcv</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;p_bcv)</pre>
 </li>
 </ul>
 <a name="constructImpl(java.lang.Class)">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
index f9484ac..cbdbde4 100644
--- a/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
@@ -224,40 +224,40 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/tmpl/regionserver/
 <pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html#line.28">regionServer</a></pre>
 </li>
 </ul>
-<a name="format">
+<a name="filter">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>format</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmplImpl.html#line.29">format</a></pre>
+<h4>filter</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmplImpl.html#line.29">filter</a></pre>
 </li>
 </ul>
-<a name="bcn">
+<a name="format">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>bcn</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmplImpl.html#line.30">bcn</a></pre>
+<h4>format</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmplImpl.html#line.30">format</a></pre>
 </li>
 </ul>
-<a name="bcv">
+<a name="bcn">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>bcv</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmplImpl.html#line.31">bcv</a></pre>
+<h4>bcn</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmplImpl.html#line.31">bcn</a></pre>
 </li>
 </ul>
-<a name="filter">
+<a name="bcv">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>filter</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmplImpl.html#line.32">filter</a></pre>
+<h4>bcv</h4>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/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/tmpl/regionserver/RSStatusTmplImpl.html#line.32">bcv</a></pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/tool/Canary.Monitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.Monitor.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.Monitor.html
index 5feac8a..8f6dfce 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.Monitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.Monitor.html
@@ -107,7 +107,7 @@
 </dl>
 <hr>
 <br>
-<pre>public abstract static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.704">Canary.Monitor</a>
+<pre>public abstract static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.703">Canary.Monitor</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</a></pre>
 </li>
@@ -259,7 +259,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>connection</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.706">connection</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.705">connection</a></pre>
 </li>
 </ul>
 <a name="admin">
@@ -268,7 +268,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>admin</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.707">admin</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.706">admin</a></pre>
 </li>
 </ul>
 <a name="targets">
@@ -277,7 +277,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>targets</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tool/Canary.Monitor.html#line.708">targets</a></pre>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/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/tool/Canary.Monitor.html#line.707">targets</a></pre>
 </li>
 </ul>
 <a name="useRegExp">
@@ -286,7 +286,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>useRegExp</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.709">useRegExp</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.708">useRegExp</a></pre>
 </li>
 </ul>
 <a name="treatFailureAsError">
@@ -295,7 +295,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>treatFailureAsError</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.710">treatFailureAsError</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.709">treatFailureAsError</a></pre>
 </li>
 </ul>
 <a name="initialized">
@@ -304,7 +304,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>initialized</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.711">initialized</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.710">initialized</a></pre>
 </li>
 </ul>
 <a name="done">
@@ -313,7 +313,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.713">done</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.712">done</a></pre>
 </li>
 </ul>
 <a name="errorCode">
@@ -322,7 +322,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>errorCode</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.714">errorCode</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.713">errorCode</a></pre>
 </li>
 </ul>
 <a name="sink">
@@ -331,7 +331,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>sink</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.715">sink</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.714">sink</a></pre>
 </li>
 </ul>
 <a name="executor">
@@ -340,7 +340,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>executor</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.716">executor</a></pre>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.715">executor</a></pre>
 </li>
 </ul>
 </li>
@@ -357,7 +357,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Canary.Monitor</h4>
-<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.739">Canary.Monitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.738">Canary.Monitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
               <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
               boolean&nbsp;useRegExp,
               <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
@@ -379,7 +379,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>isDone</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.718">isDone</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.717">isDone</a>()</pre>
 </li>
 </ul>
 <a name="hasError()">
@@ -388,7 +388,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>hasError</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.722">hasError</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.721">hasError</a>()</pre>
 </li>
 </ul>
 <a name="finalCheckForErrors()">
@@ -397,7 +397,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>finalCheckForErrors</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.726">finalCheckForErrors</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.725">finalCheckForErrors</a>()</pre>
 </li>
 </ul>
 <a name="close()">
@@ -406,7 +406,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.735">close</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.734">close</a>()
            throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -423,7 +423,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.752">run</a>()</pre>
+<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.751">run</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true#run()" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>
@@ -436,7 +436,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>initAdmin</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.754">initAdmin</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html#line.753">initAdmin</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
index 3d99dd9..7e4aff3 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
@@ -108,7 +108,7 @@
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.771">Canary.RegionMonitor</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.770">Canary.RegionMonitor</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></pre>
 </li>
 </ul>
@@ -265,7 +265,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_WRITE_TABLE_CHECK_PERIOD</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.773">DEFAULT_WRITE_TABLE_CHECK_PERIOD</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.772">DEFAULT_WRITE_TABLE_CHECK_PERIOD</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.RegionMonitor.DEFAULT_WRITE_TABLE_CHECK_PERIOD">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -275,7 +275,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_WRITE_DATA_TTL</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.775">DEFAULT_WRITE_DATA_TTL</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.774">DEFAULT_WRITE_DATA_TTL</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.tool.Canary.RegionMonitor.DEFAULT_WRITE_DATA_TTL">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -285,7 +285,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>lastCheckTime</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.777">lastCheckTime</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.776">lastCheckTime</a></pre>
 </li>
 </ul>
 <a name="writeSniffing">
@@ -294,7 +294,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeSniffing</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.778">writeSniffing</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.777">writeSniffing</a></pre>
 </li>
 </ul>
 <a name="writeTableName">
@@ -303,7 +303,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeTableName</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.779">writeTableName</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.778">writeTableName</a></pre>
 </li>
 </ul>
 <a name="writeDataTTL">
@@ -312,7 +312,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeDataTTL</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.780">writeDataTTL</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.779">writeDataTTL</a></pre>
 </li>
 </ul>
 <a name="regionsLowerLimit">
@@ -321,7 +321,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>regionsLowerLimit</h4>
-<pre>private&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.781">regionsLowerLimit</a></pre>
+<pre>private&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.780">regionsLowerLimit</a></pre>
 </li>
 </ul>
 <a name="regionsUpperLimit">
@@ -330,7 +330,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>regionsUpperLimit</h4>
-<pre>private&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.782">regionsUpperLimit</a></pre>
+<pre>private&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.781">regionsUpperLimit</a></pre>
 </li>
 </ul>
 <a name="checkPeriod">
@@ -339,7 +339,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>checkPeriod</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.783">checkPeriod</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.782">checkPeriod</a></pre>
 </li>
 </ul>
 </li>
@@ -356,7 +356,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Canary.RegionMonitor</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.785">Canary.RegionMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.784">Canary.RegionMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                     <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                     boolean&nbsp;useRegExp,
                     <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
@@ -380,7 +380,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.804">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.803">run</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true#run()" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>
@@ -395,7 +395,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>generateMonitorTables</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tool/Canary.RegionMonitor.html#line.847">generateMonitorTables</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets)
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/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/tool/Canary.RegionMonitor.html#line.846">generateMonitorTables</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets)
                                 throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -407,7 +407,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>sniff</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.893">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType)
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.892">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType)
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd></dl>
@@ -419,7 +419,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkWriteTableDistribution</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.907">checkWriteTableDistribution</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.906">checkWriteTableDistribution</a>()
                                   throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -431,7 +431,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>createWriteTable</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.940">createWriteTable</a>(int&nbsp;numberOfServers)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html#line.939">createWriteTable</a>(int&nbsp;numberOfServers)
                        throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>


[24/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
index fbdde18..1d64963 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
@@ -2959,7 +2959,7 @@
 <span class="sourceLineNo">2951</span>    Set&lt;byte[]&gt; deletesCfSet = null;<a name="line.2951"></a>
 <span class="sourceLineNo">2952</span>    long currentNonceGroup = HConstants.NO_NONCE;<a name="line.2952"></a>
 <span class="sourceLineNo">2953</span>    long currentNonce = HConstants.NO_NONCE;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    WALEdit walEdit = new WALEdit(replay);<a name="line.2954"></a>
+<span class="sourceLineNo">2954</span>    WALEdit walEdit = null;<a name="line.2954"></a>
 <span class="sourceLineNo">2955</span>    boolean locked = false;<a name="line.2955"></a>
 <span class="sourceLineNo">2956</span>    // reference family maps directly so coprocessors can mutate them if desired<a name="line.2956"></a>
 <span class="sourceLineNo">2957</span>    Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps = new Map[batchOp.operations.length];<a name="line.2957"></a>
@@ -2970,4878 +2970,4890 @@
 <span class="sourceLineNo">2962</span>    int noOfPuts = 0;<a name="line.2962"></a>
 <span class="sourceLineNo">2963</span>    int noOfDeletes = 0;<a name="line.2963"></a>
 <span class="sourceLineNo">2964</span>    WriteEntry writeEntry = null;<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    try {<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>      int numReadyToWrite = 0;<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>          lastIndexExclusive++;<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>          continue;<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>        }<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>        RowLock rowLock = null;<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>        try {<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>        } catch (IOException ioe) {<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span>        }<a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>        if (rowLock == null) {<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>          // We failed to grab another lock<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>          break; // Stop acquiring more rows for this batch<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>        } else {<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>          acquiredRowLocks.add(rowLock);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span>        }<a name="line.2989"></a>
-<span class="sourceLineNo">2990</span><a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>        lastIndexExclusive++;<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>        numReadyToWrite++;<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span><a name="line.2993"></a>
-<span class="sourceLineNo">2994</span>        if (mutation instanceof Put) {<a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>          // If Column Families stay consistent through out all of the<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>          // individual puts then metrics can be reported as a multiput across<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>          // column families in the first put.<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>          if (putsCfSet == null) {<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>          } else {<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span>          }<a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>        } else {<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>          if (deletesCfSet == null) {<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>          } else {<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>          }<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span>        }<a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>      }<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span><a name="line.3013"></a>
-<span class="sourceLineNo">3014</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3014"></a>
-<span class="sourceLineNo">3015</span><a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3020"></a>
-<span class="sourceLineNo">3021</span><a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>        return 0L;<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>      }<a name="line.3025"></a>
+<span class="sourceLineNo">2965</span>    int cellCount = 0;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    try {<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>      int numReadyToWrite = 0;<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>          lastIndexExclusive++;<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span>          continue;<a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>        }<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>        RowLock rowLock = null;<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span>        try {<a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>        } catch (IOException ioe) {<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>        }<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>        if (rowLock == null) {<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>          // We failed to grab another lock<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span>          break; // Stop acquiring more rows for this batch<a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>        } else {<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>          acquiredRowLocks.add(rowLock);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>        }<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span><a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>        lastIndexExclusive++;<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span>        numReadyToWrite++;<a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>        if (replay) {<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>          for (List&lt;Cell&gt; cells : mutation.getFamilyCellMap().values()) {<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>            cellCount += cells.size();<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>          }<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>        }<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span>        if (mutation instanceof Put) {<a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>          // If Column Families stay consistent through out all of the<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>          // individual puts then metrics can be reported as a multiput across<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>          // column families in the first put.<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>          if (putsCfSet == null) {<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>          } else {<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>          }<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>        } else {<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>          if (deletesCfSet == null) {<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>          } else {<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>          }<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>        }<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>      }<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span><a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span><a name="line.3020"></a>
+<span class="sourceLineNo">3021</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3025"></a>
 <span class="sourceLineNo">3026</span><a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span>        // skip invalid<a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>          // lastIndexExclusive was incremented above.<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span>          continue;<a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>        }<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span><a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>        if (mutation instanceof Put) {<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>          noOfPuts++;<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>        } else {<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>          noOfDeletes++;<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>        }<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span>      }<a name="line.3044"></a>
-<span class="sourceLineNo">3045</span><a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>      locked = true;<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span><a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>      // calling the pre CP hook for batch mutation<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>          return 0L;<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>        }<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>      }<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span><a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>      // STEP 3. Build WAL edit<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>          continue;<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>        }<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>        Mutation m = batchOp.getMutation(i);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>          durability = tmpDur;<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>        }<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>          continue;<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span>        }<a name="line.3075"></a>
-<span class="sourceLineNo">3076</span><a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>        long nonce = batchOp.getNonce(i);<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>          // Write what we have so far for nonces out to WAL<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>          walEdit = new WALEdit(replay);<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span>          currentNonceGroup = nonceGroup;<a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>          currentNonce = nonce;<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>        }<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span><a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>        // Add WAL edits by CP<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>        if (fromCP != null) {<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span>            walEdit.add(cell);<a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>          }<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>        }<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span>      }<a name="line.3098"></a>
-<span class="sourceLineNo">3099</span><a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>      WALKey walKey = null;<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>      if (replay) {<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>        // use wal key from the original<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3107"></a>
-<span class="sourceLineNo">3108</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>      }<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>      if (!walEdit.isEmpty()) {<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>        if (!replay) {<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>        }<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>        try {<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span>          long txid =<a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>          if (txid != 0) sync(txid, durability);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span>          writeEntry = walKey.getWriteEntry();<a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>        } catch (IOException ioe) {<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>          throw ioe;<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>        }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>      }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span>      if (walKey == null) {<a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>        writeEntry = mvcc.begin();<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>      }<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span><a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>      // STEP 5. Write back to memstore<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>      long addedSize = 0;<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>          continue;<a name="line.3139"></a>
+<span class="sourceLineNo">3027</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>        return 0L;<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span>      }<a name="line.3030"></a>
+<span class="sourceLineNo">3031</span><a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>        // skip invalid<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>          // lastIndexExclusive was incremented above.<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>          continue;<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span>        }<a name="line.3038"></a>
+<span class="sourceLineNo">3039</span><a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>        if (mutation instanceof Put) {<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>          noOfPuts++;<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>        } else {<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>          noOfDeletes++;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>        }<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span>        if (fromCP != null) {<a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>          cellCount += fromCP.size();<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>        }<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>        for (List&lt;Cell&gt; cells : familyMaps[i].values()) {<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span>          cellCount += cells.size();<a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>        }<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>      }<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>      walEdit = new WALEdit(cellCount, replay);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>      locked = true;<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span><a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>      // calling the pre CP hook for batch mutation<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>          return 0L;<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>        }<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>      }<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>      // STEP 3. Build WAL edit<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span>          continue;<a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>        }<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span><a name="line.3078"></a>
+<span class="sourceLineNo">3079</span>        Mutation m = batchOp.getMutation(i);<a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>          durability = tmpDur;<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>        }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>          continue;<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>        }<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span><a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>        long nonce = batchOp.getNonce(i);<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>          // Write what we have so far for nonces out to WAL<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>          walEdit = new WALEdit(cellCount, replay);<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>          currentNonceGroup = nonceGroup;<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>          currentNonce = nonce;<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>        }<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span><a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>        // Add WAL edits by CP<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span>        if (fromCP != null) {<a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>            walEdit.add(cell);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>          }<a name="line.3107"></a>
+<span class="sourceLineNo">3108</span>        }<a name="line.3108"></a>
+<span class="sourceLineNo">3109</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>      }<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span><a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>      WALKey walKey = null;<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>      if (replay) {<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>        // use wal key from the original<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>      }<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>      if (!walEdit.isEmpty()) {<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span>        if (!replay) {<a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>        }<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>        try {<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>          long txid =<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>          if (txid != 0) sync(txid, durability);<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>          writeEntry = walKey.getWriteEntry();<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>        } catch (IOException ioe) {<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>          throw ioe;<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span>        }<a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span>      }<a name="line.3143"></a>
-<span class="sourceLineNo">3144</span><a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>      // STEP 6. Complete mvcc.<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>      if (replay) {<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>        mvcc.completeAndWait(writeEntry);<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>        writeEntry = null;<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span>      }<a name="line.3151"></a>
-<span class="sourceLineNo">3152</span><a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>      // STEP 7. Release row locks, etc.<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>      if (locked) {<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span>        this.updatesLock.readLock().unlock();<a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>        locked = false;<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>      }<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>      // calling the post CP hook for batch mutation<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>      }<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span><a name="line.3167"></a>
-<span class="sourceLineNo">3168</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>        }<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>      }<a name="line.3172"></a>
-<span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>          // only for successful puts<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span>              != OperationStatusCode.SUCCESS) {<a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>            continue;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>          }<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>          Mutation m = batchOp.getMutation(i);<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>          if (m instanceof Put) {<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>          } else {<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>          }<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>        }<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>      }<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span><a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>      success = true;<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span>      return addedSize;<a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    } finally {<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>      if (locked) {<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span>        this.updatesLock.readLock().unlock();<a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>      }<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span><a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>      // See if the column families were consistent through the whole thing.<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>      // null will be treated as unknown.<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span><a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>      if (noOfPuts &gt; 0) {<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>        // There were some Puts in the batch.<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>        if (this.metricsRegion != null) {<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span>          this.metricsRegion.updatePut();<a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>        }<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>      }<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>      if (noOfDeletes &gt; 0) {<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>        // There were some Deletes in the batch.<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>        if (this.metricsRegion != null) {<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span>          this.metricsRegion.updateDelete();<a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>        }<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>      }<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>      if (!success) {<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>          }<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>        }<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>      }<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>        // call the coprocessor hook to do any finalization steps<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>        // after the put is done<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>                lastIndexExclusive);<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>      }<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span><a name="line.3236"></a>
-<span class="sourceLineNo">3237</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    }<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>  }<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>  throws IOException {<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    if (walEdit.isEmpty()) return;<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>  }<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span><a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>  throws IOException {<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    boolean skip = false;<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    // Skip anything that "ran" already<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>      return true;<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span>    }<a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span>    // store the family map reference to allow for mutations<a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    try {<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>      if (mutation instanceof Put) {<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>        // Check the families in the put. If bad, skip this one.<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>        if (batchOp.isInReplay()) {<a name="line.3271"></a>
-<span class="sourceLineNo">3272</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>        } else {<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>          checkFamilies(familyMap.keySet());<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>        }<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>      } else {<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span>        prepareDelete((Delete)mutation);<a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>      }<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>      skip = true;<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>      skip = true;<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    } catch (WrongRegionException we) {<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>      skip = true;<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    }<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    return skip;<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>  }<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>  /**<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>   * During replay, there could exist column families which are removed between region server<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>   * failure and replay<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>   */<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>        if (nonExistentList == null) {<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span>        }<a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>        nonExistentList.add(family);<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>      }<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>    }<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>    if (nonExistentList != null) {<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>      for (byte[] family : nonExistentList) {<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>        // Perhaps schema was changed between crash and replay<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>        familyMap.remove(family);<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>      }<a name="line.3319"></a>
-<span class="sourceLineNo">3320</span>    }<a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>  }<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span><a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>  /**<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span>   * Returns effective durability from the passed durability and<a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>   * the table descriptor.<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span>   */<a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>  }<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span><a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>  @Override<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      boolean writeToWAL)<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>  throws IOException{<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    checkMutationType(mutation, row);<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>      mutation, writeToWAL);<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>  }<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span><a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>  @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3343"></a>
-<span class="sourceLineNo">3344</span>      boolean writeToWAL)<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>  throws IOException {<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, rm, null,<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>      writeToWAL);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>  }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span><a name="line.3349"></a>
-<span class="sourceLineNo">3350</span>  /**<a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>   * checkAndMutate and checkAndRowMutate are 90% the same. Rather than copy/paste, below has<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>   * switches in the few places where there is deviation.<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span>   */<a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>  private boolean doCheckAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rowMutations,<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>      Mutation mutation, boolean writeToWAL)<a name="line.3356"></a>
+<span class="sourceLineNo">3141</span>      }<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>      if (walKey == null) {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>        writeEntry = mvcc.begin();<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>      }<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span><a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>      // STEP 5. Write back to memstore<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>      long addedSize = 0;<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>          continue;<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>        }<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>      }<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span><a name="line.3156"></a>
+<span class="sourceLineNo">3157</span>      // STEP 6. Complete mvcc.<a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>      if (replay) {<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span>        mvcc.completeAndWait(writeEntry);<a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>        writeEntry = null;<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>      }<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span><a name="line.3164"></a>
+<span class="sourceLineNo">3165</span>      // STEP 7. Release row locks, etc.<a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>      if (locked) {<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>        this.updatesLock.readLock().unlock();<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>        locked = false;<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span>      }<a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span><a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>      // calling the post CP hook for batch mutation<a name="line.3172"></a>
+<span class="sourceLineNo">3173</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3173"></a>
+<span class="sourceLineNo">3174</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span>      }<a name="line.3178"></a>
+<span class="sourceLineNo">3179</span><a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span>        }<a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>      }<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span><a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span>          // only for successful puts<a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>              != OperationStatusCode.SUCCESS) {<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>            continue;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>          }<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span>          Mutation m = batchOp.getMutation(i);<a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>          if (m instanceof Put) {<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>          } else {<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>          }<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>        }<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>      }<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>      success = true;<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>      return addedSize;<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    } finally {<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>      if (locked) {<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>        this.updatesLock.readLock().unlock();<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>      }<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span><a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>      // See if the column families were consistent through the whole thing.<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>      // null will be treated as unknown.<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span><a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>      if (noOfPuts &gt; 0) {<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span>        // There were some Puts in the batch.<a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>        if (this.metricsRegion != null) {<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>          this.metricsRegion.updatePut();<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>        }<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>      }<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>      if (noOfDeletes &gt; 0) {<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span>        // There were some Deletes in the batch.<a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>        if (this.metricsRegion != null) {<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>          this.metricsRegion.updateDelete();<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>        }<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>      }<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span>      if (!success) {<a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>          }<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>        }<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>      }<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>        // call the coprocessor hook to do any finalization steps<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span>        // after the put is done<a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>                lastIndexExclusive);<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span>      }<a name="line.3247"></a>
+<span class="sourceLineNo">3248</span><a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span>    }<a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>  }<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span><a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  throws IOException {<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span>    if (walEdit.isEmpty()) return;<a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  }<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span><a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>  throws IOException {<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    boolean skip = false;<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    // Skip anything that "ran" already<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3271"></a>
+<span class="sourceLineNo">3272</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3272"></a>
+<span class="sourceLineNo">3273</span>      return true;<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    }<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span>    // store the family map reference to allow for mutations<a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span><a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    try {<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>      if (mutation instanceof Put) {<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span>        // Check the families in the put. If bad, skip this one.<a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>        if (batchOp.isInReplay()) {<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>        } else {<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>          checkFamilies(familyMap.keySet());<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>        }<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>      } else {<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>        prepareDelete((Delete)mutation);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>      }<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span>      skip = true;<a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>      skip = true;<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    } catch (WrongRegionException we) {<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>      skip = true;<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    }<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span>    return skip;<a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>  }<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span><a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>  /**<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>   * During replay, there could exist column families which are removed between region server<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>   * failure and replay<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3319"></a>
+<span class="sourceLineNo">3320</span>        if (nonExistentList == null) {<a name="line.3320"></a>
+<span class="sourceLineNo">3321</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>        }<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>        nonExistentList.add(family);<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>      }<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>    }<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>    if (nonExistentList != null) {<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>      for (byte[] family : nonExistentList) {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>        // Perhaps schema was changed between crash and replay<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span>        familyMap.remove(family);<a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>      }<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    }<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>  }<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>  /**<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span>   * Returns effective durability from the passed durability and<a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>   * the table descriptor.<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>   */<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>  }<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span><a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>  @Override<a name="line.3343"></a>
+<span class="sourceLineNo">3344</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3344"></a>
+<span class="sourceLineNo">3345</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>      boolean writeToWAL)<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span>  throws IOException{<a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    checkMutationType(mutation, row);<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>      mutation, writeToWAL);<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>  }<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span><a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>  @Override<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      boolean writeToWAL)<a name="line.3356"></a>
 <span class="sourceLineNo">3357</span>  throws IOException {<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // Could do the below checks but seems wacky with two callers only. Just comment out for now.<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // One caller passes a Mutation, the other passes RowMutation. Presume all good so we don't<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // need these commented out checks.<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // if (rowMutations == null &amp;&amp; mutation == null) throw new DoNotRetryIOException("Both null");<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // if (rowMutations != null &amp;&amp; mutation != null) throw new DoNotRetryIOException("Both set");<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    checkReadOnly();<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // TODO, add check for value length also move this check to the client<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span>    checkResources();<a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    startRegionOperation();<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    try {<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>      Get get = new Get(row);<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>      checkFamily(family);<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>      get.addColumn(family, qualifier);<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>      // Lock row - note that doBatchMutate will relock this row if called<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>      RowLock rowLock = getRowLock(get.getRow());<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>      try {<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>        if (mutation != null &amp;&amp; this.getCoprocessorHost() != null) {<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>          // Call coprocessor.<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>          Boolean processed = null;<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>          if (mutation instanceof Put) {<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>            processed = this.getCoprocessorHost().preCheckAndPutAfterRowLock(row, family,<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>                qualifier, compareOp, comparator, (Put)mutation);<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>          } else if (mutation instanceof Delete) {<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>            processed = this.getCoprocessorHost().preCheckAndDeleteAfterRowLock(row, family,<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span>                qualifier, compareOp, comparator, (Delete)mutation);<a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>          }<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>          if (processed != null) {<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>            return processed;<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>          }<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>        }<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>        // NOTE: We used to wait here until mvcc caught up:  mvcc.await();<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        // Supposition is that now all changes are done under row locks, then when we go to read,<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>        // we'll get the latest on this row.<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        List&lt;Cell&gt; result = get(get, false);<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>        boolean valueIsNull = comparator.getValue() == null || comparator.getValue().length == 0;<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        boolean matches = false;<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>        long cellTs = 0;<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        if (result.size() == 0 &amp;&amp; valueIsNull) {<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>          matches = true;<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>        } else if (result.size() &gt; 0 &amp;&amp; result.get(0).getValueLength() == 0 &amp;&amp; valueIsNull) {<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>          matches = true;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>          cellTs = result.get(0).getTimestamp();<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        } else if (result.size() == 1 &amp;&amp; !valueIsNull) {<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>          Cell kv = result.get(0);<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>          cellTs = kv.getTimestamp();<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>          int compareResult = CellComparator.compareValue(kv, comparator);<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span>          matches = matches(compareOp, compareResult);<a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>        }<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>        // If matches put the new put or delete the new delete<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>        if (matches) {<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>          // We have acquired the row lock 

<TRUNCATED>

[47/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html b/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
index d371557..cba570d 100644
--- a/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
+++ b/devapidocs/org/apache/hadoop/hbase/class-use/ServerName.html
@@ -1971,26 +1971,19 @@
 </td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
-<td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)">immediateAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
-                                      <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
-<div class="block">Sync assign a region</div>
-</td>
-</tr>
-<tr class="altColor">
 <td class="colFirst"><code>(package private) <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
 <td class="colLast"><span class="strong">AssignmentManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html#rebuildUserRegions()">rebuildUserRegions</a></strong>()</code>
 <div class="block">Rebuild the list of user regions and assignment information.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Assign regions to the previously hosting region server</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#roundRobinAssignment(java.util.List,%20java.util.List)">roundRobinAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                         <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
@@ -2686,45 +2679,38 @@
 <td class="colLast"><span class="strong">SplitLogManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.html#handleDeadWorkers(java.util.Set)">handleDeadWorkers</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;serverNames)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
-<td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)">immediateAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
-                                      <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
-<div class="block">Sync assign a region</div>
-</td>
-</tr>
-<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="strong">AssignmentManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html#prepareDaughterReplicaForAssignment(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HRegionInfo,%20int,%20java.util.Map)">prepareDaughterReplicaForAssignment</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;daughterHri,
                                                                       <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;parentHri,
                                                                       int&nbsp;replicaId,
                                                                       <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;map)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="strong">AssignmentVerificationReport.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/AssignmentVerificationReport.html#printHServerAddressSet(java.util.Set)">printHServerAddressSet</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;serverSet)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><span class="strong">AssignmentManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html#processDeadServersAndRegionsInTransition(java.util.Set)">processDeadServersAndRegionsInTransition</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;deadServers)</code>
 <div class="block">Process all regions that are in transition in zookeeper and also
  processes the list of dead servers.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#randomAssignment(org.apache.hadoop.hbase.HRegionInfo,%20java.util.List)">randomAssignment</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Get a random region server from the list</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><span class="strong">ServerManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#removeDeadNotExpiredServers(java.util.List)">removeDeadNotExpiredServers</a></strong>(<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Loop through the deadNotExpired server list and remove them from the
  servers.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="strong">SplitLogManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.html#removeRecoveringRegions(java.util.Set,%20java.lang.Boolean)">removeRecoveringRegions</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;serverNames,
                                               <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&nbsp;isMetaRecovery)</code>
@@ -2732,41 +2718,41 @@
  region server hosting the region can allow reads to the recovered region</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><span class="strong">SplitLogManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.html#removeStaleRecoveringRegions(java.util.Set)">removeStaleRecoveringRegions</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;failedServers)</code>
 <div class="block">It removes stale recovering regions under /hbase/recovering-regions/[encoded region name]
  during master initialization phase.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><span class="strong">MasterFileSystem.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/MasterFileSystem.html#removeStaleRecoveringRegionsFromZK(java.util.Set)">removeStaleRecoveringRegionsFromZK</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;failedServers)</code>
 <div class="block">Wrapper function on <a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.html#removeStaleRecoveringRegions(java.util.Set)"><code>SplitLogManager.removeStaleRecoveringRegions(Set)</code></a></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Assign regions to the previously hosting region server</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Assign regions to the previously hosting region server</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#roundRobinAssignment(java.util.List,%20java.util.List)">roundRobinAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                         <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Perform a Round Robin assignment of regions.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionOpeningState.html" title="enum in org.apache.hadoop.hbase.regionserver">RegionOpeningState</a></code></td>
 <td class="colLast"><span class="strong">ServerManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#sendRegionOpen(org.apache.hadoop.hbase.ServerName,%20org.apache.hadoop.hbase.HRegionInfo,%20java.util.List)">sendRegionOpen</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;server,
                             <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
@@ -2774,25 +2760,25 @@
 <div class="block">Sends an OPEN RPC to the specified server to open the specified region.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/regionserver/RegionOpeningState.html" title="enum in org.apache.hadoop.hbase.regionserver">RegionOpeningState</a>&gt;</code></td>
 <td class="colLast"><span class="strong">ServerManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#sendRegionOpen(org.apache.hadoop.hbase.ServerName,%20java.util.List)">sendRegionOpen</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;server,
                             <a href="http://docs.oracle.com/javase/7/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/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&gt;&gt;&nbsp;regionOpenInfos)</code>
 <div class="block">Sends an OPEN RPC to the specified server to open the specified region.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="strong">MasterFileSystem.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/MasterFileSystem.html#splitLog(java.util.Set)">splitLog</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;serverNames)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="strong">MasterFileSystem.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/MasterFileSystem.html#splitLog(java.util.Set,%20org.apache.hadoop.fs.PathFilter)">splitLog</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;serverNames,
                 org.apache.hadoop.fs.PathFilter&nbsp;filter)</code>
 <div class="block">This method is the base split method that splits WAL files matching a filter.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><span class="strong">SplitLogManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.html#splitLogDistributed(java.util.Set,%20java.util.List,%20org.apache.hadoop.fs.PathFilter)">splitLogDistributed</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;serverNames,
                                       <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&nbsp;logDirs,
@@ -2802,7 +2788,7 @@
  server.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="strong">MasterFileSystem.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/MasterFileSystem.html#splitMetaLog(java.util.Set)">splitMetaLog</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;serverNames)</code>
 <div class="block">Specialized method to handle the splitting for meta WAL</div>
@@ -3074,25 +3060,17 @@
 <td class="colLast"><span class="strong">RegionLocationFinder.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/RegionLocationFinder.html#getTopBlockLocations(org.apache.hadoop.hbase.HRegionInfo)">getTopBlockLocations</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
-<td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)">immediateAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
-                                      <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
-<div class="block">Generates an immediate assignment plan to be used by a new master for
- regions in transition that do not have an already known destination.</div>
-</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>protected <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
 <td class="colLast"><span class="strong">RegionLocationFinder.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/RegionLocationFinder.html#mapHostNameToServerName(java.util.List)">mapHostNameToServerName</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;hosts)</code>
 <div class="block">Map hostname to ServerName, The output ServerName list will have the same
  order as input hosts.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#mapRSToPrimaries(java.util.Map)">mapRSToPrimaries</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;primaryRSMap)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
@@ -3101,7 +3079,7 @@
  available/online servers available for assignment.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment(java.util.List,%20java.util.List)">roundRobinAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                         <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
@@ -3109,12 +3087,12 @@
  simple round-robin assignment.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html#roundRobinAssignment(java.util.List,%20java.util.List)">roundRobinAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                         <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;,<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html#segregateRegionsAndAssignRegionsWithFavoredNodes(java.util.List,%20java.util.List)">segregateRegionsAndAssignRegionsWithFavoredNodes</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                                                                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;availableServers)</code>&nbsp;</td>
@@ -3310,14 +3288,6 @@
                                     <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;skipServerSet)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
-<td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)">immediateAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
-                                      <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
-<div class="block">Generates an immediate assignment plan to be used by a new master for
- regions in transition that do not have an already known destination.</div>
-</td>
-</tr>
-<tr class="altColor">
 <td class="colFirst"><code>(package private) static <a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a></code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#makePutFromRegionInfo(org.apache.hadoop.hbase.HRegionInfo,%20java.util.List)">makePutFromRegionInfo</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                                           <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;favoredNodeList)</code>
@@ -3325,11 +3295,11 @@
  and the servers</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#mapRSToPrimaries(java.util.Map)">mapRSToPrimaries</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;primaryRSMap)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#multiRackCaseWithRestrictions(java.util.Map,%20java.util.Map,%20java.lang.String,%20org.apache.hadoop.hbase.ServerName,%20org.apache.hadoop.hbase.HRegionInfo)">multiRackCaseWithRestrictions</a></strong>(<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;serverToPrimaries,
                                                           <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]&gt;&nbsp;secondaryAndTertiaryMap,
@@ -3337,30 +3307,30 @@
                                                           <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;primaryRS,
                                                           <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#placePrimaryRSAsRoundRobin(java.util.Map,%20java.util.Map,%20java.util.List)">placePrimaryRSAsRoundRobin</a></strong>(<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;assignmentMap,
                                                     <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;primaryRSMap,
                                                     <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#placePrimaryRSAsRoundRobin(java.util.Map,%20java.util.Map,%20java.util.List)">placePrimaryRSAsRoundRobin</a></strong>(<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;assignmentMap,
                                                     <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;primaryRSMap,
                                                     <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#placeSecondaryAndTertiaryRS(java.util.Map)">placeSecondaryAndTertiaryRS</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;primaryRSMap)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#placeSecondaryAndTertiaryWithRestrictions(java.util.Map)">placeSecondaryAndTertiaryWithRestrictions</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;primaryRSMap)</code>
 <div class="block">For regions that share the primary, avoid placing the secondary and tertiary
  on a same RS.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#randomAssignment(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster,%20org.apache.hadoop.hbase.HRegionInfo,%20java.util.List)">randomAssignment</a></strong>(<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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
@@ -3368,19 +3338,19 @@
 <div class="block">Used to assign a single region to a random server.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#randomAssignment(org.apache.hadoop.hbase.HRegionInfo,%20java.util.List)">randomAssignment</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Used to assign a single region to a random server.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><span class="strong">FavoredNodeLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html#randomAssignment(org.apache.hadoop.hbase.HRegionInfo,%20java.util.List)">randomAssignment</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
@@ -3389,7 +3359,7 @@
  available/online servers available for assignment.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
@@ -3398,7 +3368,7 @@
  available/online servers available for assignment.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster,%20java.util.List,%20java.util.List,%20java.util.List,%20java.util.Map)">roundRobinAssignment</a></strong>(<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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
@@ -3408,7 +3378,7 @@
 <div class="block">Round robin a list of regions to a list of servers</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster,%20java.util.List,%20java.util.List,%20java.util.List,%20java.util.Map)">roundRobinAssignment</a></strong>(<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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
@@ -3418,7 +3388,7 @@
 <div class="block">Round robin a list of regions to a list of servers</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment(java.util.List,%20java.util.List)">roundRobinAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                         <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
@@ -3426,52 +3396,52 @@
  simple round-robin assignment.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html#roundRobinAssignment(java.util.List,%20java.util.List)">roundRobinAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                         <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="strong">FavoredNodeLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html#roundRobinAssignmentImpl(org.apache.hadoop.hbase.master.balancer.FavoredNodeAssignmentHelper,%20java.util.Map,%20java.util.List,%20java.util.List)">roundRobinAssignmentImpl</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html" title="class in org.apache.hadoop.hbase.master.balancer">FavoredNodeAssignmentHelper</a>&nbsp;assignmentHelper,
                                                 <a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;assignmentMap,
                                                 <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="strong">FavoredNodeLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html#roundRobinAssignmentImpl(org.apache.hadoop.hbase.master.balancer.FavoredNodeAssignmentHelper,%20java.util.Map,%20java.util.List,%20java.util.List)">roundRobinAssignmentImpl</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html" title="class in org.apache.hadoop.hbase.master.balancer">FavoredNodeAssignmentHelper</a>&nbsp;assignmentHelper,
                                                 <a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;assignmentMap,
                                                 <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;,<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html#segregateRegionsAndAssignRegionsWithFavoredNodes(java.util.List,%20java.util.List)">segregateRegionsAndAssignRegionsWithFavoredNodes</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                                                                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;availableServers)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="strong">FavoredNodesPlan.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodesPlan.html#updateAssignmentPlan(org.apache.hadoop.hbase.HRegionInfo,%20java.util.List)">updateAssignmentPlan</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
                                         <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Add an assignment to the plan</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="strong">FavoredNodesPlan.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodesPlan.html#updateFavoredNodesMap(org.apache.hadoop.hbase.HRegionInfo,%20java.util.List)">updateFavoredNodesMap</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;region,
                                           <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Add an assignment to the plan</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#updateMetaWithFavoredNodesInfo(java.util.Map,%20org.apache.hadoop.conf.Configuration)">updateMetaWithFavoredNodesInfo</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&gt;&nbsp;regionToFavoredNodes,
                                                             org.apache.hadoop.conf.Configuration&nbsp;conf)</code>
 <div class="block">Update meta table with favored nodes info</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#updateMetaWithFavoredNodesInfo(java.util.Map,%20org.apache.hadoop.hbase.client.Connection)">updateMetaWithFavoredNodesInfo</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&gt;&nbsp;regionToFavoredNodes,
                                                             <a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection)</code>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html b/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html
index 2ab0673..d04d3f5 100644
--- a/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html
@@ -80,12 +80,12 @@
 </ul>
 <h2 title="Annotation Type Hierarchy">Annotation Type Hierarchy</h2>
 <ul>
+<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Stable.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceStability.Stable</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
+<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Private.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceAudience.Private</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Evolving.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceStability.Evolving</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
-<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Public.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceAudience.Public</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.LimitedPrivate.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceAudience.LimitedPrivate</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Unstable.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceStability.Unstable</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
-<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Stable.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceStability.Stable</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
-<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Private.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceAudience.Private</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
+<li type="circle">org.apache.hadoop.hbase.classification.<a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Public.html" title="annotation in org.apache.hadoop.hbase.classification"><span class="strong">InterfaceAudience.Public</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 </ul>
 </div>
 <!-- ======= START OF BOTTOM NAVBAR ====== -->

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/client/ClusterConnection.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/ClusterConnection.html b/devapidocs/org/apache/hadoop/hbase/client/ClusterConnection.html
index c1c1d52..27688df 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/ClusterConnection.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/ClusterConnection.html
@@ -220,13 +220,17 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/HConnection.html"
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html#hasCellBlockSupport()">hasCellBlockSupport</a></strong>()</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html#isDeadServer(org.apache.hadoop.hbase.ServerName)">isDeadServer</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>
 <div class="block"><strong>Deprecated.</strong>&nbsp;
 <div class="block"><i>internal method, do not use thru HConnection</i></div>
 </div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html#isMasterRunning()">isMasterRunning</a></strong>()</code>
 <div class="block"><strong>Deprecated.</strong>&nbsp;
@@ -234,7 +238,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/HConnection.html"
 </div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html#isTableAvailable(org.apache.hadoop.hbase.TableName,%20byte[][])">isTableAvailable</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                 byte[][]&nbsp;splitKeys)</code>
@@ -242,13 +246,13 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/HConnection.html"
  splitkeys which was used while creating the given table.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html#locateRegion(byte[])">locateRegion</a></strong>(byte[]&nbsp;regionName)</code>
 <div class="block">Gets the location of the region of <i>regionName</i>.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html#locateRegion(org.apache.hadoop.hbase.TableName,%20byte[])">locateRegion</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                         byte[]&nbsp;row)</code>
@@ -256,14 +260,14 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/HConnection.html"
  lives in.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html#locateRegion(org.apache.hadoop.hbase.TableName,%20byte[],%20boolean,%20boolean)">locateRegion</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                         byte[]&nbsp;row,
                         boolean&nbsp;useCache,
                         boolean&nbsp;retry)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html#locateRegion(org.apache.hadoop.hbase.TableName,%20byte[],%20boolean,%20boolean,%20int)">locateRegion</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                         byte[]&nbsp;row,
@@ -271,13 +275,13 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/HConnection.html"
                         boolean&nbsp;retry,
                         int&nbsp;replicaId)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html#locateRegions(org.apache.hadoop.hbase.TableName)">locateRegions</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Gets the locations of all regions in the specified table, <i>tableName</i>.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html#locateRegions(org.apache.hadoop.hbase.TableName,%20boolean,%20boolean)">locateRegions</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                           boolean&nbsp;useCache,
@@ -285,7 +289,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/HConnection.html"
 <div class="block">Gets the locations of all regions in the specified table, <i>tableName</i>.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html#relocateRegion(org.apache.hadoop.hbase.TableName,%20byte[])">relocateRegion</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                             byte[]&nbsp;row)</code>
@@ -293,7 +297,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/HConnection.html"
  lives in, ignoring any value that might be in the cache.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html#relocateRegion(org.apache.hadoop.hbase.TableName,%20byte[],%20int)">relocateRegion</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                             byte[]&nbsp;row,
@@ -302,7 +306,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/HConnection.html"
  lives in, ignoring any value that might be in the cache.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html#updateCachedLocations(org.apache.hadoop.hbase.TableName,%20byte[],%20byte[],%20java.lang.Object,%20org.apache.hadoop.hbase.ServerName)">updateCachedLocations</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                           byte[]&nbsp;regionName,
@@ -789,13 +793,24 @@ boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/Clu
 <a name="getConnectionMetrics()">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>getConnectionMetrics</h4>
 <pre><a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ClusterConnection.html#line.304">getConnectionMetrics</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>the MetricsConnection instance associated with this connection.</dd></dl>
 </li>
 </ul>
+<a name="hasCellBlockSupport()">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>hasCellBlockSupport</h4>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ClusterConnection.html#line.310">hasCellBlockSupport</a>()</pre>
+<dl><dt><span class="strong">Returns:</span></dt><dd>true when this connection uses a <a href="../../../../../org/apache/hadoop/hbase/codec/Codec.html" title="interface in org.apache.hadoop.hbase.codec"><code>Codec</code></a> and so
+         supports cell blocks.</dd></dl>
+</li>
+</ul>
 </li>
 </ul>
 </li>


[21/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
index fbdde18..1d64963 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
@@ -2959,7 +2959,7 @@
 <span class="sourceLineNo">2951</span>    Set&lt;byte[]&gt; deletesCfSet = null;<a name="line.2951"></a>
 <span class="sourceLineNo">2952</span>    long currentNonceGroup = HConstants.NO_NONCE;<a name="line.2952"></a>
 <span class="sourceLineNo">2953</span>    long currentNonce = HConstants.NO_NONCE;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    WALEdit walEdit = new WALEdit(replay);<a name="line.2954"></a>
+<span class="sourceLineNo">2954</span>    WALEdit walEdit = null;<a name="line.2954"></a>
 <span class="sourceLineNo">2955</span>    boolean locked = false;<a name="line.2955"></a>
 <span class="sourceLineNo">2956</span>    // reference family maps directly so coprocessors can mutate them if desired<a name="line.2956"></a>
 <span class="sourceLineNo">2957</span>    Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps = new Map[batchOp.operations.length];<a name="line.2957"></a>
@@ -2970,4878 +2970,4890 @@
 <span class="sourceLineNo">2962</span>    int noOfPuts = 0;<a name="line.2962"></a>
 <span class="sourceLineNo">2963</span>    int noOfDeletes = 0;<a name="line.2963"></a>
 <span class="sourceLineNo">2964</span>    WriteEntry writeEntry = null;<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    try {<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>      int numReadyToWrite = 0;<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>          lastIndexExclusive++;<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>          continue;<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>        }<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>        RowLock rowLock = null;<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>        try {<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>        } catch (IOException ioe) {<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span>        }<a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>        if (rowLock == null) {<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>          // We failed to grab another lock<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>          break; // Stop acquiring more rows for this batch<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>        } else {<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>          acquiredRowLocks.add(rowLock);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span>        }<a name="line.2989"></a>
-<span class="sourceLineNo">2990</span><a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>        lastIndexExclusive++;<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>        numReadyToWrite++;<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span><a name="line.2993"></a>
-<span class="sourceLineNo">2994</span>        if (mutation instanceof Put) {<a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>          // If Column Families stay consistent through out all of the<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>          // individual puts then metrics can be reported as a multiput across<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>          // column families in the first put.<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>          if (putsCfSet == null) {<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>          } else {<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span>          }<a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>        } else {<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>          if (deletesCfSet == null) {<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>          } else {<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>          }<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span>        }<a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>      }<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span><a name="line.3013"></a>
-<span class="sourceLineNo">3014</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3014"></a>
-<span class="sourceLineNo">3015</span><a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3020"></a>
-<span class="sourceLineNo">3021</span><a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>        return 0L;<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>      }<a name="line.3025"></a>
+<span class="sourceLineNo">2965</span>    int cellCount = 0;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    try {<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>      int numReadyToWrite = 0;<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>          lastIndexExclusive++;<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span>          continue;<a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>        }<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>        RowLock rowLock = null;<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span>        try {<a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>        } catch (IOException ioe) {<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>        }<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>        if (rowLock == null) {<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>          // We failed to grab another lock<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span>          break; // Stop acquiring more rows for this batch<a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>        } else {<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>          acquiredRowLocks.add(rowLock);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>        }<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span><a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>        lastIndexExclusive++;<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span>        numReadyToWrite++;<a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>        if (replay) {<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>          for (List&lt;Cell&gt; cells : mutation.getFamilyCellMap().values()) {<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>            cellCount += cells.size();<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>          }<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>        }<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span>        if (mutation instanceof Put) {<a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>          // If Column Families stay consistent through out all of the<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>          // individual puts then metrics can be reported as a multiput across<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>          // column families in the first put.<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>          if (putsCfSet == null) {<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>          } else {<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>          }<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>        } else {<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>          if (deletesCfSet == null) {<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>          } else {<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>          }<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>        }<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>      }<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span><a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span><a name="line.3020"></a>
+<span class="sourceLineNo">3021</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3025"></a>
 <span class="sourceLineNo">3026</span><a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span>        // skip invalid<a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>          // lastIndexExclusive was incremented above.<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span>          continue;<a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>        }<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span><a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>        if (mutation instanceof Put) {<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>          noOfPuts++;<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>        } else {<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>          noOfDeletes++;<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>        }<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span>      }<a name="line.3044"></a>
-<span class="sourceLineNo">3045</span><a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>      locked = true;<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span><a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>      // calling the pre CP hook for batch mutation<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>          return 0L;<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>        }<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>      }<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span><a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>      // STEP 3. Build WAL edit<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>          continue;<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>        }<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>        Mutation m = batchOp.getMutation(i);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>          durability = tmpDur;<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>        }<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>          continue;<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span>        }<a name="line.3075"></a>
-<span class="sourceLineNo">3076</span><a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>        long nonce = batchOp.getNonce(i);<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>          // Write what we have so far for nonces out to WAL<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>          walEdit = new WALEdit(replay);<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span>          currentNonceGroup = nonceGroup;<a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>          currentNonce = nonce;<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>        }<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span><a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>        // Add WAL edits by CP<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>        if (fromCP != null) {<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span>            walEdit.add(cell);<a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>          }<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>        }<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span>      }<a name="line.3098"></a>
-<span class="sourceLineNo">3099</span><a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>      WALKey walKey = null;<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>      if (replay) {<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>        // use wal key from the original<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3107"></a>
-<span class="sourceLineNo">3108</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>      }<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>      if (!walEdit.isEmpty()) {<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>        if (!replay) {<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>        }<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>        try {<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span>          long txid =<a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>          if (txid != 0) sync(txid, durability);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span>          writeEntry = walKey.getWriteEntry();<a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>        } catch (IOException ioe) {<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>          throw ioe;<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>        }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>      }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span>      if (walKey == null) {<a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>        writeEntry = mvcc.begin();<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>      }<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span><a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>      // STEP 5. Write back to memstore<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>      long addedSize = 0;<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>          continue;<a name="line.3139"></a>
+<span class="sourceLineNo">3027</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>        return 0L;<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span>      }<a name="line.3030"></a>
+<span class="sourceLineNo">3031</span><a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>        // skip invalid<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>          // lastIndexExclusive was incremented above.<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>          continue;<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span>        }<a name="line.3038"></a>
+<span class="sourceLineNo">3039</span><a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>        if (mutation instanceof Put) {<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>          noOfPuts++;<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>        } else {<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>          noOfDeletes++;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>        }<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span>        if (fromCP != null) {<a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>          cellCount += fromCP.size();<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>        }<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>        for (List&lt;Cell&gt; cells : familyMaps[i].values()) {<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span>          cellCount += cells.size();<a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>        }<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>      }<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>      walEdit = new WALEdit(cellCount, replay);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>      locked = true;<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span><a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>      // calling the pre CP hook for batch mutation<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>          return 0L;<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>        }<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>      }<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>      // STEP 3. Build WAL edit<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span>          continue;<a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>        }<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span><a name="line.3078"></a>
+<span class="sourceLineNo">3079</span>        Mutation m = batchOp.getMutation(i);<a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>          durability = tmpDur;<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>        }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>          continue;<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>        }<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span><a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>        long nonce = batchOp.getNonce(i);<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>          // Write what we have so far for nonces out to WAL<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>          walEdit = new WALEdit(cellCount, replay);<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>          currentNonceGroup = nonceGroup;<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>          currentNonce = nonce;<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>        }<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span><a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>        // Add WAL edits by CP<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span>        if (fromCP != null) {<a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>            walEdit.add(cell);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>          }<a name="line.3107"></a>
+<span class="sourceLineNo">3108</span>        }<a name="line.3108"></a>
+<span class="sourceLineNo">3109</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>      }<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span><a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>      WALKey walKey = null;<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>      if (replay) {<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>        // use wal key from the original<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>      }<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>      if (!walEdit.isEmpty()) {<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span>        if (!replay) {<a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>        }<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>        try {<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>          long txid =<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>          if (txid != 0) sync(txid, durability);<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>          writeEntry = walKey.getWriteEntry();<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>        } catch (IOException ioe) {<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>          throw ioe;<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span>        }<a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span>      }<a name="line.3143"></a>
-<span class="sourceLineNo">3144</span><a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>      // STEP 6. Complete mvcc.<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>      if (replay) {<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>        mvcc.completeAndWait(writeEntry);<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>        writeEntry = null;<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span>      }<a name="line.3151"></a>
-<span class="sourceLineNo">3152</span><a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>      // STEP 7. Release row locks, etc.<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>      if (locked) {<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span>        this.updatesLock.readLock().unlock();<a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>        locked = false;<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>      }<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>      // calling the post CP hook for batch mutation<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>      }<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span><a name="line.3167"></a>
-<span class="sourceLineNo">3168</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>        }<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>      }<a name="line.3172"></a>
-<span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>          // only for successful puts<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span>              != OperationStatusCode.SUCCESS) {<a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>            continue;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>          }<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>          Mutation m = batchOp.getMutation(i);<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>          if (m instanceof Put) {<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>          } else {<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>          }<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>        }<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>      }<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span><a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>      success = true;<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span>      return addedSize;<a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    } finally {<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>      if (locked) {<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span>        this.updatesLock.readLock().unlock();<a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>      }<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span><a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>      // See if the column families were consistent through the whole thing.<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>      // null will be treated as unknown.<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span><a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>      if (noOfPuts &gt; 0) {<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>        // There were some Puts in the batch.<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>        if (this.metricsRegion != null) {<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span>          this.metricsRegion.updatePut();<a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>        }<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>      }<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>      if (noOfDeletes &gt; 0) {<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>        // There were some Deletes in the batch.<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>        if (this.metricsRegion != null) {<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span>          this.metricsRegion.updateDelete();<a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>        }<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>      }<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>      if (!success) {<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>          }<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>        }<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>      }<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>        // call the coprocessor hook to do any finalization steps<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>        // after the put is done<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>                lastIndexExclusive);<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>      }<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span><a name="line.3236"></a>
-<span class="sourceLineNo">3237</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    }<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>  }<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>  throws IOException {<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    if (walEdit.isEmpty()) return;<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>  }<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span><a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>  throws IOException {<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    boolean skip = false;<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    // Skip anything that "ran" already<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>      return true;<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span>    }<a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span>    // store the family map reference to allow for mutations<a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    try {<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>      if (mutation instanceof Put) {<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>        // Check the families in the put. If bad, skip this one.<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>        if (batchOp.isInReplay()) {<a name="line.3271"></a>
-<span class="sourceLineNo">3272</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>        } else {<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>          checkFamilies(familyMap.keySet());<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>        }<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>      } else {<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span>        prepareDelete((Delete)mutation);<a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>      }<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>      skip = true;<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>      skip = true;<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    } catch (WrongRegionException we) {<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>      skip = true;<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    }<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    return skip;<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>  }<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>  /**<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>   * During replay, there could exist column families which are removed between region server<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>   * failure and replay<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>   */<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>        if (nonExistentList == null) {<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span>        }<a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>        nonExistentList.add(family);<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>      }<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>    }<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>    if (nonExistentList != null) {<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>      for (byte[] family : nonExistentList) {<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>        // Perhaps schema was changed between crash and replay<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>        familyMap.remove(family);<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>      }<a name="line.3319"></a>
-<span class="sourceLineNo">3320</span>    }<a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>  }<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span><a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>  /**<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span>   * Returns effective durability from the passed durability and<a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>   * the table descriptor.<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span>   */<a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>  }<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span><a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>  @Override<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      boolean writeToWAL)<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>  throws IOException{<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    checkMutationType(mutation, row);<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>      mutation, writeToWAL);<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>  }<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span><a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>  @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3343"></a>
-<span class="sourceLineNo">3344</span>      boolean writeToWAL)<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>  throws IOException {<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, rm, null,<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>      writeToWAL);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>  }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span><a name="line.3349"></a>
-<span class="sourceLineNo">3350</span>  /**<a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>   * checkAndMutate and checkAndRowMutate are 90% the same. Rather than copy/paste, below has<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>   * switches in the few places where there is deviation.<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span>   */<a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>  private boolean doCheckAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rowMutations,<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>      Mutation mutation, boolean writeToWAL)<a name="line.3356"></a>
+<span class="sourceLineNo">3141</span>      }<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>      if (walKey == null) {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>        writeEntry = mvcc.begin();<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>      }<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span><a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>      // STEP 5. Write back to memstore<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>      long addedSize = 0;<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>          continue;<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>        }<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>      }<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span><a name="line.3156"></a>
+<span class="sourceLineNo">3157</span>      // STEP 6. Complete mvcc.<a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>      if (replay) {<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span>        mvcc.completeAndWait(writeEntry);<a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>        writeEntry = null;<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>      }<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span><a name="line.3164"></a>
+<span class="sourceLineNo">3165</span>      // STEP 7. Release row locks, etc.<a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>      if (locked) {<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>        this.updatesLock.readLock().unlock();<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>        locked = false;<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span>      }<a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span><a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>      // calling the post CP hook for batch mutation<a name="line.3172"></a>
+<span class="sourceLineNo">3173</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3173"></a>
+<span class="sourceLineNo">3174</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span>      }<a name="line.3178"></a>
+<span class="sourceLineNo">3179</span><a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span>        }<a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>      }<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span><a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span>          // only for successful puts<a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>              != OperationStatusCode.SUCCESS) {<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>            continue;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>          }<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span>          Mutation m = batchOp.getMutation(i);<a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>          if (m instanceof Put) {<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>          } else {<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>          }<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>        }<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>      }<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>      success = true;<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>      return addedSize;<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    } finally {<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>      if (locked) {<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>        this.updatesLock.readLock().unlock();<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>      }<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span><a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>      // See if the column families were consistent through the whole thing.<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>      // null will be treated as unknown.<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span><a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>      if (noOfPuts &gt; 0) {<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span>        // There were some Puts in the batch.<a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>        if (this.metricsRegion != null) {<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>          this.metricsRegion.updatePut();<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>        }<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>      }<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>      if (noOfDeletes &gt; 0) {<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span>        // There were some Deletes in the batch.<a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>        if (this.metricsRegion != null) {<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>          this.metricsRegion.updateDelete();<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>        }<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>      }<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span>      if (!success) {<a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>          }<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>        }<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>      }<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>        // call the coprocessor hook to do any finalization steps<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span>        // after the put is done<a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>                lastIndexExclusive);<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span>      }<a name="line.3247"></a>
+<span class="sourceLineNo">3248</span><a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span>    }<a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>  }<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span><a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  throws IOException {<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span>    if (walEdit.isEmpty()) return;<a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  }<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span><a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>  throws IOException {<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    boolean skip = false;<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    // Skip anything that "ran" already<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3271"></a>
+<span class="sourceLineNo">3272</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3272"></a>
+<span class="sourceLineNo">3273</span>      return true;<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    }<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span>    // store the family map reference to allow for mutations<a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span><a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    try {<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>      if (mutation instanceof Put) {<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span>        // Check the families in the put. If bad, skip this one.<a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>        if (batchOp.isInReplay()) {<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>        } else {<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>          checkFamilies(familyMap.keySet());<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>        }<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>      } else {<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>        prepareDelete((Delete)mutation);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>      }<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span>      skip = true;<a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>      skip = true;<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    } catch (WrongRegionException we) {<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>      skip = true;<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    }<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span>    return skip;<a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>  }<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span><a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>  /**<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>   * During replay, there could exist column families which are removed between region server<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>   * failure and replay<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3319"></a>
+<span class="sourceLineNo">3320</span>        if (nonExistentList == null) {<a name="line.3320"></a>
+<span class="sourceLineNo">3321</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>        }<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>        nonExistentList.add(family);<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>      }<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>    }<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>    if (nonExistentList != null) {<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>      for (byte[] family : nonExistentList) {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>        // Perhaps schema was changed between crash and replay<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span>        familyMap.remove(family);<a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>      }<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    }<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>  }<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>  /**<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span>   * Returns effective durability from the passed durability and<a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>   * the table descriptor.<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>   */<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>  }<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span><a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>  @Override<a name="line.3343"></a>
+<span class="sourceLineNo">3344</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3344"></a>
+<span class="sourceLineNo">3345</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>      boolean writeToWAL)<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span>  throws IOException{<a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    checkMutationType(mutation, row);<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>      mutation, writeToWAL);<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>  }<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span><a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>  @Override<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      boolean writeToWAL)<a name="line.3356"></a>
 <span class="sourceLineNo">3357</span>  throws IOException {<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // Could do the below checks but seems wacky with two callers only. Just comment out for now.<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // One caller passes a Mutation, the other passes RowMutation. Presume all good so we don't<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // need these commented out checks.<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // if (rowMutations == null &amp;&amp; mutation == null) throw new DoNotRetryIOException("Both null");<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // if (rowMutations != null &amp;&amp; mutation != null) throw new DoNotRetryIOException("Both set");<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    checkReadOnly();<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // TODO, add check for value length also move this check to the client<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span>    checkResources();<a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    startRegionOperation();<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    try {<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>      Get get = new Get(row);<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>      checkFamily(family);<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>      get.addColumn(family, qualifier);<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>      // Lock row - note that doBatchMutate will relock this row if called<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>      RowLock rowLock = getRowLock(get.getRow());<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>      try {<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>        if (mutation != null &amp;&amp; this.getCoprocessorHost() != null) {<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>          // Call coprocessor.<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>          Boolean processed = null;<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>          if (mutation instanceof Put) {<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>            processed = this.getCoprocessorHost().preCheckAndPutAfterRowLock(row, family,<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>                qualifier, compareOp, comparator, (Put)mutation);<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>          } else if (mutation instanceof Delete) {<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>            processed = this.getCoprocessorHost().preCheckAndDeleteAfterRowLock(row, family,<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span>                qualifier, compareOp, comparator, (Delete)mutation);<a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>          }<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>          if (processed != null) {<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>            return processed;<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>          }<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>        }<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>        // NOTE: We used to wait here until mvcc caught up:  mvcc.await();<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        // Supposition is that now all changes are done under row locks, then when we go to read,<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>        // we'll get the latest on this row.<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        List&lt;Cell&gt; result = get(get, false);<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>        boolean valueIsNull = comparator.getValue() == null || comparator.getValue().length == 0;<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        boolean matches = false;<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>        long cellTs = 0;<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        if (result.size() == 0 &amp;&amp; valueIsNull) {<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>          matches = true;<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>        } else if (result.size() &gt; 0 &amp;&amp; result.get(0).getValueLength() == 0 &amp;&amp; valueIsNull) {<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>          matches = true;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>          cellTs = result.get(0).getTimestamp();<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        } else if (result.size() == 1 &amp;&amp; !valueIsNull) {<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>          Cell kv = result.get(0);<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>          cellTs = kv.getTimestamp();<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>          int compareResult = CellComparator.compareValue(kv, comparator);<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span>          matches = matches(compareOp, compareResult);<a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>        }<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>        // If matches put the new put or delete the new delete<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>        if (matches) {<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>          // We have acquired the

<TRUNCATED>

[07/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
index d3abe39..c51826f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerTask.html
@@ -615,9 +615,9 @@
 <span class="sourceLineNo">607</span>            if (this.failOnError &amp;&amp; monitor.hasError()) {<a name="line.607"></a>
 <span class="sourceLineNo">608</span>              monitorThread.interrupt();<a name="line.608"></a>
 <span class="sourceLineNo">609</span>              if (monitor.initialized) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>                System.exit(monitor.errorCode);<a name="line.610"></a>
+<span class="sourceLineNo">610</span>                return monitor.errorCode;<a name="line.610"></a>
 <span class="sourceLineNo">611</span>              } else {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.612"></a>
+<span class="sourceLineNo">612</span>                return INIT_ERROR_EXIT_CODE;<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>            currentTimeLength = System.currentTimeMillis() - startTime;<a name="line.615"></a>
@@ -626,630 +626,629 @@
 <span class="sourceLineNo">618</span>                  + ") after timeout limit:" + this.timeout<a name="line.618"></a>
 <span class="sourceLineNo">619</span>                  + " will be killed itself !!");<a name="line.619"></a>
 <span class="sourceLineNo">620</span>              if (monitor.initialized) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>                System.exit(TIMEOUT_ERROR_EXIT_CODE);<a name="line.621"></a>
+<span class="sourceLineNo">621</span>                return TIMEOUT_ERROR_EXIT_CODE;<a name="line.621"></a>
 <span class="sourceLineNo">622</span>              } else {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.623"></a>
+<span class="sourceLineNo">623</span>                return INIT_ERROR_EXIT_CODE;<a name="line.623"></a>
 <span class="sourceLineNo">624</span>              }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>              break;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>            monitorThread.interrupt();<a name="line.630"></a>
-<span class="sourceLineNo">631</span>            System.exit(monitor.errorCode);<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } finally {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          if (monitor != null) monitor.close();<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>        Thread.sleep(interval);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      } while (interval &gt; 0);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    } // try-with-resources close<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    if (choreService != null) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      choreService.shutdown();<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    return(monitor.errorCode);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>  }<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private void printUsageAndExit() {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    System.err.printf(<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        getClass().getName());<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    System.err.println(" where [opts] are:");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    System.err.println("   -help          Show this help and exit.");<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    System.err.println("      which means to enable regionserver mode");<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    System.err.println("      only works in regionserver mode.");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        " default is true");<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        + " Default is hbase:canary");<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    System.err<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * A Factory method for {@link Monitor}.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   * Can be overridden by user.<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param index a start index for monitor target<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param args args passed from user<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a Monitor instance<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   */<a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    Monitor monitor = null;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    String[] monitorTargets = null;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    if(index &gt;= 0) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int length = args.length - index;<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      monitorTargets = new String[length];<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>    if (this.regionServerMode) {<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      monitor =<a name="line.691"></a>
-<span class="sourceLineNo">692</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.693"></a>
-<span class="sourceLineNo">694</span>              this.treatFailureAsError);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    } else {<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      monitor =<a name="line.696"></a>
-<span class="sourceLineNo">697</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    return monitor;<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>  // a Monitor super-class can be extended by users<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>    protected Connection connection;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    protected Admin admin;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    protected String[] targets;<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    protected boolean useRegExp;<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    protected boolean treatFailureAsError;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    protected boolean initialized = false;<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    protected boolean done = false;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected int errorCode = 0;<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    protected Sink sink;<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    protected ExecutorService executor;<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>    public boolean isDone() {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return done;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    public boolean hasError() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return errorCode != 0;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span><a name="line.725"></a>
-<span class="sourceLineNo">726</span>    public boolean finalCheckForErrors() {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      if (errorCode != 0) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>        return true;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      return treatFailureAsError &amp;&amp;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>    @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    public void close() throws IOException {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (this.admin != null) this.admin.close();<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span><a name="line.738"></a>
-<span class="sourceLineNo">739</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      this.connection = connection;<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      this.targets = monitorTargets;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      this.useRegExp = useRegExp;<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.sink = sink;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      this.executor = executor;<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>    @Override<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    public abstract void run();<a name="line.752"></a>
-<span class="sourceLineNo">753</span><a name="line.753"></a>
-<span class="sourceLineNo">754</span>    protected boolean initAdmin() {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      if (null == this.admin) {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        try {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>          this.admin = this.connection.getAdmin();<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        } catch (Exception e) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>        }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      } else if (admin.isAborted()) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>        LOG.error("HBaseAdmin aborted");<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      }<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return !this.hasError();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
-<span class="sourceLineNo">769</span><a name="line.769"></a>
-<span class="sourceLineNo">770</span>  // a monitor for region mode<a name="line.770"></a>
-<span class="sourceLineNo">771</span>  private static class RegionMonitor extends Monitor {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    // 10 minutes<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    // 1 days<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>    private long lastCheckTime = -1;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private boolean writeSniffing;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    private TableName writeTableName;<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    private int writeDataTTL;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private float regionsLowerLimit;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    private float regionsUpperLimit;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    private int checkPeriod;<a name="line.783"></a>
-<span class="sourceLineNo">784</span><a name="line.784"></a>
-<span class="sourceLineNo">785</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        boolean treatFailureAsError) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      Configuration conf = connection.getConfiguration();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      this.writeSniffing = writeSniffing;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      this.writeTableName = writeTableName;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      this.writeDataTTL =<a name="line.792"></a>
-<span class="sourceLineNo">793</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      this.regionsLowerLimit =<a name="line.794"></a>
-<span class="sourceLineNo">795</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      this.regionsUpperLimit =<a name="line.796"></a>
-<span class="sourceLineNo">797</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      this.checkPeriod =<a name="line.798"></a>
-<span class="sourceLineNo">799</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.799"></a>
-<span class="sourceLineNo">800</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>    @Override<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    public void run() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      if (this.initAdmin()) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        try {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.809"></a>
-<span class="sourceLineNo">810</span>            this.initialized = true;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>            for (String table : tables) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.812"></a>
-<span class="sourceLineNo">813</span>            }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          } else {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>          }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>          if (writeSniffing) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>              try {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                checkWriteTableDistribution();<a name="line.821"></a>
-<span class="sourceLineNo">822</span>              } catch (IOException e) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.823"></a>
-<span class="sourceLineNo">824</span>              }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>            }<a name="line.826"></a>
-<span class="sourceLineNo">827</span>            // sniff canary table with write operation<a name="line.827"></a>
-<span class="sourceLineNo">828</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.828"></a>
-<span class="sourceLineNo">829</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>          }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            try {<a name="line.833"></a>
-<span class="sourceLineNo">834</span>              future.get();<a name="line.834"></a>
-<span class="sourceLineNo">835</span>            } catch (ExecutionException e) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>              LOG.error("Sniff region failed!", e);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>            }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          }<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        } catch (Exception e) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>          LOG.error("Run regionMonitor failed", e);<a name="line.840"></a>
-<span class="sourceLineNo">841</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      this.done = true;<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      String[] returnTables = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span><a name="line.849"></a>
-<span class="sourceLineNo">850</span>      if (this.useRegExp) {<a name="line.850"></a>
-<span class="sourceLineNo">851</span>        Pattern pattern = null;<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        HTableDescriptor[] tds = null;<a name="line.852"></a>
-<span class="sourceLineNo">853</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        try {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>          if (LOG.isDebugEnabled()) {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>            LOG.debug(String.format("reading list of tables"));<a name="line.856"></a>
-<span class="sourceLineNo">857</span>          }<a name="line.857"></a>
-<span class="sourceLineNo">858</span>          tds = this.admin.listTables(pattern);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>          if (tds == null) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>            tds = new HTableDescriptor[0];<a name="line.860"></a>
-<span class="sourceLineNo">861</span>          }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>          for (String monitorTarget : monitorTargets) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>            pattern = Pattern.compile(monitorTarget);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>            for (HTableDescriptor td : tds) {<a name="line.864"></a>
-<span class="sourceLineNo">865</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>                tmpTables.add(td.getNameAsString());<a name="line.866"></a>
-<span class="sourceLineNo">867</span>              }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>            }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>          }<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        } catch (IOException e) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          LOG.error("Communicate with admin failed", e);<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          throw e;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>        if (tmpTables.size() &gt; 0) {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>        } else {<a name="line.877"></a>
-<span class="sourceLineNo">878</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          LOG.error(msg);<a name="line.879"></a>
-<span class="sourceLineNo">880</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>          throw new TableNotFoundException(msg);<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        }<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      } else {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>        returnTables = monitorTargets;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>      return returnTables;<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    }<a name="line.888"></a>
-<span class="sourceLineNo">889</span><a name="line.889"></a>
-<span class="sourceLineNo">890</span>    /*<a name="line.890"></a>
-<span class="sourceLineNo">891</span>     * canary entry point to monitor all the tables.<a name="line.891"></a>
-<span class="sourceLineNo">892</span>     */<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType) throws Exception {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      if (LOG.isDebugEnabled()) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        LOG.debug(String.format("reading list of tables"));<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.899"></a>
-<span class="sourceLineNo">900</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        }<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      return taskFutures;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      if (!admin.tableExists(writeTableName)) {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>        int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.909"></a>
-<span class="sourceLineNo">910</span>        if (numberOfServers == 0) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>          throw new IllegalStateException("No live regionservers");<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        }<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        createWriteTable(numberOfServers);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        admin.enableTable(writeTableName);<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      }<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>      int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      List&lt;Pair&lt;HRegionInfo, ServerName&gt;&gt; pairs =<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      int numberOfRegions = pairs.size();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        admin.disableTable(writeTableName);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        admin.deleteTable(writeTableName);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        createWriteTable(numberOfServers);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;ServerName&gt;();<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      for (Pair&lt;HRegionInfo, ServerName&gt; pair : pairs) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        serverSet.add(pair.getSecond());<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      int numberOfCoveredServers = serverSet.size();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        admin.balancer();<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    }<a name="line.938"></a>
-<span class="sourceLineNo">939</span><a name="line.939"></a>
-<span class="sourceLineNo">940</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          + " and you can change it by config: "<a name="line.945"></a>
-<span class="sourceLineNo">946</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      family.setMaxVersions(1);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      family.setTimeToLive(writeDataTTL);<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      desc.addFamily(family);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      admin.createTable(desc, splits);<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    }<a name="line.955"></a>
-<span class="sourceLineNo">956</span>  }<a name="line.956"></a>
-<span class="sourceLineNo">957</span><a name="line.957"></a>
-<span class="sourceLineNo">958</span>  /**<a name="line.958"></a>
-<span class="sourceLineNo">959</span>   * Canary entry point for specified table.<a name="line.959"></a>
-<span class="sourceLineNo">960</span>   * @throws Exception<a name="line.960"></a>
-<span class="sourceLineNo">961</span>   */<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static void sniff(final Admin admin, TableName tableName)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      throws Exception {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    sniff(admin, tableName, TaskType.READ);<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>  /**<a name="line.967"></a>
-<span class="sourceLineNo">968</span>   * Canary entry point for specified table with task type(read/write)<a name="line.968"></a>
-<span class="sourceLineNo">969</span>   * @throws Exception<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   */<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  public static void sniff(final Admin admin, TableName tableName, TaskType taskType)<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      throws Exception {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    List&lt;Future&lt;Void&gt;&gt; taskFutures =<a name="line.973"></a>
-<span class="sourceLineNo">974</span>        Canary.sniff(admin, new StdOutSink(), tableName.getNameAsString(),<a name="line.974"></a>
-<span class="sourceLineNo">975</span>          new ScheduledThreadPoolExecutor(1), taskType);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    for (Future&lt;Void&gt; future : taskFutures) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      future.get();<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><a name="line.980"></a>
-<span class="sourceLineNo">981</span>  /**<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   * Canary entry point for specified table.<a name="line.982"></a>
-<span class="sourceLineNo">983</span>   * @throws Exception<a name="line.983"></a>
-<span class="sourceLineNo">984</span>   */<a name="line.984"></a>
-<span class="sourceLineNo">985</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      ExecutorService executor, TaskType taskType) throws Exception {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    if (LOG.isDebugEnabled()) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        tableName));<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        executor, taskType);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    } else {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  /*<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>   * Loops over regions that owns this table, and output some information abouts the state.<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType) throws Exception {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span><a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    if (LOG.isDebugEnabled()) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>    Table table = null;<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    try {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    } catch (TableNotFoundException e) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      return new ArrayList&lt;Future&lt;Void&gt;&gt;();<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;RegionTask&gt;();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    try {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      for (HRegionInfo region : admin.getTableRegions(tableDesc.getTableName())) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        tasks.add(new RegionTask(admin.getConnection(), region, sink, taskType));<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    } finally {<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      table.close();<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    return executor.invokeAll(tasks);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>  // a monitor for regionserver mode<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  private static class RegionServerMonitor extends Monitor {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    private boolean allRegions;<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    public RegionServerMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        ExtendedSink sink, ExecutorService executor, boolean allRegions,<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        boolean treatFailureAsError) {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      this.allRegions = allRegions;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span><a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    private ExtendedSink getSink() {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      return (ExtendedSink) this.sink;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span><a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    @Override<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    public void run() {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      if (this.initAdmin() &amp;&amp; this.checkNoTableNames()) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = this.filterRegionServerByName();<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        this.initialized = true;<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>        this.monitorRegionServers(rsAndRMap);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      this.done = true;<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>    private boolean checkNoTableNames() {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      List&lt;String&gt; foundTableNames = new ArrayList&lt;String&gt;();<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>      TableName[] tableNames = null;<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      if (LOG.isDebugEnabled()) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      try {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>        tableNames = this.admin.listTableNames();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      } catch (IOException e) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        LOG.error("Get listTableNames failed", e);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        return false;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      if (this.targets == null || this.targets.length == 0) return true;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      for (String target : this.targets) {<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        for (TableName tableName : tableNames) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          if (target.equals(tableName.getNameAsString())) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>            foundTableNames.add(target);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (foundTableNames.size() &gt; 0) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        System.err.println("Cannot pass a tablename when using the -regionserver " +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>            "option, tablenames:" + foundTableNames.toString());<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        this.errorCode = USAGE_EXIT_CODE;<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      }<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      return foundTableNames.size() == 0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    }<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span><a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    private void monitorRegionServers(Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      List&lt;RegionServerTask&gt; tasks = new ArrayList&lt;RegionServerTask&gt;();<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      Map&lt;String, AtomicLong&gt; successMap = new HashMap&lt;String, AtomicLong&gt;();<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      Random rand = new Random();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        String serverName = entry.getKey();<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        AtomicLong successes = new AtomicLong(0);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        successMap.put(serverName, successes);<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        if (this.allRegions) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>          for (HRegionInfo region : entry.getValue()) {<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            tasks.add(new RegionServerTask(this.connection,<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>                serverName,<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>                region,<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>                getSink(),<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>                successes));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>          }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        } else {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>          // random select a region if flag not set<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>          HRegionInfo region = entry.getValue().get(rand.nextInt(entry.getValue().size()));<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>          tasks.add(new RegionServerTask(this.connection,<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>              serverName,<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>              region,<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>              getSink(),<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>              successes));<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>        }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      }<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>      try {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>          try {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>            future.get();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          } catch (ExecutionException e) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.error("Sniff regionserver failed!", e);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        if (this.allRegions) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>            String serverName = entry.getKey();<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            LOG.info("Successfully read " + successMap.get(serverName) + " regions out of "<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>                    + entry.getValue().size() + " on regionserver:" + serverName);<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      } catch (InterruptedException e) {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        LOG.error("Sniff regionserver interrupted!", e);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      }<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>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; filterRegionServerByName() {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; regionServerAndRegionsMap = this.getAllRegionServerByName();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      regionServerAndRegionsMap = this.doFilterRegionServerByName(regionServerAndRegionsMap);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>      return regionServerAndRegionsMap;<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; getAllRegionServerByName() {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      Table table = null;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      RegionLocator regionLocator = null;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      try {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        if (LOG.isDebugEnabled()) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          LOG.debug(String.format("reading list of tables and locations"));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        HTableDescriptor[] tableDescs = this.admin.listTables();<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        List&lt;HRegionInfo&gt; regions = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>        for (HTableDescriptor tableDesc : tableDescs) {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>          table = this.admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>          regionLocator = this.admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>          for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>            ServerName rs = location.getServerName();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>            String rsName = rs.getHostname();<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>            HRegionInfo r = location.getRegionInfo();<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>            if (rsAndRMap.containsKey(rsName)) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>              regions = rsAndRMap.get(rsName);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            } else {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>              regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>              rsAndRMap.put(rsName, regions);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>            regions.add(r);<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>          }<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>          table.close();<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span><a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      } catch (IOException e) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        String msg = "Get HTables info failed";<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        LOG.error(msg, e);<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>      } finally {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        if (table != null) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          try {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            table.close();<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          } catch (IOException e) {<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>            LOG.warn("Close table failed", e);<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>        }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>      }<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span><a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return rsAndRMap;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; doFilterRegionServerByName(<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; fullRsAndRMap) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; filteredRsAndRMap = null;<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span><a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        filteredRsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        Pattern pattern = null;<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        Matcher matcher = null;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        boolean regExpFound = false;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (String rsName : this.targets) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (this.useRegExp) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>            regExpFound = false;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>            pattern = Pattern.compile(rsName);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : fullRsAndRMap.entrySet()) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>              matcher = pattern.matcher(entry.getKey());<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>              if (matcher.matches()) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>                filteredRsAndRMap.put(entry.getKey(), entry.getValue());<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>                regExpFound = true;<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>            if (!regExpFound) {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>              LOG.info("No RegionServerInfo found, regionServerPattern:" + rsName);<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            if (fullRsAndRMap.containsKey(rsName)) {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>              filteredRsAndRMap.put(rsName, fullRsAndRMap.get(rsName));<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>            } else {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>              LOG.info("No RegionServerInfo found, regionServerName:" + rsName);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>            }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>          }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        }<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>        filteredRsAndRMap = fullRsAndRMap;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return filteredRsAndRMap;<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><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  public static void main(String[] args) throws Exception {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    final Configuration conf = HBaseConfiguration.create();<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span><a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // loading the generic options to conf<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    new GenericOptionsParser(conf, args);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    int numThreads = conf.getInt("hbase.canary.threads.num", MAX_THREADS_NUM);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    LOG.info("Number of exection threads " + numThreads);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span><a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(numThreads);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span><a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    Class&lt;? extends Sink&gt; sinkClass =<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        conf.getClass("hbase.canary.sink.class", RegionServerStdOutSink.class, Sink.class);<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>    Sink sink = ReflectionUtils.newInstance(sinkClass);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span><a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    int exitCode = ToolRunner.run(conf, new Canary(executor, sink), args);<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    executor.shutdown();<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    System.exit(exitCode);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>}<a name="line.1244"></a>
+<span class="sourceLineNo">625</span>            }<a name="line.625"></a>
+<span class="sourceLineNo">626</span>          }<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>            monitorThread.interrupt();<a name="line.629"></a>
+<span class="sourceLineNo">630</span>            return monitor.errorCode;<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        } finally {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>          if (monitor != null) monitor.close();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        }<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>        Thread.sleep(interval);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      } while (interval &gt; 0);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    } // try-with-resources close<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    if (choreService != null) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>      choreService.shutdown();<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    return monitor.errorCode;<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>  private void printUsageAndExit() {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    System.err.printf(<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        getClass().getName());<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    System.err.println(" where [opts] are:");<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.err.println("   -help          Show this help and exit.");<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    System.err.println("      which means to enable regionserver mode");<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    System.err.println("      only works in regionserver mode.");<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        " default is true");<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.665"></a>
+<span class="sourceLineNo">666</span>        + " Default is hbase:canary");<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    System.err<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    System.exit(USAGE_EXIT_CODE);<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>   * A Factory method for {@link Monitor}.<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * Can be overridden by user.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @param index a start index for monitor target<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   * @param args args passed from user<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   * @return a Monitor instance<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   */<a name="line.678"></a>
+<span class="sourceLineNo">679</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Monitor monitor = null;<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    String[] monitorTargets = null;<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>    if(index &gt;= 0) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      int length = args.length - index;<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      monitorTargets = new String[length];<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.regionServerMode) {<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      monitor =<a name="line.690"></a>
+<span class="sourceLineNo">691</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.691"></a>
+<span class="sourceLineNo">692</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.692"></a>
+<span class="sourceLineNo">693</span>              this.treatFailureAsError);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    } else {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      monitor =<a name="line.695"></a>
+<span class="sourceLineNo">696</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.696"></a>
+<span class="sourceLineNo">697</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return monitor;<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">702</span>  // a Monitor super-class can be extended by users<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    protected Connection connection;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    protected Admin admin;<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    protected String[] targets;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    protected boolean useRegExp;<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    protected boolean treatFailureAsError;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    protected boolean initialized = false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>    protected boolean done = false;<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    protected int errorCode = 0;<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    protected Sink sink;<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    protected ExecutorService executor;<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>    public boolean isDone() {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      return done;<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>    public boolean hasError() {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      return errorCode != 0;<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">724</span><a name="line.724"></a>
+<span class="sourceLineNo">725</span>    public boolean finalCheckForErrors() {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      if (errorCode != 0) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        return true;<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      return treatFailureAsError &amp;&amp;<a name="line.729"></a>
+<span class="sourceLineNo">730</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>    @Override<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    public void close() throws IOException {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (this.admin != null) this.admin.close();<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.738"></a>
+<span class="sourceLineNo">739</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.740"></a>
+<span class="sourceLineNo">741</span><a name="line.741"></a>
+<span class="sourceLineNo">742</span>      this.connection = connection;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      this.targets = monitorTargets;<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      this.useRegExp = useRegExp;<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      this.sink = sink;<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      this.executor = executor;<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>    @Override<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    public abstract void run();<a name="line.751"></a>
+<span class="sourceLineNo">752</span><a name="line.752"></a>
+<span class="sourceLineNo">753</span>    protected boolean initAdmin() {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>      if (null == this.admin) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        try {<a name="line.755"></a>
+<span class="sourceLineNo">756</span>          this.admin = this.connection.getAdmin();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        } catch (Exception e) {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.758"></a>
+<span class="sourceLineNo">759</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
+<span class="sourceLineNo">761</span>      } else if (admin.isAborted()) {<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        LOG.error("HBaseAdmin aborted");<a name="line.762"></a>
+<span class="sourceLineNo">763</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      return !this.hasError();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
+<span class="sourceLineNo">767</span>  }<a name="line.767"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>  // a monitor for region mode<a name="line.769"></a>
+<span class="sourceLineNo">770</span>  private static class RegionMonitor extends Monitor {<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    // 10 minutes<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    // 1 days<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    private long lastCheckTime = -1;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    private boolean writeSniffing;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    private TableName writeTableName;<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private int writeDataTTL;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    private float regionsLowerLimit;<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    private float regionsUpperLimit;<a name="line.781"></a>
+<span class="sourceLineNo">782</span>    private int checkPeriod;<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.784"></a>
+<span class="sourceLineNo">785</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.785"></a>
+<span class="sourceLineNo">786</span>        boolean treatFailureAsError) {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      Configuration conf = connection.getConfiguration();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      this.writeSniffing = writeSniffing;<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      this.writeTableName = writeTableName;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      this.writeDataTTL =<a name="line.791"></a>
+<span class="sourceLineNo">792</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.792"></a>
+<span class="sourceLineNo">793</span>      this.regionsLowerLimit =<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      this.regionsUpperLimit =<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.796"></a>
+<span class="sourceLineNo">797</span>      this.checkPeriod =<a name="line.797"></a>
+<span class="sourceLineNo">798</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.798"></a>
+<span class="sourceLineNo">799</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    @Override<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    public void run() {<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      if (this.initAdmin()) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>        try {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>            this.initialized = true;<a name="line.809"></a>
+<span class="sourceLineNo">810</span>            for (String table : tables) {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.811"></a>
+<span class="sourceLineNo">812</span>            }<a name="line.812"></a>
+<span class="sourceLineNo">813</span>          } else {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.814"></a>
+<span class="sourceLineNo">815</span>          }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>          if (writeSniffing) {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>              try {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>                checkWriteTableDistribution();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>              } catch (IOException e) {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>              }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.824"></a>
+<span class="sourceLineNo">825</span>            }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>            // sniff canary table with write operation<a name="line.826"></a>
+<span class="sourceLineNo">827</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.827"></a>
+<span class="sourceLineNo">828</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.828"></a>
+<span class="sourceLineNo">829</span>          }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>            try {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>              future.get();<a name="line.833"></a>
+<span class="sourceLineNo">834</span>            } catch (ExecutionException e) {<a name="line.834"></a>
+<span class="sourceLineNo">835</span>              LOG.error("Sniff region failed!", e);<a name="line.835"></a>
+<span class="sourceLineNo">836</span>            }<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        } catch (Exception e) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>          LOG.error("Run regionMonitor failed", e);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          this.errorCode = ERROR_EXIT_CODE;<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>      this.done = true;<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>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>      String[] returnTables = null;<a name="line.847"></a>
+<span class="sourceLineNo">848</span><a name="line.848"></a>
+<span class="sourceLineNo">849</span>      if (this.useRegExp) {<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        Pattern pattern = null;<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        HTableDescriptor[] tds = null;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        try {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          if (LOG.isDebugEnabled()) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>            LOG.debug(String.format("reading list of tables"));<a name="line.855"></a>
+<span class="sourceLineNo">856</span>          }<a name="line.856"></a>
+<span class="sourceLineNo">857</span>          tds = this.admin.listTables(pattern);<a name="line.857"></a>
+<span class="sourceLineNo">858</span>          if (tds == null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            tds = new HTableDescriptor[0];<a name="line.859"></a>
+<span class="sourceLineNo">860</span>          }<a name="line.860"></a>
+<span class="sourceLineNo">861</span>          for (String monitorTarget : monitorTargets) {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>            pattern = Pattern.compile(monitorTarget);<a name="line.862"></a>
+<span class="sourceLineNo">863</span>            for (HTableDescriptor td : tds) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>                tmpTables.add(td.getNameAsString());<a name="line.865"></a>
+<span class="sourceLineNo">866</span>              }<a name="line.866"></a>
+<span class="sourceLineNo">867</span>            }<a name="line.867"></a>
+<span class="sourceLineNo">868</span>          }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        } catch (IOException e) {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>          LOG.error("Communicate with admin failed", e);<a name="line.870"></a>
+<span class="sourceLineNo">871</span>          throw e;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>        if (tmpTables.size() &gt; 0) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>        } else {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          LOG.error(msg);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          throw new TableNotFoundException(msg);<a name="line.880"></a>
+<span class="sourceLineNo">881</span>        }<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      } else {<a name="line.882"></a>
+<span class="s

<TRUNCATED>

[05/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
index d3abe39..c51826f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.html
@@ -615,9 +615,9 @@
 <span class="sourceLineNo">607</span>            if (this.failOnError &amp;&amp; monitor.hasError()) {<a name="line.607"></a>
 <span class="sourceLineNo">608</span>              monitorThread.interrupt();<a name="line.608"></a>
 <span class="sourceLineNo">609</span>              if (monitor.initialized) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>                System.exit(monitor.errorCode);<a name="line.610"></a>
+<span class="sourceLineNo">610</span>                return monitor.errorCode;<a name="line.610"></a>
 <span class="sourceLineNo">611</span>              } else {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.612"></a>
+<span class="sourceLineNo">612</span>                return INIT_ERROR_EXIT_CODE;<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>            currentTimeLength = System.currentTimeMillis() - startTime;<a name="line.615"></a>
@@ -626,630 +626,629 @@
 <span class="sourceLineNo">618</span>                  + ") after timeout limit:" + this.timeout<a name="line.618"></a>
 <span class="sourceLineNo">619</span>                  + " will be killed itself !!");<a name="line.619"></a>
 <span class="sourceLineNo">620</span>              if (monitor.initialized) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>                System.exit(TIMEOUT_ERROR_EXIT_CODE);<a name="line.621"></a>
+<span class="sourceLineNo">621</span>                return TIMEOUT_ERROR_EXIT_CODE;<a name="line.621"></a>
 <span class="sourceLineNo">622</span>              } else {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.623"></a>
+<span class="sourceLineNo">623</span>                return INIT_ERROR_EXIT_CODE;<a name="line.623"></a>
 <span class="sourceLineNo">624</span>              }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>              break;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>            monitorThread.interrupt();<a name="line.630"></a>
-<span class="sourceLineNo">631</span>            System.exit(monitor.errorCode);<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } finally {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          if (monitor != null) monitor.close();<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>        Thread.sleep(interval);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      } while (interval &gt; 0);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    } // try-with-resources close<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    if (choreService != null) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      choreService.shutdown();<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    return(monitor.errorCode);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>  }<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private void printUsageAndExit() {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    System.err.printf(<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        getClass().getName());<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    System.err.println(" where [opts] are:");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    System.err.println("   -help          Show this help and exit.");<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    System.err.println("      which means to enable regionserver mode");<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    System.err.println("      only works in regionserver mode.");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        " default is true");<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        + " Default is hbase:canary");<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    System.err<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * A Factory method for {@link Monitor}.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   * Can be overridden by user.<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param index a start index for monitor target<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param args args passed from user<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a Monitor instance<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   */<a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    Monitor monitor = null;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    String[] monitorTargets = null;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    if(index &gt;= 0) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int length = args.length - index;<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      monitorTargets = new String[length];<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>    if (this.regionServerMode) {<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      monitor =<a name="line.691"></a>
-<span class="sourceLineNo">692</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.693"></a>
-<span class="sourceLineNo">694</span>              this.treatFailureAsError);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    } else {<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      monitor =<a name="line.696"></a>
-<span class="sourceLineNo">697</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    return monitor;<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>  // a Monitor super-class can be extended by users<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>    protected Connection connection;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    protected Admin admin;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    protected String[] targets;<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    protected boolean useRegExp;<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    protected boolean treatFailureAsError;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    protected boolean initialized = false;<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    protected boolean done = false;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected int errorCode = 0;<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    protected Sink sink;<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    protected ExecutorService executor;<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>    public boolean isDone() {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return done;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    public boolean hasError() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return errorCode != 0;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span><a name="line.725"></a>
-<span class="sourceLineNo">726</span>    public boolean finalCheckForErrors() {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      if (errorCode != 0) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>        return true;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      return treatFailureAsError &amp;&amp;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>    @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    public void close() throws IOException {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (this.admin != null) this.admin.close();<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span><a name="line.738"></a>
-<span class="sourceLineNo">739</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      this.connection = connection;<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      this.targets = monitorTargets;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      this.useRegExp = useRegExp;<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.sink = sink;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      this.executor = executor;<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>    @Override<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    public abstract void run();<a name="line.752"></a>
-<span class="sourceLineNo">753</span><a name="line.753"></a>
-<span class="sourceLineNo">754</span>    protected boolean initAdmin() {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      if (null == this.admin) {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        try {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>          this.admin = this.connection.getAdmin();<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        } catch (Exception e) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>        }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      } else if (admin.isAborted()) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>        LOG.error("HBaseAdmin aborted");<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      }<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return !this.hasError();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
-<span class="sourceLineNo">769</span><a name="line.769"></a>
-<span class="sourceLineNo">770</span>  // a monitor for region mode<a name="line.770"></a>
-<span class="sourceLineNo">771</span>  private static class RegionMonitor extends Monitor {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    // 10 minutes<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    // 1 days<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>    private long lastCheckTime = -1;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private boolean writeSniffing;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    private TableName writeTableName;<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    private int writeDataTTL;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private float regionsLowerLimit;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    private float regionsUpperLimit;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    private int checkPeriod;<a name="line.783"></a>
-<span class="sourceLineNo">784</span><a name="line.784"></a>
-<span class="sourceLineNo">785</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        boolean treatFailureAsError) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      Configuration conf = connection.getConfiguration();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      this.writeSniffing = writeSniffing;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      this.writeTableName = writeTableName;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      this.writeDataTTL =<a name="line.792"></a>
-<span class="sourceLineNo">793</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      this.regionsLowerLimit =<a name="line.794"></a>
-<span class="sourceLineNo">795</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      this.regionsUpperLimit =<a name="line.796"></a>
-<span class="sourceLineNo">797</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      this.checkPeriod =<a name="line.798"></a>
-<span class="sourceLineNo">799</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.799"></a>
-<span class="sourceLineNo">800</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>    @Override<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    public void run() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      if (this.initAdmin()) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        try {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.809"></a>
-<span class="sourceLineNo">810</span>            this.initialized = true;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>            for (String table : tables) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.812"></a>
-<span class="sourceLineNo">813</span>            }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          } else {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>          }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>          if (writeSniffing) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>              try {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                checkWriteTableDistribution();<a name="line.821"></a>
-<span class="sourceLineNo">822</span>              } catch (IOException e) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.823"></a>
-<span class="sourceLineNo">824</span>              }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>            }<a name="line.826"></a>
-<span class="sourceLineNo">827</span>            // sniff canary table with write operation<a name="line.827"></a>
-<span class="sourceLineNo">828</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.828"></a>
-<span class="sourceLineNo">829</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>          }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            try {<a name="line.833"></a>
-<span class="sourceLineNo">834</span>              future.get();<a name="line.834"></a>
-<span class="sourceLineNo">835</span>            } catch (ExecutionException e) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>              LOG.error("Sniff region failed!", e);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>            }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          }<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        } catch (Exception e) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>          LOG.error("Run regionMonitor failed", e);<a name="line.840"></a>
-<span class="sourceLineNo">841</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      this.done = true;<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      String[] returnTables = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span><a name="line.849"></a>
-<span class="sourceLineNo">850</span>      if (this.useRegExp) {<a name="line.850"></a>
-<span class="sourceLineNo">851</span>        Pattern pattern = null;<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        HTableDescriptor[] tds = null;<a name="line.852"></a>
-<span class="sourceLineNo">853</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        try {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>          if (LOG.isDebugEnabled()) {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>            LOG.debug(String.format("reading list of tables"));<a name="line.856"></a>
-<span class="sourceLineNo">857</span>          }<a name="line.857"></a>
-<span class="sourceLineNo">858</span>          tds = this.admin.listTables(pattern);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>          if (tds == null) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>            tds = new HTableDescriptor[0];<a name="line.860"></a>
-<span class="sourceLineNo">861</span>          }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>          for (String monitorTarget : monitorTargets) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>            pattern = Pattern.compile(monitorTarget);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>            for (HTableDescriptor td : tds) {<a name="line.864"></a>
-<span class="sourceLineNo">865</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>                tmpTables.add(td.getNameAsString());<a name="line.866"></a>
-<span class="sourceLineNo">867</span>              }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>            }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>          }<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        } catch (IOException e) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          LOG.error("Communicate with admin failed", e);<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          throw e;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>        if (tmpTables.size() &gt; 0) {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>        } else {<a name="line.877"></a>
-<span class="sourceLineNo">878</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          LOG.error(msg);<a name="line.879"></a>
-<span class="sourceLineNo">880</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>          throw new TableNotFoundException(msg);<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        }<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      } else {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>        returnTables = monitorTargets;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>      return returnTables;<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    }<a name="line.888"></a>
-<span class="sourceLineNo">889</span><a name="line.889"></a>
-<span class="sourceLineNo">890</span>    /*<a name="line.890"></a>
-<span class="sourceLineNo">891</span>     * canary entry point to monitor all the tables.<a name="line.891"></a>
-<span class="sourceLineNo">892</span>     */<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType) throws Exception {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      if (LOG.isDebugEnabled()) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        LOG.debug(String.format("reading list of tables"));<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.899"></a>
-<span class="sourceLineNo">900</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        }<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      return taskFutures;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      if (!admin.tableExists(writeTableName)) {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>        int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.909"></a>
-<span class="sourceLineNo">910</span>        if (numberOfServers == 0) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>          throw new IllegalStateException("No live regionservers");<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        }<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        createWriteTable(numberOfServers);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        admin.enableTable(writeTableName);<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      }<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>      int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      List&lt;Pair&lt;HRegionInfo, ServerName&gt;&gt; pairs =<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      int numberOfRegions = pairs.size();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        admin.disableTable(writeTableName);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        admin.deleteTable(writeTableName);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        createWriteTable(numberOfServers);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;ServerName&gt;();<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      for (Pair&lt;HRegionInfo, ServerName&gt; pair : pairs) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        serverSet.add(pair.getSecond());<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      int numberOfCoveredServers = serverSet.size();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        admin.balancer();<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    }<a name="line.938"></a>
-<span class="sourceLineNo">939</span><a name="line.939"></a>
-<span class="sourceLineNo">940</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          + " and you can change it by config: "<a name="line.945"></a>
-<span class="sourceLineNo">946</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      family.setMaxVersions(1);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      family.setTimeToLive(writeDataTTL);<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      desc.addFamily(family);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      admin.createTable(desc, splits);<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    }<a name="line.955"></a>
-<span class="sourceLineNo">956</span>  }<a name="line.956"></a>
-<span class="sourceLineNo">957</span><a name="line.957"></a>
-<span class="sourceLineNo">958</span>  /**<a name="line.958"></a>
-<span class="sourceLineNo">959</span>   * Canary entry point for specified table.<a name="line.959"></a>
-<span class="sourceLineNo">960</span>   * @throws Exception<a name="line.960"></a>
-<span class="sourceLineNo">961</span>   */<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static void sniff(final Admin admin, TableName tableName)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      throws Exception {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    sniff(admin, tableName, TaskType.READ);<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>  /**<a name="line.967"></a>
-<span class="sourceLineNo">968</span>   * Canary entry point for specified table with task type(read/write)<a name="line.968"></a>
-<span class="sourceLineNo">969</span>   * @throws Exception<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   */<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  public static void sniff(final Admin admin, TableName tableName, TaskType taskType)<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      throws Exception {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    List&lt;Future&lt;Void&gt;&gt; taskFutures =<a name="line.973"></a>
-<span class="sourceLineNo">974</span>        Canary.sniff(admin, new StdOutSink(), tableName.getNameAsString(),<a name="line.974"></a>
-<span class="sourceLineNo">975</span>          new ScheduledThreadPoolExecutor(1), taskType);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    for (Future&lt;Void&gt; future : taskFutures) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      future.get();<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><a name="line.980"></a>
-<span class="sourceLineNo">981</span>  /**<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   * Canary entry point for specified table.<a name="line.982"></a>
-<span class="sourceLineNo">983</span>   * @throws Exception<a name="line.983"></a>
-<span class="sourceLineNo">984</span>   */<a name="line.984"></a>
-<span class="sourceLineNo">985</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      ExecutorService executor, TaskType taskType) throws Exception {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    if (LOG.isDebugEnabled()) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        tableName));<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        executor, taskType);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    } else {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  /*<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>   * Loops over regions that owns this table, and output some information abouts the state.<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType) throws Exception {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span><a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    if (LOG.isDebugEnabled()) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>    Table table = null;<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    try {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    } catch (TableNotFoundException e) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      return new ArrayList&lt;Future&lt;Void&gt;&gt;();<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;RegionTask&gt;();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    try {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      for (HRegionInfo region : admin.getTableRegions(tableDesc.getTableName())) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        tasks.add(new RegionTask(admin.getConnection(), region, sink, taskType));<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    } finally {<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      table.close();<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    return executor.invokeAll(tasks);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>  // a monitor for regionserver mode<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  private static class RegionServerMonitor extends Monitor {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    private boolean allRegions;<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    public RegionServerMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        ExtendedSink sink, ExecutorService executor, boolean allRegions,<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        boolean treatFailureAsError) {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      this.allRegions = allRegions;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span><a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    private ExtendedSink getSink() {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      return (ExtendedSink) this.sink;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span><a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    @Override<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    public void run() {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      if (this.initAdmin() &amp;&amp; this.checkNoTableNames()) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = this.filterRegionServerByName();<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        this.initialized = true;<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>        this.monitorRegionServers(rsAndRMap);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      this.done = true;<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>    private boolean checkNoTableNames() {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      List&lt;String&gt; foundTableNames = new ArrayList&lt;String&gt;();<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>      TableName[] tableNames = null;<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      if (LOG.isDebugEnabled()) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      try {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>        tableNames = this.admin.listTableNames();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      } catch (IOException e) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        LOG.error("Get listTableNames failed", e);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        return false;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      if (this.targets == null || this.targets.length == 0) return true;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      for (String target : this.targets) {<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        for (TableName tableName : tableNames) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          if (target.equals(tableName.getNameAsString())) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>            foundTableNames.add(target);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (foundTableNames.size() &gt; 0) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        System.err.println("Cannot pass a tablename when using the -regionserver " +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>            "option, tablenames:" + foundTableNames.toString());<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        this.errorCode = USAGE_EXIT_CODE;<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      }<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      return foundTableNames.size() == 0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    }<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span><a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    private void monitorRegionServers(Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      List&lt;RegionServerTask&gt; tasks = new ArrayList&lt;RegionServerTask&gt;();<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      Map&lt;String, AtomicLong&gt; successMap = new HashMap&lt;String, AtomicLong&gt;();<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      Random rand = new Random();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        String serverName = entry.getKey();<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        AtomicLong successes = new AtomicLong(0);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        successMap.put(serverName, successes);<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        if (this.allRegions) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>          for (HRegionInfo region : entry.getValue()) {<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            tasks.add(new RegionServerTask(this.connection,<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>                serverName,<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>                region,<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>                getSink(),<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>                successes));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>          }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        } else {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>          // random select a region if flag not set<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>          HRegionInfo region = entry.getValue().get(rand.nextInt(entry.getValue().size()));<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>          tasks.add(new RegionServerTask(this.connection,<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>              serverName,<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>              region,<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>              getSink(),<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>              successes));<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>        }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      }<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>      try {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>          try {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>            future.get();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          } catch (ExecutionException e) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.error("Sniff regionserver failed!", e);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        if (this.allRegions) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>            String serverName = entry.getKey();<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            LOG.info("Successfully read " + successMap.get(serverName) + " regions out of "<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>                    + entry.getValue().size() + " on regionserver:" + serverName);<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      } catch (InterruptedException e) {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        LOG.error("Sniff regionserver interrupted!", e);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      }<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>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; filterRegionServerByName() {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; regionServerAndRegionsMap = this.getAllRegionServerByName();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      regionServerAndRegionsMap = this.doFilterRegionServerByName(regionServerAndRegionsMap);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>      return regionServerAndRegionsMap;<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; getAllRegionServerByName() {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      Table table = null;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      RegionLocator regionLocator = null;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      try {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        if (LOG.isDebugEnabled()) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          LOG.debug(String.format("reading list of tables and locations"));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        HTableDescriptor[] tableDescs = this.admin.listTables();<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        List&lt;HRegionInfo&gt; regions = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>        for (HTableDescriptor tableDesc : tableDescs) {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>          table = this.admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>          regionLocator = this.admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>          for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>            ServerName rs = location.getServerName();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>            String rsName = rs.getHostname();<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>            HRegionInfo r = location.getRegionInfo();<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>            if (rsAndRMap.containsKey(rsName)) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>              regions = rsAndRMap.get(rsName);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            } else {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>              regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>              rsAndRMap.put(rsName, regions);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>            regions.add(r);<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>          }<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>          table.close();<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span><a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      } catch (IOException e) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        String msg = "Get HTables info failed";<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        LOG.error(msg, e);<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>      } finally {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        if (table != null) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          try {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            table.close();<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          } catch (IOException e) {<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>            LOG.warn("Close table failed", e);<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>        }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>      }<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span><a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return rsAndRMap;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; doFilterRegionServerByName(<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; fullRsAndRMap) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; filteredRsAndRMap = null;<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span><a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        filteredRsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        Pattern pattern = null;<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        Matcher matcher = null;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        boolean regExpFound = false;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (String rsName : this.targets) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (this.useRegExp) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>            regExpFound = false;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>            pattern = Pattern.compile(rsName);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : fullRsAndRMap.entrySet()) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>              matcher = pattern.matcher(entry.getKey());<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>              if (matcher.matches()) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>                filteredRsAndRMap.put(entry.getKey(), entry.getValue());<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>                regExpFound = true;<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>            if (!regExpFound) {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>              LOG.info("No RegionServerInfo found, regionServerPattern:" + rsName);<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            if (fullRsAndRMap.containsKey(rsName)) {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>              filteredRsAndRMap.put(rsName, fullRsAndRMap.get(rsName));<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>            } else {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>              LOG.info("No RegionServerInfo found, regionServerName:" + rsName);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>            }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>          }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        }<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>        filteredRsAndRMap = fullRsAndRMap;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return filteredRsAndRMap;<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><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  public static void main(String[] args) throws Exception {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    final Configuration conf = HBaseConfiguration.create();<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span><a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // loading the generic options to conf<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    new GenericOptionsParser(conf, args);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    int numThreads = conf.getInt("hbase.canary.threads.num", MAX_THREADS_NUM);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    LOG.info("Number of exection threads " + numThreads);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span><a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(numThreads);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span><a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    Class&lt;? extends Sink&gt; sinkClass =<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        conf.getClass("hbase.canary.sink.class", RegionServerStdOutSink.class, Sink.class);<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>    Sink sink = ReflectionUtils.newInstance(sinkClass);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span><a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    int exitCode = ToolRunner.run(conf, new Canary(executor, sink), args);<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    executor.shutdown();<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    System.exit(exitCode);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>}<a name="line.1244"></a>
+<span class="sourceLineNo">625</span>            }<a name="line.625"></a>
+<span class="sourceLineNo">626</span>          }<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>            monitorThread.interrupt();<a name="line.629"></a>
+<span class="sourceLineNo">630</span>            return monitor.errorCode;<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        } finally {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>          if (monitor != null) monitor.close();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        }<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>        Thread.sleep(interval);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      } while (interval &gt; 0);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    } // try-with-resources close<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    if (choreService != null) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>      choreService.shutdown();<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    return monitor.errorCode;<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>  private void printUsageAndExit() {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    System.err.printf(<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        getClass().getName());<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    System.err.println(" where [opts] are:");<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.err.println("   -help          Show this help and exit.");<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    System.err.println("      which means to enable regionserver mode");<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    System.err.println("      only works in regionserver mode.");<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        " default is true");<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.665"></a>
+<span class="sourceLineNo">666</span>        + " Default is hbase:canary");<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    System.err<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    System.exit(USAGE_EXIT_CODE);<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>   * A Factory method for {@link Monitor}.<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * Can be overridden by user.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @param index a start index for monitor target<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   * @param args args passed from user<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   * @return a Monitor instance<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   */<a name="line.678"></a>
+<span class="sourceLineNo">679</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Monitor monitor = null;<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    String[] monitorTargets = null;<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>    if(index &gt;= 0) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      int length = args.length - index;<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      monitorTargets = new String[length];<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.regionServerMode) {<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      monitor =<a name="line.690"></a>
+<span class="sourceLineNo">691</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.691"></a>
+<span class="sourceLineNo">692</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.692"></a>
+<span class="sourceLineNo">693</span>              this.treatFailureAsError);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    } else {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      monitor =<a name="line.695"></a>
+<span class="sourceLineNo">696</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.696"></a>
+<span class="sourceLineNo">697</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return monitor;<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">702</span>  // a Monitor super-class can be extended by users<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    protected Connection connection;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    protected Admin admin;<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    protected String[] targets;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    protected boolean useRegExp;<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    protected boolean treatFailureAsError;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    protected boolean initialized = false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>    protected boolean done = false;<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    protected int errorCode = 0;<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    protected Sink sink;<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    protected ExecutorService executor;<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>    public boolean isDone() {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      return done;<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>    public boolean hasError() {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      return errorCode != 0;<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">724</span><a name="line.724"></a>
+<span class="sourceLineNo">725</span>    public boolean finalCheckForErrors() {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      if (errorCode != 0) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        return true;<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      return treatFailureAsError &amp;&amp;<a name="line.729"></a>
+<span class="sourceLineNo">730</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>    @Override<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    public void close() throws IOException {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (this.admin != null) this.admin.close();<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.738"></a>
+<span class="sourceLineNo">739</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.740"></a>
+<span class="sourceLineNo">741</span><a name="line.741"></a>
+<span class="sourceLineNo">742</span>      this.connection = connection;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      this.targets = monitorTargets;<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      this.useRegExp = useRegExp;<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      this.sink = sink;<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      this.executor = executor;<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>    @Override<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    public abstract void run();<a name="line.751"></a>
+<span class="sourceLineNo">752</span><a name="line.752"></a>
+<span class="sourceLineNo">753</span>    protected boolean initAdmin() {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>      if (null == this.admin) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        try {<a name="line.755"></a>
+<span class="sourceLineNo">756</span>          this.admin = this.connection.getAdmin();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        } catch (Exception e) {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.758"></a>
+<span class="sourceLineNo">759</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
+<span class="sourceLineNo">761</span>      } else if (admin.isAborted()) {<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        LOG.error("HBaseAdmin aborted");<a name="line.762"></a>
+<span class="sourceLineNo">763</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      return !this.hasError();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
+<span class="sourceLineNo">767</span>  }<a name="line.767"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>  // a monitor for region mode<a name="line.769"></a>
+<span class="sourceLineNo">770</span>  private static class RegionMonitor extends Monitor {<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    // 10 minutes<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    // 1 days<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    private long lastCheckTime = -1;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    private boolean writeSniffing;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    private TableName writeTableName;<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private int writeDataTTL;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    private float regionsLowerLimit;<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    private float regionsUpperLimit;<a name="line.781"></a>
+<span class="sourceLineNo">782</span>    private int checkPeriod;<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.784"></a>
+<span class="sourceLineNo">785</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.785"></a>
+<span class="sourceLineNo">786</span>        boolean treatFailureAsError) {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      Configuration conf = connection.getConfiguration();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      this.writeSniffing = writeSniffing;<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      this.writeTableName = writeTableName;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      this.writeDataTTL =<a name="line.791"></a>
+<span class="sourceLineNo">792</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.792"></a>
+<span class="sourceLineNo">793</span>      this.regionsLowerLimit =<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      this.regionsUpperLimit =<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.796"></a>
+<span class="sourceLineNo">797</span>      this.checkPeriod =<a name="line.797"></a>
+<span class="sourceLineNo">798</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.798"></a>
+<span class="sourceLineNo">799</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    @Override<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    public void run() {<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      if (this.initAdmin()) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>        try {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>            this.initialized = true;<a name="line.809"></a>
+<span class="sourceLineNo">810</span>            for (String table : tables) {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.811"></a>
+<span class="sourceLineNo">812</span>            }<a name="line.812"></a>
+<span class="sourceLineNo">813</span>          } else {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.814"></a>
+<span class="sourceLineNo">815</span>          }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>          if (writeSniffing) {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>              try {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>                checkWriteTableDistribution();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>              } catch (IOException e) {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>              }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.824"></a>
+<span class="sourceLineNo">825</span>            }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>            // sniff canary table with write operation<a name="line.826"></a>
+<span class="sourceLineNo">827</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.827"></a>
+<span class="sourceLineNo">828</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.828"></a>
+<span class="sourceLineNo">829</span>          }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>            try {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>              future.get();<a name="line.833"></a>
+<span class="sourceLineNo">834</span>            } catch (ExecutionException e) {<a name="line.834"></a>
+<span class="sourceLineNo">835</span>              LOG.error("Sniff region failed!", e);<a name="line.835"></a>
+<span class="sourceLineNo">836</span>            }<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        } catch (Exception e) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>          LOG.error("Run regionMonitor failed", e);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          this.errorCode = ERROR_EXIT_CODE;<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>      this.done = true;<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>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>      String[] returnTables = null;<a name="line.847"></a>
+<span class="sourceLineNo">848</span><a name="line.848"></a>
+<span class="sourceLineNo">849</span>      if (this.useRegExp) {<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        Pattern pattern = null;<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        HTableDescriptor[] tds = null;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        try {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          if (LOG.isDebugEnabled()) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>            LOG.debug(String.format("reading list of tables"));<a name="line.855"></a>
+<span class="sourceLineNo">856</span>          }<a name="line.856"></a>
+<span class="sourceLineNo">857</span>          tds = this.admin.listTables(pattern);<a name="line.857"></a>
+<span class="sourceLineNo">858</span>          if (tds == null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            tds = new HTableDescriptor[0];<a name="line.859"></a>
+<span class="sourceLineNo">860</span>          }<a name="line.860"></a>
+<span class="sourceLineNo">861</span>          for (String monitorTarget : monitorTargets) {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>            pattern = Pattern.compile(monitorTarget);<a name="line.862"></a>
+<span class="sourceLineNo">863</span>            for (HTableDescriptor td : tds) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>                tmpTables.add(td.getNameAsString());<a name="line.865"></a>
+<span class="sourceLineNo">866</span>              }<a name="line.866"></a>
+<span class="sourceLineNo">867</span>            }<a name="line.867"></a>
+<span class="sourceLineNo">868</span>          }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        } catch (IOException e) {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>          LOG.error("Communicate with admin failed", e);<a name="line.870"></a>
+<span class="sourceLineNo">871</span>          throw e;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>        if (tmpTables.size() &gt; 0) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>        } else {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          LOG.error(msg);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          throw new TableNotFoundException(msg);<a name="line.880"></a>
+<span class="sourceLineNo">881</span>        }<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      } else {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>       

<TRUNCATED>

[18/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
index fbdde18..1d64963 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
@@ -2959,7 +2959,7 @@
 <span class="sourceLineNo">2951</span>    Set&lt;byte[]&gt; deletesCfSet = null;<a name="line.2951"></a>
 <span class="sourceLineNo">2952</span>    long currentNonceGroup = HConstants.NO_NONCE;<a name="line.2952"></a>
 <span class="sourceLineNo">2953</span>    long currentNonce = HConstants.NO_NONCE;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    WALEdit walEdit = new WALEdit(replay);<a name="line.2954"></a>
+<span class="sourceLineNo">2954</span>    WALEdit walEdit = null;<a name="line.2954"></a>
 <span class="sourceLineNo">2955</span>    boolean locked = false;<a name="line.2955"></a>
 <span class="sourceLineNo">2956</span>    // reference family maps directly so coprocessors can mutate them if desired<a name="line.2956"></a>
 <span class="sourceLineNo">2957</span>    Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps = new Map[batchOp.operations.length];<a name="line.2957"></a>
@@ -2970,4878 +2970,4890 @@
 <span class="sourceLineNo">2962</span>    int noOfPuts = 0;<a name="line.2962"></a>
 <span class="sourceLineNo">2963</span>    int noOfDeletes = 0;<a name="line.2963"></a>
 <span class="sourceLineNo">2964</span>    WriteEntry writeEntry = null;<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    try {<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>      int numReadyToWrite = 0;<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>          lastIndexExclusive++;<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>          continue;<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>        }<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>        RowLock rowLock = null;<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>        try {<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>        } catch (IOException ioe) {<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span>        }<a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>        if (rowLock == null) {<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>          // We failed to grab another lock<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>          break; // Stop acquiring more rows for this batch<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>        } else {<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>          acquiredRowLocks.add(rowLock);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span>        }<a name="line.2989"></a>
-<span class="sourceLineNo">2990</span><a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>        lastIndexExclusive++;<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>        numReadyToWrite++;<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span><a name="line.2993"></a>
-<span class="sourceLineNo">2994</span>        if (mutation instanceof Put) {<a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>          // If Column Families stay consistent through out all of the<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>          // individual puts then metrics can be reported as a multiput across<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>          // column families in the first put.<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>          if (putsCfSet == null) {<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>          } else {<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span>          }<a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>        } else {<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>          if (deletesCfSet == null) {<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>          } else {<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>          }<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span>        }<a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>      }<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span><a name="line.3013"></a>
-<span class="sourceLineNo">3014</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3014"></a>
-<span class="sourceLineNo">3015</span><a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3020"></a>
-<span class="sourceLineNo">3021</span><a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>        return 0L;<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>      }<a name="line.3025"></a>
+<span class="sourceLineNo">2965</span>    int cellCount = 0;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    try {<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>      int numReadyToWrite = 0;<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>          lastIndexExclusive++;<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span>          continue;<a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>        }<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>        RowLock rowLock = null;<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span>        try {<a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>        } catch (IOException ioe) {<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>        }<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>        if (rowLock == null) {<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>          // We failed to grab another lock<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span>          break; // Stop acquiring more rows for this batch<a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>        } else {<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>          acquiredRowLocks.add(rowLock);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>        }<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span><a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>        lastIndexExclusive++;<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span>        numReadyToWrite++;<a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>        if (replay) {<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>          for (List&lt;Cell&gt; cells : mutation.getFamilyCellMap().values()) {<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>            cellCount += cells.size();<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>          }<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>        }<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span>        if (mutation instanceof Put) {<a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>          // If Column Families stay consistent through out all of the<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>          // individual puts then metrics can be reported as a multiput across<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>          // column families in the first put.<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>          if (putsCfSet == null) {<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>          } else {<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>          }<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>        } else {<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>          if (deletesCfSet == null) {<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>          } else {<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>          }<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>        }<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>      }<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span><a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span><a name="line.3020"></a>
+<span class="sourceLineNo">3021</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3025"></a>
 <span class="sourceLineNo">3026</span><a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span>        // skip invalid<a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>          // lastIndexExclusive was incremented above.<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span>          continue;<a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>        }<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span><a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>        if (mutation instanceof Put) {<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>          noOfPuts++;<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>        } else {<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>          noOfDeletes++;<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>        }<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span>      }<a name="line.3044"></a>
-<span class="sourceLineNo">3045</span><a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>      locked = true;<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span><a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>      // calling the pre CP hook for batch mutation<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>          return 0L;<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>        }<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>      }<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span><a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>      // STEP 3. Build WAL edit<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>          continue;<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>        }<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>        Mutation m = batchOp.getMutation(i);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>          durability = tmpDur;<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>        }<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>          continue;<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span>        }<a name="line.3075"></a>
-<span class="sourceLineNo">3076</span><a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>        long nonce = batchOp.getNonce(i);<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>          // Write what we have so far for nonces out to WAL<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>          walEdit = new WALEdit(replay);<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span>          currentNonceGroup = nonceGroup;<a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>          currentNonce = nonce;<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>        }<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span><a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>        // Add WAL edits by CP<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>        if (fromCP != null) {<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span>            walEdit.add(cell);<a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>          }<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>        }<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span>      }<a name="line.3098"></a>
-<span class="sourceLineNo">3099</span><a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>      WALKey walKey = null;<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>      if (replay) {<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>        // use wal key from the original<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3107"></a>
-<span class="sourceLineNo">3108</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>      }<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>      if (!walEdit.isEmpty()) {<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>        if (!replay) {<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>        }<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>        try {<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span>          long txid =<a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>          if (txid != 0) sync(txid, durability);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span>          writeEntry = walKey.getWriteEntry();<a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>        } catch (IOException ioe) {<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>          throw ioe;<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>        }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>      }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span>      if (walKey == null) {<a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>        writeEntry = mvcc.begin();<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>      }<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span><a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>      // STEP 5. Write back to memstore<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>      long addedSize = 0;<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>          continue;<a name="line.3139"></a>
+<span class="sourceLineNo">3027</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>        return 0L;<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span>      }<a name="line.3030"></a>
+<span class="sourceLineNo">3031</span><a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>        // skip invalid<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>          // lastIndexExclusive was incremented above.<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>          continue;<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span>        }<a name="line.3038"></a>
+<span class="sourceLineNo">3039</span><a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>        if (mutation instanceof Put) {<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>          noOfPuts++;<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>        } else {<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>          noOfDeletes++;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>        }<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span>        if (fromCP != null) {<a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>          cellCount += fromCP.size();<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>        }<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>        for (List&lt;Cell&gt; cells : familyMaps[i].values()) {<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span>          cellCount += cells.size();<a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>        }<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>      }<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>      walEdit = new WALEdit(cellCount, replay);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>      locked = true;<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span><a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>      // calling the pre CP hook for batch mutation<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>          return 0L;<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>        }<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>      }<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>      // STEP 3. Build WAL edit<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span>          continue;<a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>        }<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span><a name="line.3078"></a>
+<span class="sourceLineNo">3079</span>        Mutation m = batchOp.getMutation(i);<a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>          durability = tmpDur;<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>        }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>          continue;<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>        }<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span><a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>        long nonce = batchOp.getNonce(i);<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>          // Write what we have so far for nonces out to WAL<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>          walEdit = new WALEdit(cellCount, replay);<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>          currentNonceGroup = nonceGroup;<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>          currentNonce = nonce;<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>        }<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span><a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>        // Add WAL edits by CP<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span>        if (fromCP != null) {<a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>            walEdit.add(cell);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>          }<a name="line.3107"></a>
+<span class="sourceLineNo">3108</span>        }<a name="line.3108"></a>
+<span class="sourceLineNo">3109</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>      }<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span><a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>      WALKey walKey = null;<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>      if (replay) {<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>        // use wal key from the original<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>      }<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>      if (!walEdit.isEmpty()) {<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span>        if (!replay) {<a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>        }<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>        try {<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>          long txid =<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>          if (txid != 0) sync(txid, durability);<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>          writeEntry = walKey.getWriteEntry();<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>        } catch (IOException ioe) {<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>          throw ioe;<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span>        }<a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span>      }<a name="line.3143"></a>
-<span class="sourceLineNo">3144</span><a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>      // STEP 6. Complete mvcc.<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>      if (replay) {<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>        mvcc.completeAndWait(writeEntry);<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>        writeEntry = null;<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span>      }<a name="line.3151"></a>
-<span class="sourceLineNo">3152</span><a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>      // STEP 7. Release row locks, etc.<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>      if (locked) {<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span>        this.updatesLock.readLock().unlock();<a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>        locked = false;<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>      }<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>      // calling the post CP hook for batch mutation<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>      }<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span><a name="line.3167"></a>
-<span class="sourceLineNo">3168</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>        }<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>      }<a name="line.3172"></a>
-<span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>          // only for successful puts<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span>              != OperationStatusCode.SUCCESS) {<a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>            continue;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>          }<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>          Mutation m = batchOp.getMutation(i);<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>          if (m instanceof Put) {<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>          } else {<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>          }<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>        }<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>      }<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span><a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>      success = true;<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span>      return addedSize;<a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    } finally {<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>      if (locked) {<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span>        this.updatesLock.readLock().unlock();<a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>      }<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span><a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>      // See if the column families were consistent through the whole thing.<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>      // null will be treated as unknown.<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span><a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>      if (noOfPuts &gt; 0) {<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>        // There were some Puts in the batch.<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>        if (this.metricsRegion != null) {<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span>          this.metricsRegion.updatePut();<a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>        }<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>      }<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>      if (noOfDeletes &gt; 0) {<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>        // There were some Deletes in the batch.<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>        if (this.metricsRegion != null) {<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span>          this.metricsRegion.updateDelete();<a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>        }<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>      }<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>      if (!success) {<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>          }<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>        }<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>      }<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>        // call the coprocessor hook to do any finalization steps<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>        // after the put is done<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>                lastIndexExclusive);<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>      }<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span><a name="line.3236"></a>
-<span class="sourceLineNo">3237</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    }<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>  }<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>  throws IOException {<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    if (walEdit.isEmpty()) return;<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>  }<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span><a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>  throws IOException {<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    boolean skip = false;<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    // Skip anything that "ran" already<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>      return true;<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span>    }<a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span>    // store the family map reference to allow for mutations<a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    try {<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>      if (mutation instanceof Put) {<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>        // Check the families in the put. If bad, skip this one.<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>        if (batchOp.isInReplay()) {<a name="line.3271"></a>
-<span class="sourceLineNo">3272</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>        } else {<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>          checkFamilies(familyMap.keySet());<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>        }<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>      } else {<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span>        prepareDelete((Delete)mutation);<a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>      }<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>      skip = true;<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>      skip = true;<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    } catch (WrongRegionException we) {<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>      skip = true;<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    }<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    return skip;<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>  }<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>  /**<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>   * During replay, there could exist column families which are removed between region server<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>   * failure and replay<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>   */<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>        if (nonExistentList == null) {<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span>        }<a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>        nonExistentList.add(family);<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>      }<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>    }<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>    if (nonExistentList != null) {<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>      for (byte[] family : nonExistentList) {<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>        // Perhaps schema was changed between crash and replay<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>        familyMap.remove(family);<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>      }<a name="line.3319"></a>
-<span class="sourceLineNo">3320</span>    }<a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>  }<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span><a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>  /**<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span>   * Returns effective durability from the passed durability and<a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>   * the table descriptor.<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span>   */<a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>  }<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span><a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>  @Override<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      boolean writeToWAL)<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>  throws IOException{<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    checkMutationType(mutation, row);<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>      mutation, writeToWAL);<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>  }<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span><a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>  @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3343"></a>
-<span class="sourceLineNo">3344</span>      boolean writeToWAL)<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>  throws IOException {<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, rm, null,<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>      writeToWAL);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>  }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span><a name="line.3349"></a>
-<span class="sourceLineNo">3350</span>  /**<a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>   * checkAndMutate and checkAndRowMutate are 90% the same. Rather than copy/paste, below has<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>   * switches in the few places where there is deviation.<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span>   */<a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>  private boolean doCheckAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rowMutations,<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>      Mutation mutation, boolean writeToWAL)<a name="line.3356"></a>
+<span class="sourceLineNo">3141</span>      }<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>      if (walKey == null) {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>        writeEntry = mvcc.begin();<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>      }<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span><a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>      // STEP 5. Write back to memstore<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>      long addedSize = 0;<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>          continue;<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>        }<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>      }<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span><a name="line.3156"></a>
+<span class="sourceLineNo">3157</span>      // STEP 6. Complete mvcc.<a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>      if (replay) {<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span>        mvcc.completeAndWait(writeEntry);<a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>        writeEntry = null;<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>      }<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span><a name="line.3164"></a>
+<span class="sourceLineNo">3165</span>      // STEP 7. Release row locks, etc.<a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>      if (locked) {<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>        this.updatesLock.readLock().unlock();<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>        locked = false;<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span>      }<a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span><a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>      // calling the post CP hook for batch mutation<a name="line.3172"></a>
+<span class="sourceLineNo">3173</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3173"></a>
+<span class="sourceLineNo">3174</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span>      }<a name="line.3178"></a>
+<span class="sourceLineNo">3179</span><a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span>        }<a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>      }<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span><a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span>          // only for successful puts<a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>              != OperationStatusCode.SUCCESS) {<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>            continue;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>          }<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span>          Mutation m = batchOp.getMutation(i);<a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>          if (m instanceof Put) {<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>          } else {<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>          }<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>        }<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>      }<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>      success = true;<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>      return addedSize;<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    } finally {<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>      if (locked) {<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>        this.updatesLock.readLock().unlock();<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>      }<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span><a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>      // See if the column families were consistent through the whole thing.<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>      // null will be treated as unknown.<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span><a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>      if (noOfPuts &gt; 0) {<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span>        // There were some Puts in the batch.<a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>        if (this.metricsRegion != null) {<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>          this.metricsRegion.updatePut();<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>        }<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>      }<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>      if (noOfDeletes &gt; 0) {<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span>        // There were some Deletes in the batch.<a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>        if (this.metricsRegion != null) {<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>          this.metricsRegion.updateDelete();<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>        }<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>      }<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span>      if (!success) {<a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>          }<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>        }<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>      }<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>        // call the coprocessor hook to do any finalization steps<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span>        // after the put is done<a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>                lastIndexExclusive);<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span>      }<a name="line.3247"></a>
+<span class="sourceLineNo">3248</span><a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span>    }<a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>  }<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span><a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  throws IOException {<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span>    if (walEdit.isEmpty()) return;<a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  }<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span><a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>  throws IOException {<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    boolean skip = false;<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    // Skip anything that "ran" already<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3271"></a>
+<span class="sourceLineNo">3272</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3272"></a>
+<span class="sourceLineNo">3273</span>      return true;<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    }<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span>    // store the family map reference to allow for mutations<a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span><a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    try {<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>      if (mutation instanceof Put) {<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span>        // Check the families in the put. If bad, skip this one.<a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>        if (batchOp.isInReplay()) {<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>        } else {<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>          checkFamilies(familyMap.keySet());<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>        }<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>      } else {<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>        prepareDelete((Delete)mutation);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>      }<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span>      skip = true;<a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>      skip = true;<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    } catch (WrongRegionException we) {<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>      skip = true;<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    }<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span>    return skip;<a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>  }<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span><a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>  /**<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>   * During replay, there could exist column families which are removed between region server<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>   * failure and replay<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3319"></a>
+<span class="sourceLineNo">3320</span>        if (nonExistentList == null) {<a name="line.3320"></a>
+<span class="sourceLineNo">3321</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>        }<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>        nonExistentList.add(family);<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>      }<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>    }<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>    if (nonExistentList != null) {<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>      for (byte[] family : nonExistentList) {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>        // Perhaps schema was changed between crash and replay<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span>        familyMap.remove(family);<a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>      }<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    }<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>  }<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>  /**<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span>   * Returns effective durability from the passed durability and<a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>   * the table descriptor.<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>   */<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>  }<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span><a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>  @Override<a name="line.3343"></a>
+<span class="sourceLineNo">3344</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3344"></a>
+<span class="sourceLineNo">3345</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>      boolean writeToWAL)<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span>  throws IOException{<a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    checkMutationType(mutation, row);<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>      mutation, writeToWAL);<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>  }<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span><a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>  @Override<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      boolean writeToWAL)<a name="line.3356"></a>
 <span class="sourceLineNo">3357</span>  throws IOException {<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // Could do the below checks but seems wacky with two callers only. Just comment out for now.<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // One caller passes a Mutation, the other passes RowMutation. Presume all good so we don't<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // need these commented out checks.<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // if (rowMutations == null &amp;&amp; mutation == null) throw new DoNotRetryIOException("Both null");<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // if (rowMutations != null &amp;&amp; mutation != null) throw new DoNotRetryIOException("Both set");<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    checkReadOnly();<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // TODO, add check for value length also move this check to the client<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span>    checkResources();<a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    startRegionOperation();<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    try {<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>      Get get = new Get(row);<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>      checkFamily(family);<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>      get.addColumn(family, qualifier);<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>      // Lock row - note that doBatchMutate will relock this row if called<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>      RowLock rowLock = getRowLock(get.getRow());<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>      try {<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>        if (mutation != null &amp;&amp; this.getCoprocessorHost() != null) {<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>          // Call coprocessor.<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>          Boolean processed = null;<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>          if (mutation instanceof Put) {<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>            processed = this.getCoprocessorHost().preCheckAndPutAfterRowLock(row, family,<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>                qualifier, compareOp, comparator, (Put)mutation);<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>          } else if (mutation instanceof Delete) {<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>            processed = this.getCoprocessorHost().preCheckAndDeleteAfterRowLock(row, family,<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span>                qualifier, compareOp, comparator, (Delete)mutation);<a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>          }<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>          if (processed != null) {<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>            return processed;<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>          }<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>        }<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>        // NOTE: We used to wait here until mvcc caught up:  mvcc.await();<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        // Supposition is that now all changes are done under row locks, then when we go to read,<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>        // we'll get the latest on this row.<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        List&lt;Cell&gt; result = get(get, false);<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>        boolean valueIsNull = comparator.getValue() == null || comparator.getValue().length == 0;<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        boolean matches = false;<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>        long cellTs = 0;<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        if (result.size() == 0 &amp;&amp; valueIsNull) {<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>          matches = true;<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>        } else if (result.size() &gt; 0 &amp;&amp; result.get(0).getValueLength() == 0 &amp;&amp; valueIsNull) {<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>          matches = true;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>          cellTs = result.get(0).getTimestamp();<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        } else if (result.size() == 1 &amp;&amp; !valueIsNull) {<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>          Cell kv = result.get(0);<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>          cellTs = kv.getTimestamp();<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>          int compareResult = CellComparator.compareValue(kv, comparator);<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span>          matches = matches(compareOp, compareResult);<a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>        }<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>        // If matches put the new put or delete the new delete<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>        if (matches) {<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>          // We have acquired the row lock already. If the syst

<TRUNCATED>

[02/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.html
index d3abe39..c51826f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.html
@@ -615,9 +615,9 @@
 <span class="sourceLineNo">607</span>            if (this.failOnError &amp;&amp; monitor.hasError()) {<a name="line.607"></a>
 <span class="sourceLineNo">608</span>              monitorThread.interrupt();<a name="line.608"></a>
 <span class="sourceLineNo">609</span>              if (monitor.initialized) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>                System.exit(monitor.errorCode);<a name="line.610"></a>
+<span class="sourceLineNo">610</span>                return monitor.errorCode;<a name="line.610"></a>
 <span class="sourceLineNo">611</span>              } else {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.612"></a>
+<span class="sourceLineNo">612</span>                return INIT_ERROR_EXIT_CODE;<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>            currentTimeLength = System.currentTimeMillis() - startTime;<a name="line.615"></a>
@@ -626,630 +626,629 @@
 <span class="sourceLineNo">618</span>                  + ") after timeout limit:" + this.timeout<a name="line.618"></a>
 <span class="sourceLineNo">619</span>                  + " will be killed itself !!");<a name="line.619"></a>
 <span class="sourceLineNo">620</span>              if (monitor.initialized) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>                System.exit(TIMEOUT_ERROR_EXIT_CODE);<a name="line.621"></a>
+<span class="sourceLineNo">621</span>                return TIMEOUT_ERROR_EXIT_CODE;<a name="line.621"></a>
 <span class="sourceLineNo">622</span>              } else {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.623"></a>
+<span class="sourceLineNo">623</span>                return INIT_ERROR_EXIT_CODE;<a name="line.623"></a>
 <span class="sourceLineNo">624</span>              }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>              break;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>            monitorThread.interrupt();<a name="line.630"></a>
-<span class="sourceLineNo">631</span>            System.exit(monitor.errorCode);<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } finally {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          if (monitor != null) monitor.close();<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>        Thread.sleep(interval);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      } while (interval &gt; 0);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    } // try-with-resources close<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    if (choreService != null) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      choreService.shutdown();<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    return(monitor.errorCode);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>  }<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private void printUsageAndExit() {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    System.err.printf(<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        getClass().getName());<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    System.err.println(" where [opts] are:");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    System.err.println("   -help          Show this help and exit.");<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    System.err.println("      which means to enable regionserver mode");<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    System.err.println("      only works in regionserver mode.");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        " default is true");<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        + " Default is hbase:canary");<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    System.err<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * A Factory method for {@link Monitor}.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   * Can be overridden by user.<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param index a start index for monitor target<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param args args passed from user<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a Monitor instance<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   */<a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    Monitor monitor = null;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    String[] monitorTargets = null;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    if(index &gt;= 0) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int length = args.length - index;<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      monitorTargets = new String[length];<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>    if (this.regionServerMode) {<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      monitor =<a name="line.691"></a>
-<span class="sourceLineNo">692</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.693"></a>
-<span class="sourceLineNo">694</span>              this.treatFailureAsError);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    } else {<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      monitor =<a name="line.696"></a>
-<span class="sourceLineNo">697</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    return monitor;<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>  // a Monitor super-class can be extended by users<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>    protected Connection connection;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    protected Admin admin;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    protected String[] targets;<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    protected boolean useRegExp;<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    protected boolean treatFailureAsError;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    protected boolean initialized = false;<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    protected boolean done = false;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected int errorCode = 0;<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    protected Sink sink;<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    protected ExecutorService executor;<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>    public boolean isDone() {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return done;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    public boolean hasError() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return errorCode != 0;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span><a name="line.725"></a>
-<span class="sourceLineNo">726</span>    public boolean finalCheckForErrors() {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      if (errorCode != 0) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>        return true;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      return treatFailureAsError &amp;&amp;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>    @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    public void close() throws IOException {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (this.admin != null) this.admin.close();<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span><a name="line.738"></a>
-<span class="sourceLineNo">739</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      this.connection = connection;<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      this.targets = monitorTargets;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      this.useRegExp = useRegExp;<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.sink = sink;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      this.executor = executor;<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>    @Override<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    public abstract void run();<a name="line.752"></a>
-<span class="sourceLineNo">753</span><a name="line.753"></a>
-<span class="sourceLineNo">754</span>    protected boolean initAdmin() {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      if (null == this.admin) {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        try {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>          this.admin = this.connection.getAdmin();<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        } catch (Exception e) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>        }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      } else if (admin.isAborted()) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>        LOG.error("HBaseAdmin aborted");<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      }<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return !this.hasError();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
-<span class="sourceLineNo">769</span><a name="line.769"></a>
-<span class="sourceLineNo">770</span>  // a monitor for region mode<a name="line.770"></a>
-<span class="sourceLineNo">771</span>  private static class RegionMonitor extends Monitor {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    // 10 minutes<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    // 1 days<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>    private long lastCheckTime = -1;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private boolean writeSniffing;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    private TableName writeTableName;<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    private int writeDataTTL;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private float regionsLowerLimit;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    private float regionsUpperLimit;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    private int checkPeriod;<a name="line.783"></a>
-<span class="sourceLineNo">784</span><a name="line.784"></a>
-<span class="sourceLineNo">785</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        boolean treatFailureAsError) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      Configuration conf = connection.getConfiguration();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      this.writeSniffing = writeSniffing;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      this.writeTableName = writeTableName;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      this.writeDataTTL =<a name="line.792"></a>
-<span class="sourceLineNo">793</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      this.regionsLowerLimit =<a name="line.794"></a>
-<span class="sourceLineNo">795</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      this.regionsUpperLimit =<a name="line.796"></a>
-<span class="sourceLineNo">797</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      this.checkPeriod =<a name="line.798"></a>
-<span class="sourceLineNo">799</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.799"></a>
-<span class="sourceLineNo">800</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>    @Override<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    public void run() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      if (this.initAdmin()) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        try {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.809"></a>
-<span class="sourceLineNo">810</span>            this.initialized = true;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>            for (String table : tables) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.812"></a>
-<span class="sourceLineNo">813</span>            }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          } else {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>          }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>          if (writeSniffing) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>              try {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                checkWriteTableDistribution();<a name="line.821"></a>
-<span class="sourceLineNo">822</span>              } catch (IOException e) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.823"></a>
-<span class="sourceLineNo">824</span>              }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>            }<a name="line.826"></a>
-<span class="sourceLineNo">827</span>            // sniff canary table with write operation<a name="line.827"></a>
-<span class="sourceLineNo">828</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.828"></a>
-<span class="sourceLineNo">829</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>          }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            try {<a name="line.833"></a>
-<span class="sourceLineNo">834</span>              future.get();<a name="line.834"></a>
-<span class="sourceLineNo">835</span>            } catch (ExecutionException e) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>              LOG.error("Sniff region failed!", e);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>            }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          }<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        } catch (Exception e) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>          LOG.error("Run regionMonitor failed", e);<a name="line.840"></a>
-<span class="sourceLineNo">841</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      this.done = true;<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      String[] returnTables = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span><a name="line.849"></a>
-<span class="sourceLineNo">850</span>      if (this.useRegExp) {<a name="line.850"></a>
-<span class="sourceLineNo">851</span>        Pattern pattern = null;<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        HTableDescriptor[] tds = null;<a name="line.852"></a>
-<span class="sourceLineNo">853</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        try {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>          if (LOG.isDebugEnabled()) {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>            LOG.debug(String.format("reading list of tables"));<a name="line.856"></a>
-<span class="sourceLineNo">857</span>          }<a name="line.857"></a>
-<span class="sourceLineNo">858</span>          tds = this.admin.listTables(pattern);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>          if (tds == null) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>            tds = new HTableDescriptor[0];<a name="line.860"></a>
-<span class="sourceLineNo">861</span>          }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>          for (String monitorTarget : monitorTargets) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>            pattern = Pattern.compile(monitorTarget);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>            for (HTableDescriptor td : tds) {<a name="line.864"></a>
-<span class="sourceLineNo">865</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>                tmpTables.add(td.getNameAsString());<a name="line.866"></a>
-<span class="sourceLineNo">867</span>              }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>            }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>          }<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        } catch (IOException e) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          LOG.error("Communicate with admin failed", e);<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          throw e;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>        if (tmpTables.size() &gt; 0) {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>        } else {<a name="line.877"></a>
-<span class="sourceLineNo">878</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          LOG.error(msg);<a name="line.879"></a>
-<span class="sourceLineNo">880</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>          throw new TableNotFoundException(msg);<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        }<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      } else {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>        returnTables = monitorTargets;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>      return returnTables;<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    }<a name="line.888"></a>
-<span class="sourceLineNo">889</span><a name="line.889"></a>
-<span class="sourceLineNo">890</span>    /*<a name="line.890"></a>
-<span class="sourceLineNo">891</span>     * canary entry point to monitor all the tables.<a name="line.891"></a>
-<span class="sourceLineNo">892</span>     */<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType) throws Exception {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      if (LOG.isDebugEnabled()) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        LOG.debug(String.format("reading list of tables"));<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.899"></a>
-<span class="sourceLineNo">900</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        }<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      return taskFutures;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      if (!admin.tableExists(writeTableName)) {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>        int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.909"></a>
-<span class="sourceLineNo">910</span>        if (numberOfServers == 0) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>          throw new IllegalStateException("No live regionservers");<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        }<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        createWriteTable(numberOfServers);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        admin.enableTable(writeTableName);<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      }<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>      int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      List&lt;Pair&lt;HRegionInfo, ServerName&gt;&gt; pairs =<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      int numberOfRegions = pairs.size();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        admin.disableTable(writeTableName);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        admin.deleteTable(writeTableName);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        createWriteTable(numberOfServers);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;ServerName&gt;();<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      for (Pair&lt;HRegionInfo, ServerName&gt; pair : pairs) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        serverSet.add(pair.getSecond());<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      int numberOfCoveredServers = serverSet.size();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        admin.balancer();<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    }<a name="line.938"></a>
-<span class="sourceLineNo">939</span><a name="line.939"></a>
-<span class="sourceLineNo">940</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          + " and you can change it by config: "<a name="line.945"></a>
-<span class="sourceLineNo">946</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      family.setMaxVersions(1);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      family.setTimeToLive(writeDataTTL);<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      desc.addFamily(family);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      admin.createTable(desc, splits);<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    }<a name="line.955"></a>
-<span class="sourceLineNo">956</span>  }<a name="line.956"></a>
-<span class="sourceLineNo">957</span><a name="line.957"></a>
-<span class="sourceLineNo">958</span>  /**<a name="line.958"></a>
-<span class="sourceLineNo">959</span>   * Canary entry point for specified table.<a name="line.959"></a>
-<span class="sourceLineNo">960</span>   * @throws Exception<a name="line.960"></a>
-<span class="sourceLineNo">961</span>   */<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static void sniff(final Admin admin, TableName tableName)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      throws Exception {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    sniff(admin, tableName, TaskType.READ);<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>  /**<a name="line.967"></a>
-<span class="sourceLineNo">968</span>   * Canary entry point for specified table with task type(read/write)<a name="line.968"></a>
-<span class="sourceLineNo">969</span>   * @throws Exception<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   */<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  public static void sniff(final Admin admin, TableName tableName, TaskType taskType)<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      throws Exception {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    List&lt;Future&lt;Void&gt;&gt; taskFutures =<a name="line.973"></a>
-<span class="sourceLineNo">974</span>        Canary.sniff(admin, new StdOutSink(), tableName.getNameAsString(),<a name="line.974"></a>
-<span class="sourceLineNo">975</span>          new ScheduledThreadPoolExecutor(1), taskType);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    for (Future&lt;Void&gt; future : taskFutures) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      future.get();<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><a name="line.980"></a>
-<span class="sourceLineNo">981</span>  /**<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   * Canary entry point for specified table.<a name="line.982"></a>
-<span class="sourceLineNo">983</span>   * @throws Exception<a name="line.983"></a>
-<span class="sourceLineNo">984</span>   */<a name="line.984"></a>
-<span class="sourceLineNo">985</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      ExecutorService executor, TaskType taskType) throws Exception {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    if (LOG.isDebugEnabled()) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        tableName));<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        executor, taskType);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    } else {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  /*<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>   * Loops over regions that owns this table, and output some information abouts the state.<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType) throws Exception {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span><a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    if (LOG.isDebugEnabled()) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>    Table table = null;<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    try {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    } catch (TableNotFoundException e) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      return new ArrayList&lt;Future&lt;Void&gt;&gt;();<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;RegionTask&gt;();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    try {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      for (HRegionInfo region : admin.getTableRegions(tableDesc.getTableName())) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        tasks.add(new RegionTask(admin.getConnection(), region, sink, taskType));<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    } finally {<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      table.close();<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    return executor.invokeAll(tasks);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>  // a monitor for regionserver mode<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  private static class RegionServerMonitor extends Monitor {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    private boolean allRegions;<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    public RegionServerMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        ExtendedSink sink, ExecutorService executor, boolean allRegions,<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        boolean treatFailureAsError) {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      this.allRegions = allRegions;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span><a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    private ExtendedSink getSink() {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      return (ExtendedSink) this.sink;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span><a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    @Override<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    public void run() {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      if (this.initAdmin() &amp;&amp; this.checkNoTableNames()) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = this.filterRegionServerByName();<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        this.initialized = true;<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>        this.monitorRegionServers(rsAndRMap);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      this.done = true;<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>    private boolean checkNoTableNames() {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      List&lt;String&gt; foundTableNames = new ArrayList&lt;String&gt;();<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>      TableName[] tableNames = null;<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      if (LOG.isDebugEnabled()) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      try {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>        tableNames = this.admin.listTableNames();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      } catch (IOException e) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        LOG.error("Get listTableNames failed", e);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        return false;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      if (this.targets == null || this.targets.length == 0) return true;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      for (String target : this.targets) {<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        for (TableName tableName : tableNames) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          if (target.equals(tableName.getNameAsString())) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>            foundTableNames.add(target);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (foundTableNames.size() &gt; 0) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        System.err.println("Cannot pass a tablename when using the -regionserver " +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>            "option, tablenames:" + foundTableNames.toString());<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        this.errorCode = USAGE_EXIT_CODE;<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      }<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      return foundTableNames.size() == 0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    }<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span><a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    private void monitorRegionServers(Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      List&lt;RegionServerTask&gt; tasks = new ArrayList&lt;RegionServerTask&gt;();<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      Map&lt;String, AtomicLong&gt; successMap = new HashMap&lt;String, AtomicLong&gt;();<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      Random rand = new Random();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        String serverName = entry.getKey();<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        AtomicLong successes = new AtomicLong(0);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        successMap.put(serverName, successes);<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        if (this.allRegions) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>          for (HRegionInfo region : entry.getValue()) {<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            tasks.add(new RegionServerTask(this.connection,<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>                serverName,<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>                region,<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>                getSink(),<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>                successes));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>          }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        } else {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>          // random select a region if flag not set<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>          HRegionInfo region = entry.getValue().get(rand.nextInt(entry.getValue().size()));<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>          tasks.add(new RegionServerTask(this.connection,<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>              serverName,<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>              region,<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>              getSink(),<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>              successes));<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>        }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      }<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>      try {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>          try {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>            future.get();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          } catch (ExecutionException e) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.error("Sniff regionserver failed!", e);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        if (this.allRegions) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>            String serverName = entry.getKey();<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            LOG.info("Successfully read " + successMap.get(serverName) + " regions out of "<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>                    + entry.getValue().size() + " on regionserver:" + serverName);<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      } catch (InterruptedException e) {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        LOG.error("Sniff regionserver interrupted!", e);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      }<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>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; filterRegionServerByName() {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; regionServerAndRegionsMap = this.getAllRegionServerByName();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      regionServerAndRegionsMap = this.doFilterRegionServerByName(regionServerAndRegionsMap);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>      return regionServerAndRegionsMap;<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; getAllRegionServerByName() {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      Table table = null;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      RegionLocator regionLocator = null;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      try {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        if (LOG.isDebugEnabled()) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          LOG.debug(String.format("reading list of tables and locations"));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        HTableDescriptor[] tableDescs = this.admin.listTables();<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        List&lt;HRegionInfo&gt; regions = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>        for (HTableDescriptor tableDesc : tableDescs) {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>          table = this.admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>          regionLocator = this.admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>          for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>            ServerName rs = location.getServerName();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>            String rsName = rs.getHostname();<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>            HRegionInfo r = location.getRegionInfo();<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>            if (rsAndRMap.containsKey(rsName)) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>              regions = rsAndRMap.get(rsName);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            } else {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>              regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>              rsAndRMap.put(rsName, regions);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>            regions.add(r);<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>          }<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>          table.close();<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span><a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      } catch (IOException e) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        String msg = "Get HTables info failed";<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        LOG.error(msg, e);<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>      } finally {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        if (table != null) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          try {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            table.close();<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          } catch (IOException e) {<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>            LOG.warn("Close table failed", e);<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>        }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>      }<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span><a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return rsAndRMap;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; doFilterRegionServerByName(<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; fullRsAndRMap) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; filteredRsAndRMap = null;<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span><a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        filteredRsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        Pattern pattern = null;<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        Matcher matcher = null;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        boolean regExpFound = false;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (String rsName : this.targets) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (this.useRegExp) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>            regExpFound = false;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>            pattern = Pattern.compile(rsName);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : fullRsAndRMap.entrySet()) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>              matcher = pattern.matcher(entry.getKey());<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>              if (matcher.matches()) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>                filteredRsAndRMap.put(entry.getKey(), entry.getValue());<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>                regExpFound = true;<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>            if (!regExpFound) {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>              LOG.info("No RegionServerInfo found, regionServerPattern:" + rsName);<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            if (fullRsAndRMap.containsKey(rsName)) {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>              filteredRsAndRMap.put(rsName, fullRsAndRMap.get(rsName));<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>            } else {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>              LOG.info("No RegionServerInfo found, regionServerName:" + rsName);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>            }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>          }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        }<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>        filteredRsAndRMap = fullRsAndRMap;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return filteredRsAndRMap;<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><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  public static void main(String[] args) throws Exception {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    final Configuration conf = HBaseConfiguration.create();<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span><a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // loading the generic options to conf<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    new GenericOptionsParser(conf, args);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    int numThreads = conf.getInt("hbase.canary.threads.num", MAX_THREADS_NUM);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    LOG.info("Number of exection threads " + numThreads);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span><a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(numThreads);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span><a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    Class&lt;? extends Sink&gt; sinkClass =<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        conf.getClass("hbase.canary.sink.class", RegionServerStdOutSink.class, Sink.class);<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>    Sink sink = ReflectionUtils.newInstance(sinkClass);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span><a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    int exitCode = ToolRunner.run(conf, new Canary(executor, sink), args);<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    executor.shutdown();<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    System.exit(exitCode);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>}<a name="line.1244"></a>
+<span class="sourceLineNo">625</span>            }<a name="line.625"></a>
+<span class="sourceLineNo">626</span>          }<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>            monitorThread.interrupt();<a name="line.629"></a>
+<span class="sourceLineNo">630</span>            return monitor.errorCode;<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        } finally {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>          if (monitor != null) monitor.close();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        }<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>        Thread.sleep(interval);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      } while (interval &gt; 0);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    } // try-with-resources close<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    if (choreService != null) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>      choreService.shutdown();<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    return monitor.errorCode;<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>  private void printUsageAndExit() {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    System.err.printf(<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        getClass().getName());<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    System.err.println(" where [opts] are:");<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.err.println("   -help          Show this help and exit.");<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    System.err.println("      which means to enable regionserver mode");<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    System.err.println("      only works in regionserver mode.");<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        " default is true");<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.665"></a>
+<span class="sourceLineNo">666</span>        + " Default is hbase:canary");<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    System.err<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    System.exit(USAGE_EXIT_CODE);<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>   * A Factory method for {@link Monitor}.<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * Can be overridden by user.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @param index a start index for monitor target<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   * @param args args passed from user<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   * @return a Monitor instance<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   */<a name="line.678"></a>
+<span class="sourceLineNo">679</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Monitor monitor = null;<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    String[] monitorTargets = null;<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>    if(index &gt;= 0) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      int length = args.length - index;<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      monitorTargets = new String[length];<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.regionServerMode) {<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      monitor =<a name="line.690"></a>
+<span class="sourceLineNo">691</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.691"></a>
+<span class="sourceLineNo">692</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.692"></a>
+<span class="sourceLineNo">693</span>              this.treatFailureAsError);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    } else {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      monitor =<a name="line.695"></a>
+<span class="sourceLineNo">696</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.696"></a>
+<span class="sourceLineNo">697</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return monitor;<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">702</span>  // a Monitor super-class can be extended by users<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    protected Connection connection;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    protected Admin admin;<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    protected String[] targets;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    protected boolean useRegExp;<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    protected boolean treatFailureAsError;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    protected boolean initialized = false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>    protected boolean done = false;<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    protected int errorCode = 0;<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    protected Sink sink;<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    protected ExecutorService executor;<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>    public boolean isDone() {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      return done;<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>    public boolean hasError() {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      return errorCode != 0;<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">724</span><a name="line.724"></a>
+<span class="sourceLineNo">725</span>    public boolean finalCheckForErrors() {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      if (errorCode != 0) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        return true;<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      return treatFailureAsError &amp;&amp;<a name="line.729"></a>
+<span class="sourceLineNo">730</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>    @Override<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    public void close() throws IOException {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (this.admin != null) this.admin.close();<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.738"></a>
+<span class="sourceLineNo">739</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.740"></a>
+<span class="sourceLineNo">741</span><a name="line.741"></a>
+<span class="sourceLineNo">742</span>      this.connection = connection;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      this.targets = monitorTargets;<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      this.useRegExp = useRegExp;<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      this.sink = sink;<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      this.executor = executor;<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>    @Override<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    public abstract void run();<a name="line.751"></a>
+<span class="sourceLineNo">752</span><a name="line.752"></a>
+<span class="sourceLineNo">753</span>    protected boolean initAdmin() {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>      if (null == this.admin) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        try {<a name="line.755"></a>
+<span class="sourceLineNo">756</span>          this.admin = this.connection.getAdmin();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        } catch (Exception e) {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.758"></a>
+<span class="sourceLineNo">759</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
+<span class="sourceLineNo">761</span>      } else if (admin.isAborted()) {<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        LOG.error("HBaseAdmin aborted");<a name="line.762"></a>
+<span class="sourceLineNo">763</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      return !this.hasError();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
+<span class="sourceLineNo">767</span>  }<a name="line.767"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>  // a monitor for region mode<a name="line.769"></a>
+<span class="sourceLineNo">770</span>  private static class RegionMonitor extends Monitor {<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    // 10 minutes<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    // 1 days<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    private long lastCheckTime = -1;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    private boolean writeSniffing;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    private TableName writeTableName;<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private int writeDataTTL;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    private float regionsLowerLimit;<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    private float regionsUpperLimit;<a name="line.781"></a>
+<span class="sourceLineNo">782</span>    private int checkPeriod;<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.784"></a>
+<span class="sourceLineNo">785</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.785"></a>
+<span class="sourceLineNo">786</span>        boolean treatFailureAsError) {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      Configuration conf = connection.getConfiguration();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      this.writeSniffing = writeSniffing;<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      this.writeTableName = writeTableName;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      this.writeDataTTL =<a name="line.791"></a>
+<span class="sourceLineNo">792</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.792"></a>
+<span class="sourceLineNo">793</span>      this.regionsLowerLimit =<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      this.regionsUpperLimit =<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.796"></a>
+<span class="sourceLineNo">797</span>      this.checkPeriod =<a name="line.797"></a>
+<span class="sourceLineNo">798</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.798"></a>
+<span class="sourceLineNo">799</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    @Override<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    public void run() {<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      if (this.initAdmin()) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>        try {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>            this.initialized = true;<a name="line.809"></a>
+<span class="sourceLineNo">810</span>            for (String table : tables) {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.811"></a>
+<span class="sourceLineNo">812</span>            }<a name="line.812"></a>
+<span class="sourceLineNo">813</span>          } else {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.814"></a>
+<span class="sourceLineNo">815</span>          }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>          if (writeSniffing) {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>              try {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>                checkWriteTableDistribution();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>              } catch (IOException e) {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>              }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.824"></a>
+<span class="sourceLineNo">825</span>            }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>            // sniff canary table with write operation<a name="line.826"></a>
+<span class="sourceLineNo">827</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.827"></a>
+<span class="sourceLineNo">828</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.828"></a>
+<span class="sourceLineNo">829</span>          }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>            try {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>              future.get();<a name="line.833"></a>
+<span class="sourceLineNo">834</span>            } catch (ExecutionException e) {<a name="line.834"></a>
+<span class="sourceLineNo">835</span>              LOG.error("Sniff region failed!", e);<a name="line.835"></a>
+<span class="sourceLineNo">836</span>            }<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        } catch (Exception e) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>          LOG.error("Run regionMonitor failed", e);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          this.errorCode = ERROR_EXIT_CODE;<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>      this.done = true;<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>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>      String[] returnTables = null;<a name="line.847"></a>
+<span class="sourceLineNo">848</span><a name="line.848"></a>
+<span class="sourceLineNo">849</span>      if (this.useRegExp) {<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        Pattern pattern = null;<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        HTableDescriptor[] tds = null;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        try {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          if (LOG.isDebugEnabled()) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>            LOG.debug(String.format("reading list of tables"));<a name="line.855"></a>
+<span class="sourceLineNo">856</span>          }<a name="line.856"></a>
+<span class="sourceLineNo">857</span>          tds = this.admin.listTables(pattern);<a name="line.857"></a>
+<span class="sourceLineNo">858</span>          if (tds == null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            tds = new HTableDescriptor[0];<a name="line.859"></a>
+<span class="sourceLineNo">860</span>          }<a name="line.860"></a>
+<span class="sourceLineNo">861</span>          for (String monitorTarget : monitorTargets) {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>            pattern = Pattern.compile(monitorTarget);<a name="line.862"></a>
+<span class="sourceLineNo">863</span>            for (HTableDescriptor td : tds) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>                tmpTables.add(td.getNameAsString());<a name="line.865"></a>
+<span class="sourceLineNo">866</span>              }<a name="line.866"></a>
+<span class="sourceLineNo">867</span>            }<a name="line.867"></a>
+<span class="sourceLineNo">868</span>          }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        } catch (IOException e) {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>          LOG.error("Communicate with admin failed", e);<a name="line.870"></a>
+<span class="sourceLineNo">871</span>          throw e;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>        if (tmpTables.size() &gt; 0) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>        } else {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          LOG.error(msg);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          throw new TableNotFoundException(msg);<a name="line.880"></a>
+<span class="sourceLineNo">881</span>        }<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      } else {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>        returnTables = monitorTargets;<a name="line.883"></a>


<TRUNCATED>

[27/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html
index 4345bcc..a682fea 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.BalanceInfo.html
@@ -54,402 +54,398 @@
 <span class="sourceLineNo">046</span> * &lt;p&gt;Cluster-wide load balancing will occur only when there are no regions in<a name="line.46"></a>
 <span class="sourceLineNo">047</span> * transition and according to a fixed period of a time using {@link #balanceCluster(Map)}.<a name="line.47"></a>
 <span class="sourceLineNo">048</span> *<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * &lt;p&gt;Inline region placement with {@link #immediateAssignment} can be used when<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * the Master needs to handle closed regions that it currently does not have<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * a destination set for.  This can happen during master failover.<a name="line.51"></a>
-<span class="sourceLineNo">052</span> *<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * &lt;p&gt;On cluster startup, bulk assignment can be used to determine<a name="line.53"></a>
-<span class="sourceLineNo">054</span> * locations for all Regions in a cluster.<a name="line.54"></a>
-<span class="sourceLineNo">055</span> *<a name="line.55"></a>
-<span class="sourceLineNo">056</span> * &lt;p&gt;This classes produces plans for the <a name="line.56"></a>
-<span class="sourceLineNo">057</span> * {@link org.apache.hadoop.hbase.master.AssignmentManager} to execute.<a name="line.57"></a>
-<span class="sourceLineNo">058</span> */<a name="line.58"></a>
-<span class="sourceLineNo">059</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.59"></a>
-<span class="sourceLineNo">060</span>public class SimpleLoadBalancer extends BaseLoadBalancer {<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private static final Log LOG = LogFactory.getLog(SimpleLoadBalancer.class);<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.62"></a>
+<span class="sourceLineNo">049</span> * &lt;p&gt;On cluster startup, bulk assignment can be used to determine<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * locations for all Regions in a cluster.<a name="line.50"></a>
+<span class="sourceLineNo">051</span> *<a name="line.51"></a>
+<span class="sourceLineNo">052</span> * &lt;p&gt;This classes produces plans for the<a name="line.52"></a>
+<span class="sourceLineNo">053</span> * {@link org.apache.hadoop.hbase.master.AssignmentManager} to execute.<a name="line.53"></a>
+<span class="sourceLineNo">054</span> */<a name="line.54"></a>
+<span class="sourceLineNo">055</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.55"></a>
+<span class="sourceLineNo">056</span>public class SimpleLoadBalancer extends BaseLoadBalancer {<a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static final Log LOG = LogFactory.getLog(SimpleLoadBalancer.class);<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>  private RegionInfoComparator riComparator = new RegionInfoComparator();<a name="line.60"></a>
+<span class="sourceLineNo">061</span>  private RegionPlan.RegionPlanComparator rpComparator = new RegionPlan.RegionPlanComparator();<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
 <span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private RegionInfoComparator riComparator = new RegionInfoComparator();<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  private RegionPlan.RegionPlanComparator rpComparator = new RegionPlan.RegionPlanComparator();<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  /**<a name="line.68"></a>
-<span class="sourceLineNo">069</span>   * Stores additional per-server information about the regions added/removed<a name="line.69"></a>
-<span class="sourceLineNo">070</span>   * during the run of the balancing algorithm.<a name="line.70"></a>
-<span class="sourceLineNo">071</span>   *<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   * For servers that shed regions, we need to track which regions we have already<a name="line.72"></a>
-<span class="sourceLineNo">073</span>   * shed. &lt;b&gt;nextRegionForUnload&lt;/b&gt; contains the index in the list of regions on<a name="line.73"></a>
-<span class="sourceLineNo">074</span>   * the server that is the next to be shed.<a name="line.74"></a>
-<span class="sourceLineNo">075</span>   */<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  static class BalanceInfo {<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>    private final int nextRegionForUnload;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    private int numRegionsAdded;<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>    public BalanceInfo(int nextRegionForUnload, int numRegionsAdded) {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>      this.nextRegionForUnload = nextRegionForUnload;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      this.numRegionsAdded = numRegionsAdded;<a name="line.83"></a>
+<span class="sourceLineNo">064</span>  /**<a name="line.64"></a>
+<span class="sourceLineNo">065</span>   * Stores additional per-server information about the regions added/removed<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * during the run of the balancing algorithm.<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   *<a name="line.67"></a>
+<span class="sourceLineNo">068</span>   * For servers that shed regions, we need to track which regions we have already<a name="line.68"></a>
+<span class="sourceLineNo">069</span>   * shed. &lt;b&gt;nextRegionForUnload&lt;/b&gt; contains the index in the list of regions on<a name="line.69"></a>
+<span class="sourceLineNo">070</span>   * the server that is the next to be shed.<a name="line.70"></a>
+<span class="sourceLineNo">071</span>   */<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  static class BalanceInfo {<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>    private final int nextRegionForUnload;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    private int numRegionsAdded;<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>    public BalanceInfo(int nextRegionForUnload, int numRegionsAdded) {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>      this.nextRegionForUnload = nextRegionForUnload;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>      this.numRegionsAdded = numRegionsAdded;<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>
+<span class="sourceLineNo">082</span>    int getNextRegionForUnload() {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>      return nextRegionForUnload;<a name="line.83"></a>
 <span class="sourceLineNo">084</span>    }<a name="line.84"></a>
 <span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>    int getNextRegionForUnload() {<a name="line.86"></a>
-<span class="sourceLineNo">087</span>      return nextRegionForUnload;<a name="line.87"></a>
+<span class="sourceLineNo">086</span>    int getNumRegionsAdded() {<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      return numRegionsAdded;<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 getNumRegionsAdded() {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>      return numRegionsAdded;<a name="line.91"></a>
+<span class="sourceLineNo">090</span>    void setNumRegionsAdded(int numAdded) {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      this.numRegionsAdded = numAdded;<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">094</span>    void setNumRegionsAdded(int numAdded) {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      this.numRegionsAdded = numAdded;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    }<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  }<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>   * Generate a global load balancing plan according to the specified map of<a name="line.100"></a>
-<span class="sourceLineNo">101</span>   * server information to the most loaded regions of each server.<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   *<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   * The load balancing invariant is that all servers are within 1 region of the<a name="line.103"></a>
-<span class="sourceLineNo">104</span>   * average number of regions per server.  If the average is an integer number,<a name="line.104"></a>
-<span class="sourceLineNo">105</span>   * all servers will be balanced to the average.  Otherwise, all servers will<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * have either floor(average) or ceiling(average) regions.<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   *<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * HBASE-3609 Modeled regionsToMove using Guava's MinMaxPriorityQueue so that<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   *   we can fetch from both ends of the queue.<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   * At the beginning, we check whether there was empty region server<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   *   just discovered by Master. If so, we alternately choose new / old<a name="line.111"></a>
-<span class="sourceLineNo">112</span>   *   regions from head / tail of regionsToMove, respectively. This alternation<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   *   avoids clustering young regions on the newly discovered region server.<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   *   Otherwise, we choose new regions from head of regionsToMove.<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   *<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   * Another improvement from HBASE-3609 is that we assign regions from<a name="line.116"></a>
-<span class="sourceLineNo">117</span>   *   regionsToMove to underloaded servers in round-robin fashion.<a name="line.117"></a>
-<span class="sourceLineNo">118</span>   *   Previously one underloaded server would be filled before we move onto<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   *   the next underloaded server, leading to clustering of young regions.<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   *<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * Finally, we randomly shuffle underloaded servers so that they receive<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   *   offloaded regions relatively evenly across calls to balanceCluster().<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   *<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   * The algorithm is currently implemented as such:<a name="line.124"></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>   * Generate a global load balancing plan according to the specified map of<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   * server information to the most loaded regions of each server.<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   *<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   * The load balancing invariant is that all servers are within 1 region of the<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   * average number of regions per server.  If the average is an integer number,<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   * all servers will be balanced to the average.  Otherwise, all servers will<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   * have either floor(average) or ceiling(average) regions.<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   *<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   * HBASE-3609 Modeled regionsToMove using Guava's MinMaxPriorityQueue so that<a name="line.104"></a>
+<span class="sourceLineNo">105</span>   *   we can fetch from both ends of the queue.<a name="line.105"></a>
+<span class="sourceLineNo">106</span>   * At the beginning, we check whether there was empty region server<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   *   just discovered by Master. If so, we alternately choose new / old<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   *   regions from head / tail of regionsToMove, respectively. This alternation<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   *   avoids clustering young regions on the newly discovered region server.<a name="line.109"></a>
+<span class="sourceLineNo">110</span>   *   Otherwise, we choose new regions from head of regionsToMove.<a name="line.110"></a>
+<span class="sourceLineNo">111</span>   *<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   * Another improvement from HBASE-3609 is that we assign regions from<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   *   regionsToMove to underloaded servers in round-robin fashion.<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   *   Previously one underloaded server would be filled before we move onto<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   *   the next underloaded server, leading to clustering of young regions.<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   *<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   * Finally, we randomly shuffle underloaded servers so that they receive<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   *   offloaded regions relatively evenly across calls to balanceCluster().<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   *<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   * The algorithm is currently implemented as such:<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   *<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   * &lt;ol&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>   * &lt;li&gt;Determine the two valid numbers of regions each server should have,<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   *     &lt;b&gt;MIN&lt;/b&gt;=floor(average) and &lt;b&gt;MAX&lt;/b&gt;=ceiling(average).<a name="line.124"></a>
 <span class="sourceLineNo">125</span>   *<a name="line.125"></a>
-<span class="sourceLineNo">126</span>   * &lt;ol&gt;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>   * &lt;li&gt;Determine the two valid numbers of regions each server should have,<a name="line.127"></a>
-<span class="sourceLineNo">128</span>   *     &lt;b&gt;MIN&lt;/b&gt;=floor(average) and &lt;b&gt;MAX&lt;/b&gt;=ceiling(average).<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   *<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * &lt;li&gt;Iterate down the most loaded servers, shedding regions from each so<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   *     each server hosts exactly &lt;b&gt;MAX&lt;/b&gt; regions.  Stop once you reach a<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   *     server that already has &amp;lt;= &lt;b&gt;MAX&lt;/b&gt; regions.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   *     &lt;p&gt;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   *     Order the regions to move from most recent to least.<a name="line.134"></a>
+<span class="sourceLineNo">126</span>   * &lt;li&gt;Iterate down the most loaded servers, shedding regions from each so<a name="line.126"></a>
+<span class="sourceLineNo">127</span>   *     each server hosts exactly &lt;b&gt;MAX&lt;/b&gt; regions.  Stop once you reach a<a name="line.127"></a>
+<span class="sourceLineNo">128</span>   *     server that already has &amp;lt;= &lt;b&gt;MAX&lt;/b&gt; regions.<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   *     &lt;p&gt;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   *     Order the regions to move from most recent to least.<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   *<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * &lt;li&gt;Iterate down the least loaded servers, assigning regions so each server<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   *     has exactly &lt;b&gt;MIN&lt;/b&gt; regions.  Stop once you reach a server that<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   *     already has &amp;gt;= &lt;b&gt;MIN&lt;/b&gt; regions.<a name="line.134"></a>
 <span class="sourceLineNo">135</span>   *<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * &lt;li&gt;Iterate down the least loaded servers, assigning regions so each server<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   *     has exactly &lt;b&gt;MIN&lt;/b&gt; regions.  Stop once you reach a server that<a name="line.137"></a>
-<span class="sourceLineNo">138</span>   *     already has &amp;gt;= &lt;b&gt;MIN&lt;/b&gt; regions.<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   *<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   *     Regions being assigned to underloaded servers are those that were shed<a name="line.140"></a>
-<span class="sourceLineNo">141</span>   *     in the previous step.  It is possible that there were not enough<a name="line.141"></a>
-<span class="sourceLineNo">142</span>   *     regions shed to fill each underloaded server to &lt;b&gt;MIN&lt;/b&gt;.  If so we<a name="line.142"></a>
-<span class="sourceLineNo">143</span>   *     end up with a number of regions required to do so, &lt;b&gt;neededRegions&lt;/b&gt;.<a name="line.143"></a>
+<span class="sourceLineNo">136</span>   *     Regions being assigned to underloaded servers are those that were shed<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   *     in the previous step.  It is possible that there were not enough<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   *     regions shed to fill each underloaded server to &lt;b&gt;MIN&lt;/b&gt;.  If so we<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   *     end up with a number of regions required to do so, &lt;b&gt;neededRegions&lt;/b&gt;.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   *<a name="line.140"></a>
+<span class="sourceLineNo">141</span>   *     It is also possible that we were able to fill each underloaded but ended<a name="line.141"></a>
+<span class="sourceLineNo">142</span>   *     up with regions that were unassigned from overloaded servers but that<a name="line.142"></a>
+<span class="sourceLineNo">143</span>   *     still do not have assignment.<a name="line.143"></a>
 <span class="sourceLineNo">144</span>   *<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   *     It is also possible that we were able to fill each underloaded but ended<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   *     up with regions that were unassigned from overloaded servers but that<a name="line.146"></a>
-<span class="sourceLineNo">147</span>   *     still do not have assignment.<a name="line.147"></a>
+<span class="sourceLineNo">145</span>   *     If neither of these conditions hold (no regions needed to fill the<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   *     underloaded servers, no regions leftover from overloaded servers),<a name="line.146"></a>
+<span class="sourceLineNo">147</span>   *     we are done and return.  Otherwise we handle these cases below.<a name="line.147"></a>
 <span class="sourceLineNo">148</span>   *<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   *     If neither of these conditions hold (no regions needed to fill the<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   *     underloaded servers, no regions leftover from overloaded servers),<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   *     we are done and return.  Otherwise we handle these cases below.<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   *<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * &lt;li&gt;If &lt;b&gt;neededRegions&lt;/b&gt; is non-zero (still have underloaded servers),<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   *     we iterate the most loaded servers again, shedding a single server from<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   *     each (this brings them from having &lt;b&gt;MAX&lt;/b&gt; regions to having<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   *     &lt;b&gt;MIN&lt;/b&gt; regions).<a name="line.156"></a>
+<span class="sourceLineNo">149</span>   * &lt;li&gt;If &lt;b&gt;neededRegions&lt;/b&gt; is non-zero (still have underloaded servers),<a name="line.149"></a>
+<span class="sourceLineNo">150</span>   *     we iterate the most loaded servers again, shedding a single server from<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   *     each (this brings them from having &lt;b&gt;MAX&lt;/b&gt; regions to having<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   *     &lt;b&gt;MIN&lt;/b&gt; regions).<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   *<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * &lt;li&gt;We now definitely have more regions that need assignment, either from<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   *     the previous step or from the original shedding from overloaded servers.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   *     Iterate the least loaded servers filling each to &lt;b&gt;MIN&lt;/b&gt;.<a name="line.156"></a>
 <span class="sourceLineNo">157</span>   *<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * &lt;li&gt;We now definitely have more regions that need assignment, either from<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   *     the previous step or from the original shedding from overloaded servers.<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   *     Iterate the least loaded servers filling each to &lt;b&gt;MIN&lt;/b&gt;.<a name="line.160"></a>
+<span class="sourceLineNo">158</span>   * &lt;li&gt;If we still have more regions that need assignment, again iterate the<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   *     least loaded servers, this time giving each one (filling them to<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   *     &lt;b&gt;MAX&lt;/b&gt;) until we run out.<a name="line.160"></a>
 <span class="sourceLineNo">161</span>   *<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * &lt;li&gt;If we still have more regions that need assignment, again iterate the<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   *     least loaded servers, this time giving each one (filling them to<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   *     &lt;b&gt;MAX&lt;/b&gt;) until we run out.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   *<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * &lt;li&gt;All servers will now either host &lt;b&gt;MIN&lt;/b&gt; or &lt;b&gt;MAX&lt;/b&gt; regions.<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   *<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   *     In addition, any server hosting &amp;gt;= &lt;b&gt;MAX&lt;/b&gt; regions is guaranteed<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   *     to end up with &lt;b&gt;MAX&lt;/b&gt; regions at the end of the balancing.  This<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   *     ensures the minimal number of regions possible are moved.<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * &lt;/ol&gt;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   *<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * TODO: We can at-most reassign the number of regions away from a particular<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   *       server to be how many they report as most loaded.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   *       Should we just keep all assignment in memory?  Any objections?<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   *       Does this mean we need HeapSize on HMaster?  Or just careful monitor?<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   *       (current thinking is we will hold all assignments in memory)<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   *<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   * @param clusterMap Map of regionservers and their load/region information to<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   *                   a list of their most loaded regions<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   * @return a list of regions to be moved, including source and destination,<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   *         or null if cluster is already balanced<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   */<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  @Override<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  public List&lt;RegionPlan&gt; balanceCluster(<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    List&lt;RegionPlan&gt; regionsToReturn = balanceMasterRegions(clusterMap);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    if (regionsToReturn != null || clusterMap == null || clusterMap.size() &lt;= 1) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      return regionsToReturn;<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    if (masterServerName != null &amp;&amp; clusterMap.containsKey(masterServerName)) {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      if (clusterMap.size() &lt;= 2) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        return null;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      clusterMap = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(clusterMap);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      clusterMap.remove(masterServerName);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    }<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>    long startTime = System.currentTimeMillis();<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span>    // construct a Cluster object with clusterMap and rest of the<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    // argument as defaults<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    Cluster c = new Cluster(clusterMap, null, this.regionFinder, this.rackManager);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    if (!this.needsBalance(c)) return null;<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>    ClusterLoadState cs = new ClusterLoadState(clusterMap);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    int numServers = cs.getNumServers();<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    int numRegions = cs.getNumRegions();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    float average = cs.getLoadAverage();<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    int max = (int)Math.ceil(average);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    int min = (int)average;<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>    // Using to check balance result.<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    StringBuilder strBalanceParam = new StringBuilder();<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    strBalanceParam.append("Balance parameter: numRegions=").append(numRegions)<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        .append(", numServers=").append(numServers).append(", max=").append(max)<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        .append(", min=").append(min);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    LOG.debug(strBalanceParam.toString());<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>    // Balance the cluster<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    // TODO: Look at data block locality or a more complex load to do this<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    MinMaxPriorityQueue&lt;RegionPlan&gt; regionsToMove =<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      MinMaxPriorityQueue.orderedBy(rpComparator).create();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    regionsToReturn = new ArrayList&lt;RegionPlan&gt;();<a name="line.225"></a>
-<span class="sourceLineNo">226</span><a name="line.226"></a>
-<span class="sourceLineNo">227</span>    // Walk down most loaded, pruning each to the max<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    int serversOverloaded = 0;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    // flag used to fetch regions from head and tail of list, alternately<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    boolean fetchFromTail = false;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    Map&lt;ServerName, BalanceInfo&gt; serverBalanceInfo =<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      new TreeMap&lt;ServerName, BalanceInfo&gt;();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server:<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        serversByLoad.descendingMap().entrySet()) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      ServerAndLoad sal = server.getKey();<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      int load = sal.getLoad();<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      if (load &lt;= max) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        serverBalanceInfo.put(sal.getServerName(), new BalanceInfo(0, 0));<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        break;<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      serversOverloaded++;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      List&lt;HRegionInfo&gt; regions = server.getValue();<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      int numToOffload = Math.min(load - max, regions.size());<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      // account for the out-of-band regions which were assigned to this server<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      // after some other region server crashed<a name="line.245"></a>
-<span class="sourceLineNo">246</span>      Collections.sort(regions, riComparator);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      int numTaken = 0;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      for (int i = 0; i &lt;= numToOffload; ) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>        HRegionInfo hri = regions.get(i); // fetch from head<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        if (fetchFromTail) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          hri = regions.get(regions.size() - 1 - i);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        i++;<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        // Don't rebalance special regions.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        if (shouldBeOnMaster(hri)<a name="line.255"></a>
-<span class="sourceLineNo">256</span>            &amp;&amp; masterServerName.equals(sal.getServerName())) continue;<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        regionsToMove.add(new RegionPlan(hri, sal.getServerName(), null));<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        numTaken++;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        if (numTaken &gt;= numToOffload) break;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      serverBalanceInfo.put(sal.getServerName(),<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        new BalanceInfo(numToOffload, (-1)*numTaken));<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    int totalNumMoved = regionsToMove.size();<a name="line.264"></a>
+<span class="sourceLineNo">162</span>   * &lt;li&gt;All servers will now either host &lt;b&gt;MIN&lt;/b&gt; or &lt;b&gt;MAX&lt;/b&gt; regions.<a name="line.162"></a>
+<span class="sourceLineNo">163</span>   *<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   *     In addition, any server hosting &amp;gt;= &lt;b&gt;MAX&lt;/b&gt; regions is guaranteed<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   *     to end up with &lt;b&gt;MAX&lt;/b&gt; regions at the end of the balancing.  This<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   *     ensures the minimal number of regions possible are moved.<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * &lt;/ol&gt;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   *<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * TODO: We can at-most reassign the number of regions away from a particular<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   *       server to be how many they report as most loaded.<a name="line.170"></a>
+<span class="sourceLineNo">171</span>   *       Should we just keep all assignment in memory?  Any objections?<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   *       Does this mean we need HeapSize on HMaster?  Or just careful monitor?<a name="line.172"></a>
+<span class="sourceLineNo">173</span>   *       (current thinking is we will hold all assignments in memory)<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   *<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   * @param clusterMap Map of regionservers and their load/region information to<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   *                   a list of their most loaded regions<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   * @return a list of regions to be moved, including source and destination,<a name="line.177"></a>
+<span class="sourceLineNo">178</span>   *         or null if cluster is already balanced<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   */<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  @Override<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  public List&lt;RegionPlan&gt; balanceCluster(<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    List&lt;RegionPlan&gt; regionsToReturn = balanceMasterRegions(clusterMap);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    if (regionsToReturn != null || clusterMap == null || clusterMap.size() &lt;= 1) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      return regionsToReturn;<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    if (masterServerName != null &amp;&amp; clusterMap.containsKey(masterServerName)) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      if (clusterMap.size() &lt;= 2) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        return null;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      clusterMap = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(clusterMap);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      clusterMap.remove(masterServerName);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    }<a name="line.193"></a>
+<span class="sourceLineNo">194</span><a name="line.194"></a>
+<span class="sourceLineNo">195</span>    long startTime = System.currentTimeMillis();<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    // construct a Cluster object with clusterMap and rest of the<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    // argument as defaults<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    Cluster c = new Cluster(clusterMap, null, this.regionFinder, this.rackManager);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    if (!this.needsBalance(c)) return null;<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>    ClusterLoadState cs = new ClusterLoadState(clusterMap);<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    int numServers = cs.getNumServers();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    int numRegions = cs.getNumRegions();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    float average = cs.getLoadAverage();<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    int max = (int)Math.ceil(average);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    int min = (int)average;<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>    // Using to check balance result.<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    StringBuilder strBalanceParam = new StringBuilder();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    strBalanceParam.append("Balance parameter: numRegions=").append(numRegions)<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        .append(", numServers=").append(numServers).append(", max=").append(max)<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        .append(", min=").append(min);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    LOG.debug(strBalanceParam.toString());<a name="line.215"></a>
+<span class="sourceLineNo">216</span><a name="line.216"></a>
+<span class="sourceLineNo">217</span>    // Balance the cluster<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    // TODO: Look at data block locality or a more complex load to do this<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    MinMaxPriorityQueue&lt;RegionPlan&gt; regionsToMove =<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      MinMaxPriorityQueue.orderedBy(rpComparator).create();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    regionsToReturn = new ArrayList&lt;RegionPlan&gt;();<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    // Walk down most loaded, pruning each to the max<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    int serversOverloaded = 0;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    // flag used to fetch regions from head and tail of list, alternately<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    boolean fetchFromTail = false;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    Map&lt;ServerName, BalanceInfo&gt; serverBalanceInfo =<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      new TreeMap&lt;ServerName, BalanceInfo&gt;();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server:<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        serversByLoad.descendingMap().entrySet()) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      ServerAndLoad sal = server.getKey();<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      int load = sal.getLoad();<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      if (load &lt;= max) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        serverBalanceInfo.put(sal.getServerName(), new BalanceInfo(0, 0));<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        break;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      serversOverloaded++;<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      List&lt;HRegionInfo&gt; regions = server.getValue();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      int numToOffload = Math.min(load - max, regions.size());<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      // account for the out-of-band regions which were assigned to this server<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      // after some other region server crashed<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      Collections.sort(regions, riComparator);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      int numTaken = 0;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      for (int i = 0; i &lt;= numToOffload; ) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        HRegionInfo hri = regions.get(i); // fetch from head<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        if (fetchFromTail) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          hri = regions.get(regions.size() - 1 - i);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        }<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        i++;<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        // Don't rebalance special regions.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        if (shouldBeOnMaster(hri)<a name="line.251"></a>
+<span class="sourceLineNo">252</span>            &amp;&amp; masterServerName.equals(sal.getServerName())) continue;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>        regionsToMove.add(new RegionPlan(hri, sal.getServerName(), null));<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        numTaken++;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        if (numTaken &gt;= numToOffload) break;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      serverBalanceInfo.put(sal.getServerName(),<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        new BalanceInfo(numToOffload, (-1)*numTaken));<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    }<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    int totalNumMoved = regionsToMove.size();<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>    // Walk down least loaded, filling each to the min<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    int neededRegions = 0; // number of regions needed to bring all up to min<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    fetchFromTail = false;<a name="line.264"></a>
 <span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>    // Walk down least loaded, filling each to the min<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    int neededRegions = 0; // number of regions needed to bring all up to min<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    fetchFromTail = false;<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    Map&lt;ServerName, Integer&gt; underloadedServers = new HashMap&lt;ServerName, Integer&gt;();<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    int maxToTake = numRegions - min;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server:<a name="line.272"></a>
-<span class="sourceLineNo">273</span>        serversByLoad.entrySet()) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      if (maxToTake == 0) break; // no more to take<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      int load = server.getKey().getLoad();<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      if (load &gt;= min &amp;&amp; load &gt; 0) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        continue; // look for other servers which haven't reached min<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      int regionsToPut = min - load;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      if (regionsToPut == 0)<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        regionsToPut = 1;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      }<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      maxToTake -= regionsToPut;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      underloadedServers.put(server.getKey().getServerName(), regionsToPut);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    // number of servers that get new regions<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    int serversUnderloaded = underloadedServers.size();<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    int incr = 1;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    List&lt;ServerName&gt; sns =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      Arrays.asList(underloadedServers.keySet().toArray(new ServerName[serversUnderloaded]));<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    Collections.shuffle(sns, RANDOM);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    while (regionsToMove.size() &gt; 0) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int cnt = 0;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int i = incr &gt; 0 ? 0 : underloadedServers.size()-1;<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      for (; i &gt;= 0 &amp;&amp; i &lt; underloadedServers.size(); i += incr) {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>        if (regionsToMove.isEmpty()) break;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        ServerName si = sns.get(i);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>        int numToTake = underloadedServers.get(si);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        if (numToTake == 0) continue;<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>        addRegionPlan(regionsToMove, fetchFromTail, si, regionsToReturn);<a name="line.302"></a>
-<span class="sourceLineNo">303</span><a name="line.303"></a>
-<span class="sourceLineNo">304</span>        underloadedServers.put(si, numToTake-1);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>        cnt++;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        BalanceInfo bi = serverBalanceInfo.get(si);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        if (bi == null) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          bi = new BalanceInfo(0, 0);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>          serverBalanceInfo.put(si, bi);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>        }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        bi.setNumRegionsAdded(bi.getNumRegionsAdded()+1);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      }<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      if (cnt == 0) break;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      // iterates underloadedServers in the other direction<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      incr = -incr;<a name="line.315"></a>
+<span class="sourceLineNo">266</span>    Map&lt;ServerName, Integer&gt; underloadedServers = new HashMap&lt;ServerName, Integer&gt;();<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    int maxToTake = numRegions - min;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server:<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        serversByLoad.entrySet()) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      if (maxToTake == 0) break; // no more to take<a name="line.270"></a>
+<span class="sourceLineNo">271</span>      int load = server.getKey().getLoad();<a name="line.271"></a>
+<span class="sourceLineNo">272</span>      if (load &gt;= min &amp;&amp; load &gt; 0) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        continue; // look for other servers which haven't reached min<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      }<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      int regionsToPut = min - load;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>      if (regionsToPut == 0)<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        regionsToPut = 1;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      maxToTake -= regionsToPut;<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      underloadedServers.put(server.getKey().getServerName(), regionsToPut);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    // number of servers that get new regions<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    int serversUnderloaded = underloadedServers.size();<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    int incr = 1;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    List&lt;ServerName&gt; sns =<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      Arrays.asList(underloadedServers.keySet().toArray(new ServerName[serversUnderloaded]));<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    Collections.shuffle(sns, RANDOM);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    while (regionsToMove.size() &gt; 0) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      int cnt = 0;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      int i = incr &gt; 0 ? 0 : underloadedServers.size()-1;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      for (; i &gt;= 0 &amp;&amp; i &lt; underloadedServers.size(); i += incr) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        if (regionsToMove.isEmpty()) break;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        ServerName si = sns.get(i);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        int numToTake = underloadedServers.get(si);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        if (numToTake == 0) continue;<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>        addRegionPlan(regionsToMove, fetchFromTail, si, regionsToReturn);<a name="line.298"></a>
+<span class="sourceLineNo">299</span><a name="line.299"></a>
+<span class="sourceLineNo">300</span>        underloadedServers.put(si, numToTake-1);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        cnt++;<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        BalanceInfo bi = serverBalanceInfo.get(si);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        if (bi == null) {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          bi = new BalanceInfo(0, 0);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          serverBalanceInfo.put(si, bi);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        bi.setNumRegionsAdded(bi.getNumRegionsAdded()+1);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      if (cnt == 0) break;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      // iterates underloadedServers in the other direction<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      incr = -incr;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    for (Integer i : underloadedServers.values()) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      // If we still want to take some, increment needed<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      neededRegions += i;<a name="line.315"></a>
 <span class="sourceLineNo">316</span>    }<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    for (Integer i : underloadedServers.values()) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      // If we still want to take some, increment needed<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      neededRegions += i;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>    // If none needed to fill all to min and none left to drain all to max,<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    // we are done<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    if (neededRegions == 0 &amp;&amp; regionsToMove.isEmpty()) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      long endTime = System.currentTimeMillis();<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      LOG.info("Calculated a load balance in " + (endTime-startTime) + "ms. " +<a name="line.326"></a>
-<span class="sourceLineNo">327</span>          "Moving " + totalNumMoved + " regions off of " +<a name="line.327"></a>
-<span class="sourceLineNo">328</span>          serversOverloaded + " overloaded servers onto " +<a name="line.328"></a>
-<span class="sourceLineNo">329</span>          serversUnderloaded + " less loaded servers");<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      return regionsToReturn;<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    }<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>    // Need to do a second pass.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    // Either more regions to assign out or servers that are still underloaded<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    // If we need more to fill min, grab one from each most loaded until enough<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (neededRegions != 0) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      // Walk down most loaded, grabbing one from each until we get enough<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server :<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        serversByLoad.descendingMap().entrySet()) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>        BalanceInfo balanceInfo =<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          serverBalanceInfo.get(server.getKey().getServerName());<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        int idx =<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          balanceInfo == null ? 0 : balanceInfo.getNextRegionForUnload();<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        if (idx &gt;= server.getValue().size()) break;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        HRegionInfo region = server.getValue().get(idx);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        if (region.isMetaRegion()) continue; // Don't move meta regions.<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        regionsToMove.add(new RegionPlan(region, server.getKey().getServerName(), null));<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        totalNumMoved++;<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        if (--neededRegions == 0) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>          // No more regions needed, done shedding<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          break;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        }<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>    // Now we have a set of regions that must be all assigned out<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    // Assign each underloaded up to the min, then if leftovers, assign to max<a name="line.358"></a>
-<span class="sourceLineNo">359</span><a name="line.359"></a>
-<span class="sourceLineNo">360</span>    // Walk down least loaded, assigning to each to fill up to min<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server :<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        serversByLoad.entrySet()) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      int regionCount = server.getKey().getLoad();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      if (regionCount &gt;= min) break;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      BalanceInfo balanceInfo = serverBalanceInfo.get(server.getKey().getServerName());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      if(balanceInfo != null) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        regionCount += balanceInfo.getNumRegionsAdded();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if(regionCount &gt;= min) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        continue;<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      int numToTake = min - regionCount;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      int numTaken = 0;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      while(numTaken &lt; numToTake &amp;&amp; 0 &lt; regionsToMove.size()) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        addRegionPlan(regionsToMove, fetchFromTail,<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          server.getKey().getServerName(), regionsToReturn);<a name="line.376"></a>
-<span class="sourceLineNo">377</span>        numTaken++;<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>    // If we still have regions to dish out, assign underloaded to max<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    if (0 &lt; regionsToMove.size()) {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server :<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        serversByLoad.entrySet()) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        int regionCount = server.getKey().getLoad();<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        BalanceInfo balanceInfo = serverBalanceInfo.get(server.getKey().getServerName());<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        if(balanceInfo != null) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          regionCount += balanceInfo.getNumRegionsAdded();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        }<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        if(regionCount &gt;= max) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          break;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        }<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        addRegionPlan(regionsToMove, fetchFromTail,<a name="line.393"></a>
-<span class="sourceLineNo">394</span>          server.getKey().getServerName(), regionsToReturn);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        if (regionsToMove.isEmpty()) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          break;<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        }<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><a name="line.400"></a>
-<span class="sourceLineNo">401</span>    long endTime = System.currentTimeMillis();<a name="line.401"></a>
-<span class="sourceLineNo">402</span><a name="line.402"></a>
-<span class="sourceLineNo">403</span>    if (!regionsToMove.isEmpty() || neededRegions != 0) {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      // Emit data so can diagnose how balancer went astray.<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      LOG.warn("regionsToMove=" + totalNumMoved +<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        ", numServers=" + numServers + ", serversOverloaded=" + serversOverloaded +<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        ", serversUnderloaded=" + serversUnderloaded);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      StringBuilder sb = new StringBuilder();<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; e: clusterMap.entrySet()) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        sb.append(e.getKey().toString());<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        sb.append(" ");<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        sb.append(e.getValue().size());<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      }<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      LOG.warn("Input " + sb.toString());<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>    // All done!<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    LOG.info("Done. Calculated a load balance in " + (endTime-startTime) + "ms. " +<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        "Moving " + totalNumMoved + " regions off of " +<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        serversOverloaded + " overloaded servers onto " +<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        serversUnderloaded + " less loaded servers");<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>    return regionsToReturn;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  }<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  /**<a name="line.427"></a>
-<span class="sourceLineNo">428</span>   * Add a region from the head or tail to the List of regions to return.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  private void addRegionPlan(final MinMaxPriorityQueue&lt;RegionPlan&gt; regionsToMove,<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      final boolean fetchFromTail, final ServerName sn, List&lt;RegionPlan&gt; regionsToReturn) {<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    RegionPlan rp = null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    if (!fetchFromTail) rp = regionsToMove.remove();<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    else rp = regionsToMove.removeLast();<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    rp.setDestination(sn);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    regionsToReturn.add(rp);<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>
-<span class="sourceLineNo">439</span>  @Override<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  public List&lt;RegionPlan&gt; balanceCluster(TableName tableName,<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterState) throws HBaseIOException {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    return balanceCluster(clusterState);<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">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>    // If none needed to fill all to min and none left to drain all to max,<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    // we are done<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    if (neededRegions == 0 &amp;&amp; regionsToMove.isEmpty()) {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      long endTime = System.currentTimeMillis();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      LOG.info("Calculated a load balance in " + (endTime-startTime) + "ms. " +<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          "Moving " + totalNumMoved + " regions off of " +<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          serversOverloaded + " overloaded servers onto " +<a name="line.324"></a>
+<span class="sourceLineNo">325</span>          serversUnderloaded + " less loaded servers");<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      return regionsToReturn;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>    // Need to do a second pass.<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    // Either more regions to assign out or servers that are still underloaded<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    // If we need more to fill min, grab one from each most loaded until enough<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    if (neededRegions != 0) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      // Walk down most loaded, grabbing one from each until we get enough<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server :<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        serversByLoad.descendingMap().entrySet()) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        BalanceInfo balanceInfo =<a name="line.337"></a>
+<span class="sourceLineNo">338</span>          serverBalanceInfo.get(server.getKey().getServerName());<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        int idx =<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          balanceInfo == null ? 0 : balanceInfo.getNextRegionForUnload();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        if (idx &gt;= server.getValue().size()) break;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>        HRegionInfo region = server.getValue().get(idx);<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        if (region.isMetaRegion()) continue; // Don't move meta regions.<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        regionsToMove.add(new RegionPlan(region, server.getKey().getServerName(), null));<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        totalNumMoved++;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>        if (--neededRegions == 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>          // No more regions needed, done shedding<a name="line.347"></a>
+<span class="sourceLineNo">348</span>          break;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>    // Now we have a set of regions that must be all assigned out<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    // Assign each underloaded up to the min, then if leftovers, assign to max<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>    // Walk down least loaded, assigning to each to fill up to min<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server :<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        serversByLoad.entrySet()) {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      int regionCount = server.getKey().getLoad();<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      if (regionCount &gt;= min) break;<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      BalanceInfo balanceInfo = serverBalanceInfo.get(server.getKey().getServerName());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      if(balanceInfo != null) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        regionCount += balanceInfo.getNumRegionsAdded();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      }<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if(regionCount &gt;= min) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        continue;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      int numToTake = min - regionCount;<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      int numTaken = 0;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      while(numTaken &lt; numToTake &amp;&amp; 0 &lt; regionsToMove.size()) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        addRegionPlan(regionsToMove, fetchFromTail,<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          server.getKey().getServerName(), regionsToReturn);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        numTaken++;<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      }<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>    // If we still have regions to dish out, assign underloaded to max<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    if (0 &lt; regionsToMove.size()) {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server :<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        serversByLoad.entrySet()) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>        int regionCount = server.getKey().getLoad();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>        BalanceInfo balanceInfo = serverBalanceInfo.get(server.getKey().getServerName());<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        if(balanceInfo != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          regionCount += balanceInfo.getNumRegionsAdded();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        }<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        if(regionCount &gt;= max) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          break;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>        addRegionPlan(regionsToMove, fetchFromTail,<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          server.getKey().getServerName(), regionsToReturn);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        if (regionsToMove.isEmpty()) {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          break;<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        }<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      }<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>    long endTime = System.currentTimeMillis();<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>    if (!regionsToMove.isEmpty() || neededRegions != 0) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      // Emit data so can diagnose how balancer went astray.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      LOG.warn("regionsToMove=" + totalNumMoved +<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        ", numServers=" + numServers + ", serversOverloaded=" + serversOverloaded +<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        ", serversUnderloaded=" + serversUnderloaded);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      StringBuilder sb = new StringBuilder();<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; e: clusterMap.entrySet()) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        sb.append(e.getKey().toString());<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        sb.append(" ");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        sb.append(e.getValue().size());<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      LOG.warn("Input " + sb.toString());<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    // All done!<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    LOG.info("Done. Calculated a load balance in " + (endTime-startTime) + "ms. " +<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        "Moving " + totalNumMoved + " regions off of " +<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        serversOverloaded + " overloaded servers onto " +<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        serversUnderloaded + " less loaded servers");<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return regionsToReturn;<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>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * Add a region from the head or tail to the List of regions to return.<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  private void addRegionPlan(final MinMaxPriorityQueue&lt;RegionPlan&gt; regionsToMove,<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      final boolean fetchFromTail, final ServerName sn, List&lt;RegionPlan&gt; regionsToReturn) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    RegionPlan rp = null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    if (!fetchFromTail) rp = regionsToMove.remove();<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    else rp = regionsToMove.removeLast();<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    rp.setDestination(sn);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    regionsToReturn.add(rp);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>  @Override<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  public List&lt;RegionPlan&gt; balanceCluster(TableName tableName,<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterState) throws HBaseIOException {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    return balanceCluster(clusterState);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span>}<a name="line.440"></a>
 
 
 


[46/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/client/ConnectionImplementation.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/ConnectionImplementation.html b/devapidocs/org/apache/hadoop/hbase/client/ConnectionImplementation.html
index e3c5f93..45ad76f 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/ConnectionImplementation.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/ConnectionImplementation.html
@@ -726,31 +726,35 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnect
                           <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html?is-external=true" title="class or interface in java.util.concurrent">BlockingQueue</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a>&gt;&nbsp;passedWorkQueue)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>boolean</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#hasCellBlockSupport()">hasCellBlockSupport</a></strong>()</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>(package private) static <a href="../../../../../org/apache/hadoop/hbase/client/NonceGenerator.html" title="interface in org.apache.hadoop.hbase.client">NonceGenerator</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#injectNonceGeneratorForTesting(org.apache.hadoop.hbase.client.ClusterConnection,%20org.apache.hadoop.hbase.client.NonceGenerator)">injectNonceGeneratorForTesting</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a>&nbsp;conn,
                                                             <a href="../../../../../org/apache/hadoop/hbase/client/NonceGenerator.html" title="interface in org.apache.hadoop.hbase.client">NonceGenerator</a>&nbsp;cnm)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isAborted()">isAborted</a></strong>()</code>
 <div class="block">Check if the server or client was aborted.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isClosed()">isClosed</a></strong>()</code>
 <div class="block">Returns whether the connection is closed or not.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isDeadServer(org.apache.hadoop.hbase.ServerName)">isDeadServer</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isKeepAliveMasterConnectedAndRunning(org.apache.hadoop.hbase.client.ConnectionImplementation.MasterServiceState)">isKeepAliveMasterConnectedAndRunning</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.MasterServiceState.html" title="class in org.apache.hadoop.hbase.client">ConnectionImplementation.MasterServiceState</a>&nbsp;mss)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isMasterRunning()">isMasterRunning</a></strong>()</code>
 <div class="block"><strong>Deprecated.</strong>&nbsp;
@@ -758,20 +762,20 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnect
 </div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(byte[])">isTableAvailable</a></strong>(byte[]&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(byte[],%20byte[][])">isTableAvailable</a></strong>(byte[]&nbsp;tableName,
                                 byte[][]&nbsp;splitKeys)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(org.apache.hadoop.hbase.TableName)">isTableAvailable</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(org.apache.hadoop.hbase.TableName,%20byte[][])">isTableAvailable</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                 byte[][]&nbsp;splitKeys)</code>
@@ -779,26 +783,26 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnect
  splitkeys which was used while creating the given table.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableDisabled(byte[])">isTableDisabled</a></strong>(byte[]&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableDisabled(org.apache.hadoop.hbase.TableName)">isTableDisabled</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableEnabled(byte[])">isTableEnabled</a></strong>(byte[]&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableEnabled(org.apache.hadoop.hbase.TableName)">isTableEnabled</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">A table that isTableEnabled == false and isTableDisabled == false
  is possible.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>[]</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#listTableNames()">listTableNames</a></strong>()</code>
 <div class="block"><strong>Deprecated.</strong>&nbsp;
@@ -806,7 +810,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnect
 </div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>[]</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#listTables()">listTables</a></strong>()</code>
 <div class="block"><strong>Deprecated.</strong>&nbsp;
@@ -814,24 +818,24 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnect
 </div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateMeta(org.apache.hadoop.hbase.TableName,%20boolean,%20int)">locateMeta</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                     boolean&nbsp;useCache,
                     int&nbsp;replicaId)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(byte[])">locateRegion</a></strong>(byte[]&nbsp;regionName)</code>
 <div class="block">Gets the location of the region of <i>regionName</i>.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(byte[],%20byte[])">locateRegion</a></strong>(byte[]&nbsp;tableName,
                         byte[]&nbsp;row)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(org.apache.hadoop.hbase.TableName,%20byte[])">locateRegion</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                         byte[]&nbsp;row)</code>
@@ -839,14 +843,14 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnect
  lives in.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(org.apache.hadoop.hbase.TableName,%20byte[],%20boolean,%20boolean)">locateRegion</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                         byte[]&nbsp;row,
                         boolean&nbsp;useCache,
                         boolean&nbsp;retry)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(org.apache.hadoop.hbase.TableName,%20byte[],%20boolean,%20boolean,%20int)">locateRegion</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                         byte[]&nbsp;row,
@@ -854,7 +858,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnect
                         boolean&nbsp;retry,
                         int&nbsp;replicaId)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegionInMeta(org.apache.hadoop.hbase.TableName,%20byte[],%20boolean,%20boolean,%20int)">locateRegionInMeta</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                     byte[]&nbsp;row,
@@ -862,23 +866,23 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnect
                                     boolean&nbsp;retry,
                                     int&nbsp;replicaId)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(byte[])">locateRegions</a></strong>(byte[]&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(byte[],%20boolean,%20boolean)">locateRegions</a></strong>(byte[]&nbsp;tableName,
                           boolean&nbsp;useCache,
                           boolean&nbsp;offlined)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(org.apache.hadoop.hbase.TableName)">locateRegions</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)</code>
 <div class="block">Gets the locations of all regions in the specified table, <i>tableName</i>.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&gt;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(org.apache.hadoop.hbase.TableName,%20boolean,%20boolean)">locateRegions</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                           boolean&nbsp;useCache,
@@ -886,7 +890,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnect
 <div class="block">Gets the locations of all regions in the specified table, <i>tableName</i>.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatch(java.util.List,%20byte[],%20java.util.concurrent.ExecutorService,%20java.lang.Object[])">processBatch</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;&nbsp;list,
                         byte[]&nbsp;tableName,
@@ -897,7 +901,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnect
 </div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatch(java.util.List,%20org.apache.hadoop.hbase.TableName,%20java.util.concurrent.ExecutorService,%20java.lang.Object[])">processBatch</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;&nbsp;list,
                         <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
@@ -908,7 +912,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnect
 </div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>&lt;R&gt;&nbsp;void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatchCallback(java.util.List,%20byte[],%20java.util.concurrent.ExecutorService,%20java.lang.Object[],%20org.apache.hadoop.hbase.client.coprocessor.Batch.Callback)">processBatchCallback</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;&nbsp;list,
                                         byte[]&nbsp;tableName,
@@ -920,7 +924,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnect
 </div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>&lt;R&gt;&nbsp;void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatchCallback(java.util.List,%20org.apache.hadoop.hbase.TableName,%20java.util.concurrent.ExecutorService,%20java.lang.Object[],%20org.apache.hadoop.hbase.client.coprocessor.Batch.Callback)">processBatchCallback</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;&nbsp;list,
                                         <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
@@ -933,24 +937,24 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnect
 </div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#release(org.apache.hadoop.hbase.client.ConnectionImplementation.MasterServiceState)">release</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.MasterServiceState.html" title="class in org.apache.hadoop.hbase.client">ConnectionImplementation.MasterServiceState</a>&nbsp;mss)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#releaseMaster(org.apache.hadoop.hbase.client.ConnectionImplementation.MasterServiceState)">releaseMaster</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.MasterServiceState.html" title="class in org.apache.hadoop.hbase.client">ConnectionImplementation.MasterServiceState</a>&nbsp;mss)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#releaseZooKeeperWatcher(org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher)">releaseZooKeeperWatcher</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZooKeeperWatcher.html" title="class in org.apache.hadoop.hbase.zookeeper">ZooKeeperWatcher</a>&nbsp;zkw)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#relocateRegion(byte[],%20byte[])">relocateRegion</a></strong>(byte[]&nbsp;tableName,
                             byte[]&nbsp;row)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#relocateRegion(org.apache.hadoop.hbase.TableName,%20byte[])">relocateRegion</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                             byte[]&nbsp;row)</code>
@@ -958,7 +962,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnect
  lives in, ignoring any value that might be in the cache.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/RegionLocations.html" title="class in org.apache.hadoop.hbase">RegionLocations</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#relocateRegion(org.apache.hadoop.hbase.TableName,%20byte[],%20int)">relocateRegion</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                             byte[]&nbsp;row,
@@ -967,15 +971,15 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnect
  lives in, ignoring any value that might be in the cache.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#resetMasterServiceState(org.apache.hadoop.hbase.client.ConnectionImplementation.MasterServiceState)">resetMasterServiceState</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.MasterServiceState.html" title="class in org.apache.hadoop.hbase.client">ConnectionImplementation.MasterServiceState</a>&nbsp;mss)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#retrieveClusterId()">retrieveClusterId</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#setRegionCachePrefetch(byte[],%20boolean)">setRegionCachePrefetch</a></strong>(byte[]&nbsp;tableName,
                                             boolean&nbsp;enable)</code>
@@ -984,7 +988,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnect
 </div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#setRegionCachePrefetch(org.apache.hadoop.hbase.TableName,%20boolean)">setRegionCachePrefetch</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                             boolean&nbsp;enable)</code>
@@ -993,39 +997,39 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnect
 </div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/client/Registry.html" title="interface in org.apache.hadoop.hbase.client">Registry</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#setupRegistry()">setupRegistry</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#shutdownBatchPool(java.util.concurrent.ExecutorService)">shutdownBatchPool</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;pool)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#shutdownPools()">shutdownPools</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#toString()">toString</a></strong>()</code>
 <div class="block">An identifier that will remain the same for a given connection.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#updateCachedLocation(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.ServerName,%20org.apache.hadoop.hbase.ServerName,%20long)">updateCachedLocation</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;hri,
                                         <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;source,
                                         <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                         long&nbsp;seqNum)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#updateCachedLocations(byte[],%20byte[],%20java.lang.Object,%20org.apache.hadoop.hbase.HRegionLocation)">updateCachedLocations</a></strong>(byte[]&nbsp;tableName,
                                           byte[]&nbsp;rowkey,
                                           <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;exception,
                                           <a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;source)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#updateCachedLocations(org.apache.hadoop.hbase.TableName,%20byte[],%20byte[],%20java.lang.Object,%20org.apache.hadoop.hbase.ServerName)">updateCachedLocations</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                           byte[]&nbsp;regionName,
@@ -1036,7 +1040,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnect
  or delete it from the cache.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#updateCachedLocations(org.apache.hadoop.hbase.TableName,%20byte[],%20java.lang.Object,%20org.apache.hadoop.hbase.HRegionLocation)">updateCachedLocations</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                           byte[]&nbsp;rowkey,
@@ -3235,7 +3239,7 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.htm
 <a name="getNewRpcRetryingCallerFactory(org.apache.hadoop.conf.Configuration)">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>getNewRpcRetryingCallerFactory</h4>
 <pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RpcRetryingCallerFactory.html" title="class in org.apache.hadoop.hbase.client">RpcRetryingCallerFactory</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.html#line.2254">getNewRpcRetryingCallerFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
@@ -3249,6 +3253,20 @@ public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.htm
 <dt><span class="strong">Returns:</span></dt><dd>RpcRetryingCallerFactory</dd></dl>
 </li>
 </ul>
+<a name="hasCellBlockSupport()">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>hasCellBlockSupport</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.html#line.2260">hasCellBlockSupport</a>()</pre>
+<dl>
+<dt><strong>Specified by:</strong></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html#hasCellBlockSupport()">hasCellBlockSupport</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a></code></dd>
+<dt><span class="strong">Returns:</span></dt><dd>true when this connection uses a <a href="../../../../../org/apache/hadoop/hbase/codec/Codec.html" title="interface in org.apache.hadoop.hbase.codec"><code>Codec</code></a> and so
+         supports cell blocks.</dd></dl>
+</li>
+</ul>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/client/ConnectionUtils.MasterlessConnection.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/ConnectionUtils.MasterlessConnection.html b/devapidocs/org/apache/hadoop/hbase/client/ConnectionUtils.MasterlessConnection.html
index 6ee723a..3c8a507 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/ConnectionUtils.MasterlessConnection.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/ConnectionUtils.MasterlessConnection.html
@@ -196,7 +196,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImpleme
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html" title="class in org.apache.hadoop.hbase.client">ConnectionImplementation</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#abort(java.lang.String,%20java.lang.Throwable)">abort</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearCaches(org.apache.hadoop.hbase.ServerName)">clearCaches</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearRegionCache()">clearRegionCache</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearRegionCache(byte[])">clearRegionCache</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearRegionCache(org.apache.hadoop.hbase.TableName)">clearRegionCache</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearRegionCache(org.apache.hadoop.hbase.TableName,%20byte[])">clearRegionCache</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#close()">close</a>, <
 a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#createAsyncProcess(org.apache.hadoop.conf.Configuration)">createAsyncProcess</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#deleteCachedRegionLocation(org.apache.hadoop.hbase.HRegionLocation)">deleteCachedRegionLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#finalize()">finalize</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getAdmin()">getAdmin</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getAdmin(org.apache.hadoop.hbase.ServerName)">getAdmin</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getAdmin(org.apache.hadoop.hbase.ServerName,%20boolean)">getAdmin</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getAsyncProcess()">getAsyncProcess</a
 >, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getBackoffPolicy()">getBackoffPolicy</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getBufferedMutator(org.apache.hadoop.hbase.client.BufferedMutatorParams)">getBufferedMutator</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getBufferedMutator(org.apache.hadoop.hbase.TableName)">getBufferedMutator</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getCachedLocation(org.apache.hadoop.hbase.TableName,%20byte[])">getCachedLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getClient(org.apache.hadoop.hbase.ServerName)">getClient</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getConfiguration()">getConfiguration</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplement
 ation.html#getConnectionMetrics()">getConnectionMetrics</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getCurrentBatchPool()">getCurrentBatchPool</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getCurrentMetaLookupPool()">getCurrentMetaLookupPool</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getCurrentNrHRS()">getCurrentNrHRS</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getHTableDescriptor(byte[])">getHTableDescriptor</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getHTableDescriptor(org.apache.hadoop.hbase.TableName)">getHTableDescriptor</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getHTableDescriptors(java.util.List)">getHTableDescriptors</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.h
 tml#getHTableDescriptorsByTableName(java.util.List)">getHTableDescriptorsByTableName</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getKeepAliveMasterService()">getKeepAliveMasterService</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getKeepAliveZooKeeperWatcher()">getKeepAliveZooKeeperWatcher</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getMaster()">getMaster</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getNewRpcRetryingCallerFactory(org.apache.hadoop.conf.Configuration)">getNewRpcRetryingCallerFactory</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getNonceGenerator()">getNonceGenerator</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getNumberOfCachedRegionLocations(org.apache.hadoop.hbase.TableName)">getNumberOfCachedRegionL
 ocations</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionCachePrefetch(byte[])">getRegionCachePrefetch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionCachePrefetch(org.apache.hadoop.hbase.TableName)">getRegionCachePrefetch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionLocation(byte[],%20byte[],%20boolean)">getRegionLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionLocation(org.apache.hadoop.hbase.TableName,%20byte[],%20boolean)">getRegionLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionLocator(org.apache.hadoop.hbase.TableName)">getRegionLocator</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRpcClient()">getRpcClient</a>, <a href="../../../../../org/apache/hadoop/hbase/
 client/ConnectionImplementation.html#getStatisticsTracker()">getStatisticsTracker</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getStubKey(java.lang.String,%20java.lang.String,%20int,%20boolean)">getStubKey</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(byte[])">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(byte[],%20java.util.concurrent.ExecutorService)">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(java.lang.String)">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(java.lang.String,%20java.util.concurrent.ExecutorService)">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(org.apache.hadoop.hbase.TableName)">getTable</a>, <a href="../../../../../org/a
 pache/hadoop/hbase/client/ConnectionImplementation.html#getTable(org.apache.hadoop.hbase.TableName,%20java.util.concurrent.ExecutorService)">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTableNames()">getTableNames</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTableState(org.apache.hadoop.hbase.TableName)">getTableState</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#injectNonceGeneratorForTesting(org.apache.hadoop.hbase.client.ClusterConnection,%20org.apache.hadoop.hbase.client.NonceGenerator)">injectNonceGeneratorForTesting</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isAborted()">isAborted</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isClosed()">isClosed</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isDead
 Server(org.apache.hadoop.hbase.ServerName)">isDeadServer</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isMasterRunning()">isMasterRunning</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(byte[])">isTableAvailable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(byte[],%20byte[][])">isTableAvailable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(org.apache.hadoop.hbase.TableName)">isTableAvailable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(org.apache.hadoop.hbase.TableName,%20byte[][])">isTableAvailable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableDisabled(byte[])">isTableDisabled</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImpl
 ementation.html#isTableEnabled(byte[])">isTableEnabled</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableEnabled(org.apache.hadoop.hbase.TableName)">isTableEnabled</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#listTableNames()">listTableNames</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#listTables()">listTables</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(byte[])">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(byte[],%20byte[])">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(org.apache.hadoop.hbase.TableName,%20byte[])">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(org.apache.hadoop.hbase
 .TableName,%20byte[],%20boolean,%20boolean)">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(org.apache.hadoop.hbase.TableName,%20byte[],%20boolean,%20boolean,%20int)">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(byte[])">locateRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(byte[],%20boolean,%20boolean)">locateRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(org.apache.hadoop.hbase.TableName)">locateRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(org.apache.hadoop.hbase.TableName,%20boolean,%20boolean)">locateRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatch(java.util.List,%20byte[],%20java.util.c
 oncurrent.ExecutorService,%20java.lang.Object[])">processBatch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatch(java.util.List,%20org.apache.hadoop.hbase.TableName,%20java.util.concurrent.ExecutorService,%20java.lang.Object[])">processBatch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatchCallback(java.util.List,%20byte[],%20java.util.concurrent.ExecutorService,%20java.lang.Object[],%20org.apache.hadoop.hbase.client.coprocessor.Batch.Callback)">processBatchCallback</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatchCallback(java.util.List,%20org.apache.hadoop.hbase.TableName,%20java.util.concurrent.ExecutorService,%20java.lang.Object[],%20org.apache.hadoop.hbase.client.coprocessor.Batch.Callback)">processBatchCallback</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#releaseMaster(org.apa
 che.hadoop.hbase.client.ConnectionImplementation.MasterServiceState)">releaseMaster</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#releaseZooKeeperWatcher(org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher)">releaseZooKeeperWatcher</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#relocateRegion(byte[],%20byte[])">relocateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#relocateRegion(org.apache.hadoop.hbase.TableName,%20byte[])">relocateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#relocateRegion(org.apache.hadoop.hbase.TableName,%20byte[],%20int)">relocateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#retrieveClusterId()">retrieveClusterId</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#setRegionCachePrefetch(by
 te[],%20boolean)">setRegionCachePrefetch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#setRegionCachePrefetch(org.apache.hadoop.hbase.TableName,%20boolean)">setRegionCachePrefetch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#toString()">toString</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#updateCachedLocation(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.ServerName,%20org.apache.hadoop.hbase.ServerName,%20long)">updateCachedLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#updateCachedLocations(byte[],%20byte[],%20java.lang.Object,%20org.apache.hadoop.hbase.HRegionLocation)">updateCachedLocations</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#updateCachedLocations(org.apache.hadoop.hbase.TableName,%20byte[],%20byte[],%20java.lang.Object,%20org
 .apache.hadoop.hbase.ServerName)">updateCachedLocations</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#updateCachedLocations(org.apache.hadoop.hbase.TableName,%20byte[],%20java.lang.Object,%20org.apache.hadoop.hbase.HRegionLocation)">updateCachedLocations</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#abort(java.lang.String,%20java.lang.Throwable)">abort</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearCaches(org.apache.hadoop.hbase.ServerName)">clearCaches</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearRegionCache()">clearRegionCache</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearRegionCache(byte[])">clearRegionCache</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearRegionCache(org.apache.hadoop.hbase.TableName)">clearRegionCache</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearRegionCache(org.apache.hadoop.hbase.TableName,%20byte[])">clearRegionCache</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#close()">close</a>, <
 a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#createAsyncProcess(org.apache.hadoop.conf.Configuration)">createAsyncProcess</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#deleteCachedRegionLocation(org.apache.hadoop.hbase.HRegionLocation)">deleteCachedRegionLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#finalize()">finalize</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getAdmin()">getAdmin</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getAdmin(org.apache.hadoop.hbase.ServerName)">getAdmin</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getAdmin(org.apache.hadoop.hbase.ServerName,%20boolean)">getAdmin</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getAsyncProcess()">getAsyncProcess</a
 >, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getBackoffPolicy()">getBackoffPolicy</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getBufferedMutator(org.apache.hadoop.hbase.client.BufferedMutatorParams)">getBufferedMutator</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getBufferedMutator(org.apache.hadoop.hbase.TableName)">getBufferedMutator</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getCachedLocation(org.apache.hadoop.hbase.TableName,%20byte[])">getCachedLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getClient(org.apache.hadoop.hbase.ServerName)">getClient</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getConfiguration()">getConfiguration</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplement
 ation.html#getConnectionMetrics()">getConnectionMetrics</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getCurrentBatchPool()">getCurrentBatchPool</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getCurrentMetaLookupPool()">getCurrentMetaLookupPool</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getCurrentNrHRS()">getCurrentNrHRS</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getHTableDescriptor(byte[])">getHTableDescriptor</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getHTableDescriptor(org.apache.hadoop.hbase.TableName)">getHTableDescriptor</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getHTableDescriptors(java.util.List)">getHTableDescriptors</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.h
 tml#getHTableDescriptorsByTableName(java.util.List)">getHTableDescriptorsByTableName</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getKeepAliveMasterService()">getKeepAliveMasterService</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getKeepAliveZooKeeperWatcher()">getKeepAliveZooKeeperWatcher</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getMaster()">getMaster</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getNewRpcRetryingCallerFactory(org.apache.hadoop.conf.Configuration)">getNewRpcRetryingCallerFactory</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getNonceGenerator()">getNonceGenerator</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getNumberOfCachedRegionLocations(org.apache.hadoop.hbase.TableName)">getNumberOfCachedRegionL
 ocations</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionCachePrefetch(byte[])">getRegionCachePrefetch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionCachePrefetch(org.apache.hadoop.hbase.TableName)">getRegionCachePrefetch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionLocation(byte[],%20byte[],%20boolean)">getRegionLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionLocation(org.apache.hadoop.hbase.TableName,%20byte[],%20boolean)">getRegionLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionLocator(org.apache.hadoop.hbase.TableName)">getRegionLocator</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRpcClient()">getRpcClient</a>, <a href="../../../../../org/apache/hadoop/hbase/
 client/ConnectionImplementation.html#getStatisticsTracker()">getStatisticsTracker</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getStubKey(java.lang.String,%20java.lang.String,%20int,%20boolean)">getStubKey</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(byte[])">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(byte[],%20java.util.concurrent.ExecutorService)">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(java.lang.String)">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(java.lang.String,%20java.util.concurrent.ExecutorService)">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(org.apache.hadoop.hbase.TableName)">getTable</a>, <a href="../../../../../org/a
 pache/hadoop/hbase/client/ConnectionImplementation.html#getTable(org.apache.hadoop.hbase.TableName,%20java.util.concurrent.ExecutorService)">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTableNames()">getTableNames</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTableState(org.apache.hadoop.hbase.TableName)">getTableState</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#hasCellBlockSupport()">hasCellBlockSupport</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#injectNonceGeneratorForTesting(org.apache.hadoop.hbase.client.ClusterConnection,%20org.apache.hadoop.hbase.client.NonceGenerator)">injectNonceGeneratorForTesting</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isAborted()">isAborted</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImpl
 ementation.html#isClosed()">isClosed</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isDeadServer(org.apache.hadoop.hbase.ServerName)">isDeadServer</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isMasterRunning()">isMasterRunning</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(byte[])">isTableAvailable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(byte[],%20byte[][])">isTableAvailable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(org.apache.hadoop.hbase.TableName)">isTableAvailable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(org.apache.hadoop.hbase.TableName,%20byte[][])">isTableAvailable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionIm
 plementation.html#isTableDisabled(byte[])">isTableDisabled</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableEnabled(byte[])">isTableEnabled</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableEnabled(org.apache.hadoop.hbase.TableName)">isTableEnabled</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#listTableNames()">listTableNames</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#listTables()">listTables</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(byte[])">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(byte[],%20byte[])">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(org.apache.hadoop.hbase.TableName,%20byte[])">locate
 Region</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(org.apache.hadoop.hbase.TableName,%20byte[],%20boolean,%20boolean)">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(org.apache.hadoop.hbase.TableName,%20byte[],%20boolean,%20boolean,%20int)">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(byte[])">locateRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(byte[],%20boolean,%20boolean)">locateRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(org.apache.hadoop.hbase.TableName)">locateRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(org.apache.hadoop.hbase.TableName,%20boolean,%20boolean)">locateRegions</a>, <a h
 ref="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatch(java.util.List,%20byte[],%20java.util.concurrent.ExecutorService,%20java.lang.Object[])">processBatch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatch(java.util.List,%20org.apache.hadoop.hbase.TableName,%20java.util.concurrent.ExecutorService,%20java.lang.Object[])">processBatch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatchCallback(java.util.List,%20byte[],%20java.util.concurrent.ExecutorService,%20java.lang.Object[],%20org.apache.hadoop.hbase.client.coprocessor.Batch.Callback)">processBatchCallback</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatchCallback(java.util.List,%20org.apache.hadoop.hbase.TableName,%20java.util.concurrent.ExecutorService,%20java.lang.Object[],%20org.apache.hadoop.hbase.client.coprocessor.Batch.Callback)"
 >processBatchCallback</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#releaseMaster(org.apache.hadoop.hbase.client.ConnectionImplementation.MasterServiceState)">releaseMaster</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#releaseZooKeeperWatcher(org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher)">releaseZooKeeperWatcher</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#relocateRegion(byte[],%20byte[])">relocateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#relocateRegion(org.apache.hadoop.hbase.TableName,%20byte[])">relocateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#relocateRegion(org.apache.hadoop.hbase.TableName,%20byte[],%20int)">relocateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#retrieveClusterId()">
 retrieveClusterId</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#setRegionCachePrefetch(byte[],%20boolean)">setRegionCachePrefetch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#setRegionCachePrefetch(org.apache.hadoop.hbase.TableName,%20boolean)">setRegionCachePrefetch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#toString()">toString</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#updateCachedLocation(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.ServerName,%20org.apache.hadoop.hbase.ServerName,%20long)">updateCachedLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#updateCachedLocations(byte[],%20byte[],%20java.lang.Object,%20org.apache.hadoop.hbase.HRegionLocation)">updateCachedLocations</a>, <a href="../../../../../org/apache/hadoop/hbase/client
 /ConnectionImplementation.html#updateCachedLocations(org.apache.hadoop.hbase.TableName,%20byte[],%20byte[],%20java.lang.Object,%20org.apache.hadoop.hbase.ServerName)">updateCachedLocations</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#updateCachedLocations(org.apache.hadoop.hbase.TableName,%20byte[],%20java.lang.Object,%20org.apache.hadoop.hbase.HRegionLocation)">updateCachedLocations</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">


[49/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index d41eb5e..acb6628 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -26,7 +26,7 @@ under the License.
     <copyright>&#169;2007 - 2016 The Apache Software Foundation</copyright>
     <item>
       <title>File: 1673,
-             Errors: 12772,
+             Errors: 12767,
              Warnings: 0,
              Infos: 0
       </title>
@@ -7069,7 +7069,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  9
+                  8
                 </td>
               </tr>
                           <tr>
@@ -10527,7 +10527,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  84
+                  82
                 </td>
               </tr>
                           <tr>
@@ -18535,7 +18535,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  18
+                  16
                 </td>
               </tr>
                           <tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index aea353d..60a3ebd 100644
--- a/coc.html
+++ b/coc.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160210" />
+    <meta name="Date-Revision-yyyymmdd" content="20160211" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -331,7 +331,7 @@ For flagrant violations requiring a firm response the PMC may opt to skip early
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/cygwin.html
----------------------------------------------------------------------
diff --git a/cygwin.html b/cygwin.html
index 3e48d20..8a0ba2c 100644
--- a/cygwin.html
+++ b/cygwin.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160210" />
+    <meta name="Date-Revision-yyyymmdd" content="20160211" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Installing Apache HBase (TM) on Windows using Cygwin</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -673,7 +673,7 @@ Now your <b>HBase </b>server is running, <b>start coding</b> and build that next
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 01fb2cf..becda55 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160210" />
+    <meta name="Date-Revision-yyyymmdd" content="20160211" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -518,7 +518,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index df5a0cf..99d723d 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160210" />
+    <meta name="Date-Revision-yyyymmdd" content="20160211" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -1605,7 +1605,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index 9a657c8..ec9c761 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160210" />
+    <meta name="Date-Revision-yyyymmdd" content="20160211" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -312,7 +312,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index 95feb51..f5da0a8 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160210" />
+    <meta name="Date-Revision-yyyymmdd" content="20160211" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -786,7 +786,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index d7ddb73..f435bbe 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -3915,7 +3915,7 @@
 </dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#BaseLoadBalancer(org.apache.hadoop.hbase.master.balancer.MetricsBalancer)">BaseLoadBalancer(MetricsBalancer)</a></span> - Constructor for class 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></dt>
 <dd>
-<div class="block">This Constructor accepts an instance of MetricsBalancer, 
+<div class="block">This Constructor accepts an instance of MetricsBalancer,
  which will be used instead of creating a new one</div>
 </dd>
 <dt><a href="./org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html" title="class in org.apache.hadoop.hbase.master.balancer"><span class="strong">BaseLoadBalancer.Cluster</span></a> - Class in <a href="./org/apache/hadoop/hbase/master/balancer/package-summary.html">org.apache.hadoop.hbase.master.balancer</a></dt>
@@ -39625,6 +39625,14 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/TimeLimitedRpcController.html#hasCallTimeout()">hasCallTimeout()</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/TimeLimitedRpcController.html" title="class in org.apache.hadoop.hbase.ipc">TimeLimitedRpcController</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/client/ClusterConnection.html#hasCellBlockSupport()">hasCellBlockSupport()</a></span> - Method in interface org.apache.hadoop.hbase.client.<a href="./org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/client/ConnectionImplementation.html#hasCellBlockSupport()">hasCellBlockSupport()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="./org/apache/hadoop/hbase/client/ConnectionImplementation.html" title="class in org.apache.hadoop.hbase.client">ConnectionImplementation</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#hasCellBlockSupport()">hasCellBlockSupport()</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/AbstractRpcClient.html" title="class in org.apache.hadoop.hbase.ipc">AbstractRpcClient</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/RpcClient.html#hasCellBlockSupport()">hasCellBlockSupport()</a></span> - Method in interface org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/RpcClient.html" title="interface in org.apache.hadoop.hbase.ipc">RpcClient</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/mapreduce/ImportTsv.TsvParser.html#hasCellTTL()">hasCellTTL()</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="./org/apache/hadoop/hbase/mapreduce/ImportTsv.TsvParser.html" title="class in org.apache.hadoop.hbase.mapreduce">ImportTsv.TsvParser</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/mapreduce/ImportTsv.TsvParser.html#hasCellVisibility()">hasCellVisibility()</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="./org/apache/hadoop/hbase/mapreduce/ImportTsv.TsvParser.html" title="class in org.apache.hadoop.hbase.mapreduce">ImportTsv.TsvParser</a></dt>
@@ -42937,15 +42945,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/exceptions/IllegalArgumentIOException.html#IllegalArgumentIOException(java.lang.Throwable)">IllegalArgumentIOException(Throwable)</a></span> - Constructor for exception org.apache.hadoop.hbase.exceptions.<a href="./org/apache/hadoop/hbase/exceptions/IllegalArgumentIOException.html" title="class in org.apache.hadoop.hbase.exceptions">IllegalArgumentIOException</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="strong"><a href="./org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)">immediateAssignment(List&lt;HRegionInfo&gt;, List&lt;ServerName&gt;)</a></span> - Method in class 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></dt>
-<dd>
-<div class="block">Generates an immediate assignment plan to be used by a new master for
- regions in transition that do not have an already known destination.</div>
-</dd>
-<dt><span class="strong"><a href="./org/apache/hadoop/hbase/master/LoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)">immediateAssignment(List&lt;HRegionInfo&gt;, List&lt;ServerName&gt;)</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">Sync assign a region</div>
-</dd>
 <dt><a href="./org/apache/hadoop/hbase/io/ImmutableBytesWritable.html" title="class in org.apache.hadoop.hbase.io"><span class="strong">ImmutableBytesWritable</span></a> - Class in <a href="./org/apache/hadoop/hbase/io/package-summary.html">org.apache.hadoop.hbase.io</a></dt>
 <dd>
 <div class="block">A byte sequence that is usable as a key or value.</div>
@@ -92328,6 +92327,10 @@ the order they are declared.</div>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#WALEdit(boolean)">WALEdit(boolean)</a></span> - Constructor for class org.apache.hadoop.hbase.regionserver.wal.<a href="./org/apache/hadoop/hbase/regionserver/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALEdit</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#WALEdit(int)">WALEdit(int)</a></span> - Constructor for class org.apache.hadoop.hbase.regionserver.wal.<a href="./org/apache/hadoop/hbase/regionserver/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALEdit</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/wal/WALEdit.html#WALEdit(int,%20boolean)">WALEdit(int, boolean)</a></span> - Constructor for class org.apache.hadoop.hbase.regionserver.wal.<a href="./org/apache/hadoop/hbase/regionserver/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALEdit</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#walEditsFromCoprocessors">walEditsFromCoprocessors</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html#walEditsFromCoprocessors">walEditsFromCoprocessors</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/class-use/HBaseIOException.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/class-use/HBaseIOException.html b/devapidocs/org/apache/hadoop/hbase/class-use/HBaseIOException.html
index 28dced9..2a15425 100644
--- a/devapidocs/org/apache/hadoop/hbase/class-use/HBaseIOException.html
+++ b/devapidocs/org/apache/hadoop/hbase/class-use/HBaseIOException.html
@@ -563,38 +563,31 @@
                           boolean&nbsp;forceNewPlan)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
-<td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)">immediateAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
-                                      <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
-<div class="block">Sync assign a region</div>
-</td>
-</tr>
-<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#initialize()">initialize</a></strong>()</code>
 <div class="block">Initialize the load balancer.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><span class="strong">HMaster.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#move(byte[],%20byte[])">move</a></strong>(byte[]&nbsp;encodedRegionName,
         byte[]&nbsp;destServerName)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></code></td>
 <td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#randomAssignment(org.apache.hadoop.hbase.HRegionInfo,%20java.util.List)">randomAssignment</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Get a random region server from the list</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Assign regions to the previously hosting region server</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#roundRobinAssignment(java.util.List,%20java.util.List)">roundRobinAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                         <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>


[29/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html
index ccccc8d..d2f53d2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html
@@ -89,16 +89,16 @@
 <span class="sourceLineNo">081</span>      return UNKNOWN_RACK;<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">084</span><a name="line.84"></a>
 <span class="sourceLineNo">085</span>  /**<a name="line.85"></a>
 <span class="sourceLineNo">086</span>   * The constructor that uses the basic MetricsBalancer<a name="line.86"></a>
 <span class="sourceLineNo">087</span>   */<a name="line.87"></a>
 <span class="sourceLineNo">088</span>  protected BaseLoadBalancer() {<a name="line.88"></a>
 <span class="sourceLineNo">089</span>    metricsBalancer = new MetricsBalancer();<a name="line.89"></a>
 <span class="sourceLineNo">090</span>  }<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  <a name="line.91"></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>   * This Constructor accepts an instance of MetricsBalancer, <a name="line.93"></a>
+<span class="sourceLineNo">093</span>   * This Constructor accepts an instance of MetricsBalancer,<a name="line.93"></a>
 <span class="sourceLineNo">094</span>   * which will be used instead of creating a new one<a name="line.94"></a>
 <span class="sourceLineNo">095</span>   */<a name="line.95"></a>
 <span class="sourceLineNo">096</span>  protected BaseLoadBalancer(MetricsBalancer metricsBalancer) {<a name="line.96"></a>
@@ -1287,284 +1287,251 @@
 <span class="sourceLineNo">1279</span>  }<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>   * Generates an immediate assignment plan to be used by a new master for<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   * regions in transition that do not have an already known destination.<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>   *<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>   * Takes a list of regions that need immediate assignment and a list of all<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>   * available servers. Returns a map of regions to the server they should be<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * assigned to.<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   *<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   * This method will return quickly and does not do any intelligent balancing.<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>   * The goal is to make a fast decision not the best decision possible.<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>   *<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>   * Currently this is random.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>   *<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>   * @param regions<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>   * @param servers<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>   * @return map of regions to the server it should be assigned to<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>  public Map&lt;HRegionInfo, ServerName&gt; immediateAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      List&lt;ServerName&gt; servers) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    metricsBalancer.incrMiscInvocations();<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    if (servers == null || servers.isEmpty()) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      LOG.warn("Wanted to do random assignment but no servers to assign to");<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      return null;<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>    Map&lt;HRegionInfo, ServerName&gt; assignments = new TreeMap&lt;HRegionInfo, ServerName&gt;();<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    for (HRegionInfo region : regions) {<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>      assignments.put(region, randomAssignment(region, servers));<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    }<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    return assignments;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>  }<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span><a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>  /**<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>   * Used to assign a single region to a random server.<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>   */<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>  @Override<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>  public ServerName randomAssignment(HRegionInfo regionInfo, List&lt;ServerName&gt; servers) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    metricsBalancer.incrMiscInvocations();<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>        return masterServerName;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      }<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      // Guarantee not to put other regions on master<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      servers.remove(masterServerName);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    }<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span><a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>    if (numServers == 0) {<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      return null;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>    }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      return servers.get(0);<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>    List&lt;HRegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    return randomAssignment(cluster, regionInfo, servers);<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>  }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span><a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  /**<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>   * available/online servers available for assignment.<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>   * &lt;p&gt;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   * completely balanced.<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>   * &lt;p&gt;<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * assigned randomly to available servers.<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   *<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * @param regions regions and existing assignment from meta<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * @param servers available servers<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * @return map of servers and regions to be assigned to them<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   */<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>  @Override<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; retainAssignment(Map&lt;HRegionInfo, ServerName&gt; regions,<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      List&lt;ServerName&gt; servers) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    // Update metrics<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    metricsBalancer.incrMiscInvocations();<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      = assignMasterRegions(regions.keySet(), servers);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      // Guarantee not to put other regions on master<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      servers.remove(masterServerName);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      if (!masterRegions.isEmpty()) {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>        regions = new HashMap&lt;HRegionInfo, ServerName&gt;(regions);<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        for (HRegionInfo region: masterRegions) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>          regions.remove(region);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    if (regions == null || regions.isEmpty()) {<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      return assignments;<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
+<span class="sourceLineNo">1282</span>   * Used to assign a single region to a random server.<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>   */<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>  @Override<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>  public ServerName randomAssignment(HRegionInfo regionInfo, List&lt;ServerName&gt; servers) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>    metricsBalancer.incrMiscInvocations();<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        return masterServerName;<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      // Guarantee not to put other regions on master<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      servers.remove(masterServerName);<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span><a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>    if (numServers == 0) {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      return null;<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      return servers.get(0);<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>    List&lt;HRegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    return randomAssignment(cluster, regionInfo, servers);<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>  }<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span><a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  /**<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>   * available/online servers available for assignment.<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>   * &lt;p&gt;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>   * completely balanced.<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>   * &lt;p&gt;<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>   * assigned randomly to available servers.<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>   *<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>   * @param regions regions and existing assignment from meta<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>   * @param servers available servers<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>   * @return map of servers and regions to be assigned to them<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   */<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>  @Override<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; retainAssignment(Map&lt;HRegionInfo, ServerName&gt; regions,<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      List&lt;ServerName&gt; servers) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>    // Update metrics<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    metricsBalancer.incrMiscInvocations();<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      = assignMasterRegions(regions.keySet(), servers);<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      // Guarantee not to put other regions on master<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      servers.remove(masterServerName);<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      if (!masterRegions.isEmpty()) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        regions = new HashMap&lt;HRegionInfo, ServerName&gt;(regions);<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        for (HRegionInfo region: masterRegions) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          regions.remove(region);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    if (regions == null || regions.isEmpty()) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>      return assignments;<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    }<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    if (numServers == 0) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>      return null;<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      ServerName server = servers.get(0);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions.keySet()));<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>      return assignments;<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    }<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span><a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    // Group all of the old assignments by their hostname.<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    // We can't group directly by ServerName since the servers all have<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    // new start-codes.<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>    // servers on the same host on different ports.<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    for (ServerName server : servers) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>      serversByHostname.put(server.getHostname(), server);<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>    // Collection of the hostnames that used to have regions<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    // assigned, but for which we no longer have any RS running<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>    // after the cluster restart.<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span><a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    int numRandomAssignments = 0;<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    int numRetainedAssigments = 0;<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span><a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1381"></a>
 <span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    if (numServers == 0) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      return null;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    }<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      ServerName server = servers.get(0);<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions.keySet()));<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return assignments;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span><a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    // Group all of the old assignments by their hostname.<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    // We can't group directly by ServerName since the servers all have<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>    // new start-codes.<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span><a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    // servers on the same host on different ports.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    for (ServerName server : servers) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      serversByHostname.put(server.getHostname(), server);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    // Collection of the hostnames that used to have regions<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    // assigned, but for which we no longer have any RS running<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    // after the cluster restart.<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    int numRandomAssignments = 0;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    int numRetainedAssigments = 0;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span><a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    for (Map.Entry&lt;HRegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      HRegionInfo region = entry.getKey();<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>      ServerName oldServerName = entry.getValue();<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;ServerName&gt;();<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      if (oldServerName != null) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        localServers = serversByHostname.get(oldServerName.getHostname());<a name="line.1421"></a>
+<span class="sourceLineNo">1383</span>    for (Map.Entry&lt;HRegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      HRegionInfo region = entry.getKey();<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      ServerName oldServerName = entry.getValue();<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;ServerName&gt;();<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      if (oldServerName != null) {<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        localServers = serversByHostname.get(oldServerName.getHostname());<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      }<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      if (localServers.isEmpty()) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>        // No servers on the new cluster match up with this hostname,<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>        // assign randomly.<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>        ServerName randomServer = randomAssignment(cluster, region, servers);<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>        assignments.get(randomServer).add(region);<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        numRandomAssignments++;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        if (oldServerName != null) oldHostsNoLongerPresent.add(oldServerName.getHostname());<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      } else if (localServers.size() == 1) {<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>        // the usual case - one new server on same host<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>        ServerName target = localServers.get(0);<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>        assignments.get(target).add(region);<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>        cluster.doAssignRegion(region, target);<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>        numRetainedAssigments++;<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      } else {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>        // multiple new servers in the cluster on this same host<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        if (localServers.contains(oldServerName)) {<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>          assignments.get(oldServerName).add(region);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>          cluster.doAssignRegion(region, oldServerName);<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        } else {<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>          ServerName target = null;<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>          for (ServerName tmp: localServers) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>              target = tmp;<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>              break;<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>            }<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>          }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>          if (target == null) {<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>            target = randomAssignment(cluster, region, localServers);<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>          }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>          assignments.get(target).add(region);<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>        }<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>        numRetainedAssigments++;<a name="line.1421"></a>
 <span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      if (localServers.isEmpty()) {<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        // No servers on the new cluster match up with this hostname,<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>        // assign randomly.<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>        ServerName randomServer = randomAssignment(cluster, region, servers);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        assignments.get(randomServer).add(region);<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>        numRandomAssignments++;<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>        if (oldServerName != null) oldHostsNoLongerPresent.add(oldServerName.getHostname());<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      } else if (localServers.size() == 1) {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        // the usual case - one new server on same host<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>        ServerName target = localServers.get(0);<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        assignments.get(target).add(region);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>        cluster.doAssignRegion(region, target);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>        numRetainedAssigments++;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      } else {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        // multiple new servers in the cluster on this same host<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        if (localServers.contains(oldServerName)) {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>          assignments.get(oldServerName).add(region);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>          cluster.doAssignRegion(region, oldServerName);<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        } else {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>          ServerName target = null;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>          for (ServerName tmp: localServers) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>              target = tmp;<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>              break;<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>            }<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          }<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          if (target == null) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            target = randomAssignment(cluster, region, localServers);<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>          }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>          assignments.get(target).add(region);<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>        }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>        numRetainedAssigments++;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    }<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span><a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    String randomAssignMsg = "";<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>    if (numRandomAssignments &gt; 0) {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      randomAssignMsg =<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>          numRandomAssignments + " regions were assigned "<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<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>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    return assignments;<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  }<a name="line.1470"></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>    String randomAssignMsg = "";<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>    if (numRandomAssignments &gt; 0) {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      randomAssignMsg =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>          numRandomAssignments + " regions were assigned "<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    }<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    return assignments;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>  }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span><a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>  @Override<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>  public void initialize() throws HBaseIOException{<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>  }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span><a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>  @Override<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>  public void regionOnline(HRegionInfo regionInfo, ServerName sn) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>  }<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span><a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>  @Override<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>  public void regionOffline(HRegionInfo regionInfo) {<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>  @Override<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>  public boolean isStopped() {<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    return stopped;<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>  }<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span><a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>  @Override<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>  public void stop(String why) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    stopped = true;<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>  }<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span><a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>  /**<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>   * Used to assign a single region to a random server.<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>   */<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>  private ServerName randomAssignment(Cluster cluster, HRegionInfo regionInfo,<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>      List&lt;ServerName&gt; servers) {<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    ServerName sn = null;<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    final int maxIterations = numServers * 4;<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    int iterations = 0;<a name="line.1470"></a>
 <span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  @Override<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  public void initialize() throws HBaseIOException{<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>  }<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span><a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>  @Override<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>  public void regionOnline(HRegionInfo regionInfo, ServerName sn) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>  }<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>  @Override<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>  public void regionOffline(HRegionInfo regionInfo) {<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>  public boolean isStopped() {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>    return stopped;<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>  @Override<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  public void stop(String why) {<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>    stopped = true;<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>  }<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span><a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>  /**<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>   * Used to assign a single region to a random server.<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>   */<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>  private ServerName randomAssignment(Cluster cluster, HRegionInfo regionInfo,<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>      List&lt;ServerName&gt; servers) {<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>    ServerName sn = null;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>    final int maxIterations = numServers * 4;<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    int iterations = 0;<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    do {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>      int i = RANDOM.nextInt(numServers);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      sn = servers.get(i);<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    return sn;<a name="line.1511"></a>
+<span class="sourceLineNo">1472</span>    do {<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      int i = RANDOM.nextInt(numServers);<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      sn = servers.get(i);<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>    return sn;<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>  /**<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>   * Round robin a list of regions to a list of servers<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>   */<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>  private void roundRobinAssignment(Cluster cluster, List&lt;HRegionInfo&gt; regions,<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      List&lt;HRegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments) {<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>    int numServers = servers.size();<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    int numRegions = regions.size();<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>    int serverIdx = 0;<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    if (numServers &gt; 1) {<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    }<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    int regionIdx = 0;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      List&lt;HRegionInfo&gt; serverRegions = new ArrayList&lt;HRegionInfo&gt;(max);<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>        HRegionInfo region = regions.get(i % numRegions);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>          unassignedRegions.add(region);<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>        } else {<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>          serverRegions.add(region);<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>          cluster.doAssignRegion(region, server);<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>      assignments.put(server, serverRegions);<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      regionIdx++;<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    }<a name="line.1511"></a>
 <span class="sourceLineNo">1512</span>  }<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>
-<span class="sourceLineNo">1515</span>   * Round robin a list of regions to a list of servers<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>   */<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>  private void roundRobinAssignment(Cluster cluster, List&lt;HRegionInfo&gt; regions,<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>      List&lt;HRegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments) {<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span><a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    int numServers = servers.size();<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    int numRegions = regions.size();<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    int serverIdx = 0;<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    if (numServers &gt; 1) {<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    }<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>    int regionIdx = 0;<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span><a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>      List&lt;HRegionInfo&gt; serverRegions = new ArrayList&lt;HRegionInfo&gt;(max);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>        HRegionInfo region = regions.get(i % numRegions);<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>          unassignedRegions.add(region);<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>        } else {<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>          serverRegions.add(region);<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>          cluster.doAssignRegion(region, server);<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>        }<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      }<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      assignments.put(server, serverRegions);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>      regionIdx++;<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    }<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>  }<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span><a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>    Collection&lt;HRegionInfo&gt; regions) {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    } else {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      return new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    }<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>  }<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span><a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>  @Override<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>  }<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>}<a name="line.1559"></a>
+<span class="sourceLineNo">1514</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>    Collection&lt;HRegionInfo&gt; regions) {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    } else {<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>      return new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    }<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>  }<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span><a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>  @Override<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>  }<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>}<a name="line.1526"></a>
 
 
 


[30/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
index ccccc8d..d2f53d2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.html
@@ -89,16 +89,16 @@
 <span class="sourceLineNo">081</span>      return UNKNOWN_RACK;<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">084</span><a name="line.84"></a>
 <span class="sourceLineNo">085</span>  /**<a name="line.85"></a>
 <span class="sourceLineNo">086</span>   * The constructor that uses the basic MetricsBalancer<a name="line.86"></a>
 <span class="sourceLineNo">087</span>   */<a name="line.87"></a>
 <span class="sourceLineNo">088</span>  protected BaseLoadBalancer() {<a name="line.88"></a>
 <span class="sourceLineNo">089</span>    metricsBalancer = new MetricsBalancer();<a name="line.89"></a>
 <span class="sourceLineNo">090</span>  }<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  <a name="line.91"></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>   * This Constructor accepts an instance of MetricsBalancer, <a name="line.93"></a>
+<span class="sourceLineNo">093</span>   * This Constructor accepts an instance of MetricsBalancer,<a name="line.93"></a>
 <span class="sourceLineNo">094</span>   * which will be used instead of creating a new one<a name="line.94"></a>
 <span class="sourceLineNo">095</span>   */<a name="line.95"></a>
 <span class="sourceLineNo">096</span>  protected BaseLoadBalancer(MetricsBalancer metricsBalancer) {<a name="line.96"></a>
@@ -1287,284 +1287,251 @@
 <span class="sourceLineNo">1279</span>  }<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>   * Generates an immediate assignment plan to be used by a new master for<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   * regions in transition that do not have an already known destination.<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>   *<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>   * Takes a list of regions that need immediate assignment and a list of all<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>   * available servers. Returns a map of regions to the server they should be<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * assigned to.<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   *<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   * This method will return quickly and does not do any intelligent balancing.<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>   * The goal is to make a fast decision not the best decision possible.<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>   *<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>   * Currently this is random.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>   *<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>   * @param regions<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>   * @param servers<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>   * @return map of regions to the server it should be assigned to<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>  public Map&lt;HRegionInfo, ServerName&gt; immediateAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      List&lt;ServerName&gt; servers) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    metricsBalancer.incrMiscInvocations();<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    if (servers == null || servers.isEmpty()) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      LOG.warn("Wanted to do random assignment but no servers to assign to");<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      return null;<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>    Map&lt;HRegionInfo, ServerName&gt; assignments = new TreeMap&lt;HRegionInfo, ServerName&gt;();<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    for (HRegionInfo region : regions) {<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>      assignments.put(region, randomAssignment(region, servers));<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    }<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    return assignments;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>  }<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span><a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>  /**<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>   * Used to assign a single region to a random server.<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>   */<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>  @Override<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>  public ServerName randomAssignment(HRegionInfo regionInfo, List&lt;ServerName&gt; servers) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    metricsBalancer.incrMiscInvocations();<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>        return masterServerName;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      }<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      // Guarantee not to put other regions on master<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      servers.remove(masterServerName);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    }<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span><a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>    if (numServers == 0) {<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      return null;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>    }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      return servers.get(0);<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>    List&lt;HRegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    return randomAssignment(cluster, regionInfo, servers);<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>  }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span><a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  /**<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>   * available/online servers available for assignment.<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>   * &lt;p&gt;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   * completely balanced.<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>   * &lt;p&gt;<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * assigned randomly to available servers.<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   *<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * @param regions regions and existing assignment from meta<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * @param servers available servers<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * @return map of servers and regions to be assigned to them<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   */<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>  @Override<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; retainAssignment(Map&lt;HRegionInfo, ServerName&gt; regions,<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      List&lt;ServerName&gt; servers) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    // Update metrics<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    metricsBalancer.incrMiscInvocations();<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      = assignMasterRegions(regions.keySet(), servers);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      // Guarantee not to put other regions on master<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      servers.remove(masterServerName);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      if (!masterRegions.isEmpty()) {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>        regions = new HashMap&lt;HRegionInfo, ServerName&gt;(regions);<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        for (HRegionInfo region: masterRegions) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>          regions.remove(region);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    if (regions == null || regions.isEmpty()) {<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      return assignments;<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
+<span class="sourceLineNo">1282</span>   * Used to assign a single region to a random server.<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>   */<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>  @Override<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>  public ServerName randomAssignment(HRegionInfo regionInfo, List&lt;ServerName&gt; servers) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>    metricsBalancer.incrMiscInvocations();<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        return masterServerName;<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      // Guarantee not to put other regions on master<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      servers.remove(masterServerName);<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span><a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>    if (numServers == 0) {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      return null;<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      return servers.get(0);<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>    List&lt;HRegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    return randomAssignment(cluster, regionInfo, servers);<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>  }<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span><a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  /**<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>   * available/online servers available for assignment.<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>   * &lt;p&gt;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>   * completely balanced.<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>   * &lt;p&gt;<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>   * assigned randomly to available servers.<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>   *<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>   * @param regions regions and existing assignment from meta<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>   * @param servers available servers<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>   * @return map of servers and regions to be assigned to them<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   */<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>  @Override<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; retainAssignment(Map&lt;HRegionInfo, ServerName&gt; regions,<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      List&lt;ServerName&gt; servers) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>    // Update metrics<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    metricsBalancer.incrMiscInvocations();<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      = assignMasterRegions(regions.keySet(), servers);<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      // Guarantee not to put other regions on master<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      servers.remove(masterServerName);<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      if (!masterRegions.isEmpty()) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        regions = new HashMap&lt;HRegionInfo, ServerName&gt;(regions);<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        for (HRegionInfo region: masterRegions) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          regions.remove(region);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    if (regions == null || regions.isEmpty()) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>      return assignments;<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    }<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    if (numServers == 0) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>      return null;<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      ServerName server = servers.get(0);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions.keySet()));<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>      return assignments;<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    }<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span><a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    // Group all of the old assignments by their hostname.<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    // We can't group directly by ServerName since the servers all have<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    // new start-codes.<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>    // servers on the same host on different ports.<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    for (ServerName server : servers) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>      serversByHostname.put(server.getHostname(), server);<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>    // Collection of the hostnames that used to have regions<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    // assigned, but for which we no longer have any RS running<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>    // after the cluster restart.<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span><a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    int numRandomAssignments = 0;<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    int numRetainedAssigments = 0;<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span><a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1381"></a>
 <span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    if (numServers == 0) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      return null;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    }<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      ServerName server = servers.get(0);<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions.keySet()));<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return assignments;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span><a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    // Group all of the old assignments by their hostname.<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    // We can't group directly by ServerName since the servers all have<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>    // new start-codes.<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span><a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    // servers on the same host on different ports.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    for (ServerName server : servers) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      serversByHostname.put(server.getHostname(), server);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    // Collection of the hostnames that used to have regions<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    // assigned, but for which we no longer have any RS running<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    // after the cluster restart.<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    int numRandomAssignments = 0;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    int numRetainedAssigments = 0;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span><a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    for (Map.Entry&lt;HRegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      HRegionInfo region = entry.getKey();<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>      ServerName oldServerName = entry.getValue();<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;ServerName&gt;();<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      if (oldServerName != null) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        localServers = serversByHostname.get(oldServerName.getHostname());<a name="line.1421"></a>
+<span class="sourceLineNo">1383</span>    for (Map.Entry&lt;HRegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      HRegionInfo region = entry.getKey();<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      ServerName oldServerName = entry.getValue();<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;ServerName&gt;();<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      if (oldServerName != null) {<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        localServers = serversByHostname.get(oldServerName.getHostname());<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      }<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      if (localServers.isEmpty()) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>        // No servers on the new cluster match up with this hostname,<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>        // assign randomly.<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>        ServerName randomServer = randomAssignment(cluster, region, servers);<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>        assignments.get(randomServer).add(region);<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        numRandomAssignments++;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        if (oldServerName != null) oldHostsNoLongerPresent.add(oldServerName.getHostname());<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      } else if (localServers.size() == 1) {<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>        // the usual case - one new server on same host<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>        ServerName target = localServers.get(0);<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>        assignments.get(target).add(region);<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>        cluster.doAssignRegion(region, target);<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>        numRetainedAssigments++;<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      } else {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>        // multiple new servers in the cluster on this same host<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        if (localServers.contains(oldServerName)) {<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>          assignments.get(oldServerName).add(region);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>          cluster.doAssignRegion(region, oldServerName);<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        } else {<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>          ServerName target = null;<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>          for (ServerName tmp: localServers) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>              target = tmp;<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>              break;<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>            }<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>          }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>          if (target == null) {<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>            target = randomAssignment(cluster, region, localServers);<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>          }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>          assignments.get(target).add(region);<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>        }<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>        numRetainedAssigments++;<a name="line.1421"></a>
 <span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      if (localServers.isEmpty()) {<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        // No servers on the new cluster match up with this hostname,<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>        // assign randomly.<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>        ServerName randomServer = randomAssignment(cluster, region, servers);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        assignments.get(randomServer).add(region);<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>        numRandomAssignments++;<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>        if (oldServerName != null) oldHostsNoLongerPresent.add(oldServerName.getHostname());<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      } else if (localServers.size() == 1) {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        // the usual case - one new server on same host<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>        ServerName target = localServers.get(0);<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        assignments.get(target).add(region);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>        cluster.doAssignRegion(region, target);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>        numRetainedAssigments++;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      } else {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        // multiple new servers in the cluster on this same host<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        if (localServers.contains(oldServerName)) {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>          assignments.get(oldServerName).add(region);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>          cluster.doAssignRegion(region, oldServerName);<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        } else {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>          ServerName target = null;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>          for (ServerName tmp: localServers) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>              target = tmp;<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>              break;<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>            }<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          }<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          if (target == null) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            target = randomAssignment(cluster, region, localServers);<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>          }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>          assignments.get(target).add(region);<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>        }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>        numRetainedAssigments++;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    }<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span><a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    String randomAssignMsg = "";<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>    if (numRandomAssignments &gt; 0) {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      randomAssignMsg =<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>          numRandomAssignments + " regions were assigned "<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<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>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    return assignments;<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  }<a name="line.1470"></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>    String randomAssignMsg = "";<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>    if (numRandomAssignments &gt; 0) {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      randomAssignMsg =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>          numRandomAssignments + " regions were assigned "<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    }<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    return assignments;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>  }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span><a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>  @Override<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>  public void initialize() throws HBaseIOException{<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>  }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span><a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>  @Override<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>  public void regionOnline(HRegionInfo regionInfo, ServerName sn) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>  }<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span><a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>  @Override<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>  public void regionOffline(HRegionInfo regionInfo) {<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>  @Override<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>  public boolean isStopped() {<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    return stopped;<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>  }<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span><a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>  @Override<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>  public void stop(String why) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    stopped = true;<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>  }<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span><a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>  /**<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>   * Used to assign a single region to a random server.<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>   */<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>  private ServerName randomAssignment(Cluster cluster, HRegionInfo regionInfo,<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>      List&lt;ServerName&gt; servers) {<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    ServerName sn = null;<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    final int maxIterations = numServers * 4;<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    int iterations = 0;<a name="line.1470"></a>
 <span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  @Override<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  public void initialize() throws HBaseIOException{<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>  }<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span><a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>  @Override<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>  public void regionOnline(HRegionInfo regionInfo, ServerName sn) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>  }<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>  @Override<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>  public void regionOffline(HRegionInfo regionInfo) {<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>  public boolean isStopped() {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>    return stopped;<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>  @Override<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  public void stop(String why) {<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>    stopped = true;<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>  }<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span><a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>  /**<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>   * Used to assign a single region to a random server.<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>   */<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>  private ServerName randomAssignment(Cluster cluster, HRegionInfo regionInfo,<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>      List&lt;ServerName&gt; servers) {<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>    ServerName sn = null;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>    final int maxIterations = numServers * 4;<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    int iterations = 0;<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    do {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>      int i = RANDOM.nextInt(numServers);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      sn = servers.get(i);<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    return sn;<a name="line.1511"></a>
+<span class="sourceLineNo">1472</span>    do {<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      int i = RANDOM.nextInt(numServers);<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      sn = servers.get(i);<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>    return sn;<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>  /**<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>   * Round robin a list of regions to a list of servers<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>   */<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>  private void roundRobinAssignment(Cluster cluster, List&lt;HRegionInfo&gt; regions,<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      List&lt;HRegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments) {<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>    int numServers = servers.size();<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    int numRegions = regions.size();<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>    int serverIdx = 0;<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    if (numServers &gt; 1) {<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    }<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    int regionIdx = 0;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      List&lt;HRegionInfo&gt; serverRegions = new ArrayList&lt;HRegionInfo&gt;(max);<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>        HRegionInfo region = regions.get(i % numRegions);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>          unassignedRegions.add(region);<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>        } else {<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>          serverRegions.add(region);<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>          cluster.doAssignRegion(region, server);<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>      assignments.put(server, serverRegions);<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      regionIdx++;<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    }<a name="line.1511"></a>
 <span class="sourceLineNo">1512</span>  }<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>
-<span class="sourceLineNo">1515</span>   * Round robin a list of regions to a list of servers<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>   */<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>  private void roundRobinAssignment(Cluster cluster, List&lt;HRegionInfo&gt; regions,<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>      List&lt;HRegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments) {<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span><a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    int numServers = servers.size();<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    int numRegions = regions.size();<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    int serverIdx = 0;<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    if (numServers &gt; 1) {<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    }<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>    int regionIdx = 0;<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span><a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>      List&lt;HRegionInfo&gt; serverRegions = new ArrayList&lt;HRegionInfo&gt;(max);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>        HRegionInfo region = regions.get(i % numRegions);<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>          unassignedRegions.add(region);<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>        } else {<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>          serverRegions.add(region);<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>          cluster.doAssignRegion(region, server);<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>        }<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      }<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      assignments.put(server, serverRegions);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>      regionIdx++;<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    }<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>  }<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span><a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>    Collection&lt;HRegionInfo&gt; regions) {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    } else {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      return new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    }<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>  }<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span><a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>  @Override<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>  }<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>}<a name="line.1559"></a>
+<span class="sourceLineNo">1514</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>    Collection&lt;HRegionInfo&gt; regions) {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    } else {<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>      return new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    }<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>  }<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span><a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>  @Override<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>  }<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>}<a name="line.1526"></a>
 
 
 


[42/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
index 59e8347..daf2a53 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
@@ -99,7 +99,7 @@
 </dl>
 <hr>
 <br>
-<pre> class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5126">HRegion.RowLockContext</a>
+<pre> class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5138">HRegion.RowLockContext</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -219,7 +219,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>row</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5127">row</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5139">row</a></pre>
 </li>
 </ul>
 <a name="readWriteLock">
@@ -228,7 +228,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>readWriteLock</h4>
-<pre>final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReadWriteLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5128">readWriteLock</a></pre>
+<pre>final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReadWriteLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5140">readWriteLock</a></pre>
 </li>
 </ul>
 <a name="usable">
@@ -237,7 +237,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>usable</h4>
-<pre>final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5129">usable</a></pre>
+<pre>final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5141">usable</a></pre>
 </li>
 </ul>
 <a name="count">
@@ -246,7 +246,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>count</h4>
-<pre>final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5130">count</a></pre>
+<pre>final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5142">count</a></pre>
 </li>
 </ul>
 <a name="lock">
@@ -255,7 +255,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>lock</h4>
-<pre>final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5131">lock</a></pre>
+<pre>final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5143">lock</a></pre>
 </li>
 </ul>
 </li>
@@ -272,7 +272,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HRegion.RowLockContext</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5133">HRegion.RowLockContext</a>(<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a>&nbsp;row)</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5145">HRegion.RowLockContext</a>(<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a>&nbsp;row)</pre>
 </li>
 </ul>
 </li>
@@ -289,7 +289,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>newWriteLock</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5137">newWriteLock</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5149">newWriteLock</a>()</pre>
 </li>
 </ul>
 <a name="newReadLock()">
@@ -298,7 +298,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>newReadLock</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5141">newReadLock</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5153">newReadLock</a>()</pre>
 </li>
 </ul>
 <a name="getRowLock(java.util.concurrent.locks.Lock)">
@@ -307,7 +307,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getRowLock</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5146">getRowLock</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;l)</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5158">getRowLock</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;l)</pre>
 </li>
 </ul>
 <a name="cleanUp()">
@@ -316,7 +316,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanUp</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5157">cleanUp</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5169">cleanUp</a>()</pre>
 </li>
 </ul>
 <a name="toString()">
@@ -325,7 +325,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/regionserver/HRegion.RowLockContext.html#line.5171">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/regionserver/HRegion.RowLockContext.html#line.5183">toString</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
index 3b0479d..b9f324c 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
@@ -103,7 +103,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5183">HRegion.RowLockImpl</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5195">HRegion.RowLockImpl</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a></pre>
 <div class="block">Class used to represent a lock on a row.</div>
@@ -212,7 +212,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockList">
 <li class="blockList">
 <h4>context</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5184">context</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5196">context</a></pre>
 </li>
 </ul>
 <a name="lock">
@@ -221,7 +221,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockListLast">
 <li class="blockList">
 <h4>lock</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5185">lock</a></pre>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5197">lock</a></pre>
 </li>
 </ul>
 </li>
@@ -238,7 +238,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HRegion.RowLockImpl</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5187">HRegion.RowLockImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&nbsp;context,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5199">HRegion.RowLockImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&nbsp;context,
                    <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;lock)</pre>
 </li>
 </ul>
@@ -256,7 +256,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockList">
 <li class="blockList">
 <h4>getLock</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5192">getLock</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5204">getLock</a>()</pre>
 </li>
 </ul>
 <a name="getContext()">
@@ -265,7 +265,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockList">
 <li class="blockList">
 <h4>getContext</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5197">getContext</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5209">getContext</a>()</pre>
 </li>
 </ul>
 <a name="release()">
@@ -274,7 +274,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockList">
 <li class="blockList">
 <h4>release</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5202">release</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5214">release</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html#release()">Region.RowLock</a></code></strong></div>
 <div class="block">Release the given lock.  If there are no remaining locks held by the current thread
  then unlock the row and allow other threads to acquire the lock.</div>
@@ -290,7 +290,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/regionserver/HRegion.RowLockImpl.html#line.5208">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/regionserver/HRegion.RowLockImpl.html#line.5220">toString</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>


[03/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
index d3abe39..c51826f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.StdOutSink.html
@@ -615,9 +615,9 @@
 <span class="sourceLineNo">607</span>            if (this.failOnError &amp;&amp; monitor.hasError()) {<a name="line.607"></a>
 <span class="sourceLineNo">608</span>              monitorThread.interrupt();<a name="line.608"></a>
 <span class="sourceLineNo">609</span>              if (monitor.initialized) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>                System.exit(monitor.errorCode);<a name="line.610"></a>
+<span class="sourceLineNo">610</span>                return monitor.errorCode;<a name="line.610"></a>
 <span class="sourceLineNo">611</span>              } else {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.612"></a>
+<span class="sourceLineNo">612</span>                return INIT_ERROR_EXIT_CODE;<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>            currentTimeLength = System.currentTimeMillis() - startTime;<a name="line.615"></a>
@@ -626,630 +626,629 @@
 <span class="sourceLineNo">618</span>                  + ") after timeout limit:" + this.timeout<a name="line.618"></a>
 <span class="sourceLineNo">619</span>                  + " will be killed itself !!");<a name="line.619"></a>
 <span class="sourceLineNo">620</span>              if (monitor.initialized) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>                System.exit(TIMEOUT_ERROR_EXIT_CODE);<a name="line.621"></a>
+<span class="sourceLineNo">621</span>                return TIMEOUT_ERROR_EXIT_CODE;<a name="line.621"></a>
 <span class="sourceLineNo">622</span>              } else {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.623"></a>
+<span class="sourceLineNo">623</span>                return INIT_ERROR_EXIT_CODE;<a name="line.623"></a>
 <span class="sourceLineNo">624</span>              }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>              break;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>            monitorThread.interrupt();<a name="line.630"></a>
-<span class="sourceLineNo">631</span>            System.exit(monitor.errorCode);<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } finally {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          if (monitor != null) monitor.close();<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>        Thread.sleep(interval);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      } while (interval &gt; 0);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    } // try-with-resources close<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    if (choreService != null) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      choreService.shutdown();<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    return(monitor.errorCode);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>  }<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private void printUsageAndExit() {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    System.err.printf(<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        getClass().getName());<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    System.err.println(" where [opts] are:");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    System.err.println("   -help          Show this help and exit.");<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    System.err.println("      which means to enable regionserver mode");<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    System.err.println("      only works in regionserver mode.");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        " default is true");<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        + " Default is hbase:canary");<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    System.err<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * A Factory method for {@link Monitor}.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   * Can be overridden by user.<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param index a start index for monitor target<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param args args passed from user<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a Monitor instance<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   */<a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    Monitor monitor = null;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    String[] monitorTargets = null;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    if(index &gt;= 0) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int length = args.length - index;<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      monitorTargets = new String[length];<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>    if (this.regionServerMode) {<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      monitor =<a name="line.691"></a>
-<span class="sourceLineNo">692</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.693"></a>
-<span class="sourceLineNo">694</span>              this.treatFailureAsError);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    } else {<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      monitor =<a name="line.696"></a>
-<span class="sourceLineNo">697</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    return monitor;<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>  // a Monitor super-class can be extended by users<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>    protected Connection connection;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    protected Admin admin;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    protected String[] targets;<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    protected boolean useRegExp;<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    protected boolean treatFailureAsError;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    protected boolean initialized = false;<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    protected boolean done = false;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected int errorCode = 0;<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    protected Sink sink;<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    protected ExecutorService executor;<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>    public boolean isDone() {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return done;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    public boolean hasError() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return errorCode != 0;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span><a name="line.725"></a>
-<span class="sourceLineNo">726</span>    public boolean finalCheckForErrors() {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      if (errorCode != 0) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>        return true;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      return treatFailureAsError &amp;&amp;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>    @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    public void close() throws IOException {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (this.admin != null) this.admin.close();<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span><a name="line.738"></a>
-<span class="sourceLineNo">739</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      this.connection = connection;<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      this.targets = monitorTargets;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      this.useRegExp = useRegExp;<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.sink = sink;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      this.executor = executor;<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>    @Override<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    public abstract void run();<a name="line.752"></a>
-<span class="sourceLineNo">753</span><a name="line.753"></a>
-<span class="sourceLineNo">754</span>    protected boolean initAdmin() {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      if (null == this.admin) {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        try {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>          this.admin = this.connection.getAdmin();<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        } catch (Exception e) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>        }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      } else if (admin.isAborted()) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>        LOG.error("HBaseAdmin aborted");<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      }<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return !this.hasError();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
-<span class="sourceLineNo">769</span><a name="line.769"></a>
-<span class="sourceLineNo">770</span>  // a monitor for region mode<a name="line.770"></a>
-<span class="sourceLineNo">771</span>  private static class RegionMonitor extends Monitor {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    // 10 minutes<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    // 1 days<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>    private long lastCheckTime = -1;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private boolean writeSniffing;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    private TableName writeTableName;<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    private int writeDataTTL;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private float regionsLowerLimit;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    private float regionsUpperLimit;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    private int checkPeriod;<a name="line.783"></a>
-<span class="sourceLineNo">784</span><a name="line.784"></a>
-<span class="sourceLineNo">785</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        boolean treatFailureAsError) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      Configuration conf = connection.getConfiguration();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      this.writeSniffing = writeSniffing;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      this.writeTableName = writeTableName;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      this.writeDataTTL =<a name="line.792"></a>
-<span class="sourceLineNo">793</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      this.regionsLowerLimit =<a name="line.794"></a>
-<span class="sourceLineNo">795</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      this.regionsUpperLimit =<a name="line.796"></a>
-<span class="sourceLineNo">797</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      this.checkPeriod =<a name="line.798"></a>
-<span class="sourceLineNo">799</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.799"></a>
-<span class="sourceLineNo">800</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>    @Override<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    public void run() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      if (this.initAdmin()) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        try {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.809"></a>
-<span class="sourceLineNo">810</span>            this.initialized = true;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>            for (String table : tables) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.812"></a>
-<span class="sourceLineNo">813</span>            }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          } else {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>          }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>          if (writeSniffing) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>              try {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                checkWriteTableDistribution();<a name="line.821"></a>
-<span class="sourceLineNo">822</span>              } catch (IOException e) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.823"></a>
-<span class="sourceLineNo">824</span>              }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>            }<a name="line.826"></a>
-<span class="sourceLineNo">827</span>            // sniff canary table with write operation<a name="line.827"></a>
-<span class="sourceLineNo">828</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.828"></a>
-<span class="sourceLineNo">829</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>          }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            try {<a name="line.833"></a>
-<span class="sourceLineNo">834</span>              future.get();<a name="line.834"></a>
-<span class="sourceLineNo">835</span>            } catch (ExecutionException e) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>              LOG.error("Sniff region failed!", e);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>            }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          }<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        } catch (Exception e) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>          LOG.error("Run regionMonitor failed", e);<a name="line.840"></a>
-<span class="sourceLineNo">841</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      this.done = true;<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      String[] returnTables = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span><a name="line.849"></a>
-<span class="sourceLineNo">850</span>      if (this.useRegExp) {<a name="line.850"></a>
-<span class="sourceLineNo">851</span>        Pattern pattern = null;<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        HTableDescriptor[] tds = null;<a name="line.852"></a>
-<span class="sourceLineNo">853</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        try {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>          if (LOG.isDebugEnabled()) {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>            LOG.debug(String.format("reading list of tables"));<a name="line.856"></a>
-<span class="sourceLineNo">857</span>          }<a name="line.857"></a>
-<span class="sourceLineNo">858</span>          tds = this.admin.listTables(pattern);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>          if (tds == null) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>            tds = new HTableDescriptor[0];<a name="line.860"></a>
-<span class="sourceLineNo">861</span>          }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>          for (String monitorTarget : monitorTargets) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>            pattern = Pattern.compile(monitorTarget);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>            for (HTableDescriptor td : tds) {<a name="line.864"></a>
-<span class="sourceLineNo">865</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>                tmpTables.add(td.getNameAsString());<a name="line.866"></a>
-<span class="sourceLineNo">867</span>              }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>            }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>          }<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        } catch (IOException e) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          LOG.error("Communicate with admin failed", e);<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          throw e;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>        if (tmpTables.size() &gt; 0) {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>        } else {<a name="line.877"></a>
-<span class="sourceLineNo">878</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          LOG.error(msg);<a name="line.879"></a>
-<span class="sourceLineNo">880</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>          throw new TableNotFoundException(msg);<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        }<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      } else {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>        returnTables = monitorTargets;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>      return returnTables;<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    }<a name="line.888"></a>
-<span class="sourceLineNo">889</span><a name="line.889"></a>
-<span class="sourceLineNo">890</span>    /*<a name="line.890"></a>
-<span class="sourceLineNo">891</span>     * canary entry point to monitor all the tables.<a name="line.891"></a>
-<span class="sourceLineNo">892</span>     */<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType) throws Exception {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      if (LOG.isDebugEnabled()) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        LOG.debug(String.format("reading list of tables"));<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.899"></a>
-<span class="sourceLineNo">900</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        }<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      return taskFutures;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      if (!admin.tableExists(writeTableName)) {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>        int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.909"></a>
-<span class="sourceLineNo">910</span>        if (numberOfServers == 0) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>          throw new IllegalStateException("No live regionservers");<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        }<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        createWriteTable(numberOfServers);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        admin.enableTable(writeTableName);<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      }<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>      int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      List&lt;Pair&lt;HRegionInfo, ServerName&gt;&gt; pairs =<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      int numberOfRegions = pairs.size();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        admin.disableTable(writeTableName);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        admin.deleteTable(writeTableName);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        createWriteTable(numberOfServers);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;ServerName&gt;();<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      for (Pair&lt;HRegionInfo, ServerName&gt; pair : pairs) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        serverSet.add(pair.getSecond());<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      int numberOfCoveredServers = serverSet.size();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        admin.balancer();<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    }<a name="line.938"></a>
-<span class="sourceLineNo">939</span><a name="line.939"></a>
-<span class="sourceLineNo">940</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          + " and you can change it by config: "<a name="line.945"></a>
-<span class="sourceLineNo">946</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      family.setMaxVersions(1);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      family.setTimeToLive(writeDataTTL);<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      desc.addFamily(family);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      admin.createTable(desc, splits);<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    }<a name="line.955"></a>
-<span class="sourceLineNo">956</span>  }<a name="line.956"></a>
-<span class="sourceLineNo">957</span><a name="line.957"></a>
-<span class="sourceLineNo">958</span>  /**<a name="line.958"></a>
-<span class="sourceLineNo">959</span>   * Canary entry point for specified table.<a name="line.959"></a>
-<span class="sourceLineNo">960</span>   * @throws Exception<a name="line.960"></a>
-<span class="sourceLineNo">961</span>   */<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static void sniff(final Admin admin, TableName tableName)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      throws Exception {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    sniff(admin, tableName, TaskType.READ);<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>  /**<a name="line.967"></a>
-<span class="sourceLineNo">968</span>   * Canary entry point for specified table with task type(read/write)<a name="line.968"></a>
-<span class="sourceLineNo">969</span>   * @throws Exception<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   */<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  public static void sniff(final Admin admin, TableName tableName, TaskType taskType)<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      throws Exception {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    List&lt;Future&lt;Void&gt;&gt; taskFutures =<a name="line.973"></a>
-<span class="sourceLineNo">974</span>        Canary.sniff(admin, new StdOutSink(), tableName.getNameAsString(),<a name="line.974"></a>
-<span class="sourceLineNo">975</span>          new ScheduledThreadPoolExecutor(1), taskType);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    for (Future&lt;Void&gt; future : taskFutures) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      future.get();<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><a name="line.980"></a>
-<span class="sourceLineNo">981</span>  /**<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   * Canary entry point for specified table.<a name="line.982"></a>
-<span class="sourceLineNo">983</span>   * @throws Exception<a name="line.983"></a>
-<span class="sourceLineNo">984</span>   */<a name="line.984"></a>
-<span class="sourceLineNo">985</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      ExecutorService executor, TaskType taskType) throws Exception {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    if (LOG.isDebugEnabled()) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        tableName));<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        executor, taskType);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    } else {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  /*<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>   * Loops over regions that owns this table, and output some information abouts the state.<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType) throws Exception {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span><a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    if (LOG.isDebugEnabled()) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>    Table table = null;<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    try {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    } catch (TableNotFoundException e) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      return new ArrayList&lt;Future&lt;Void&gt;&gt;();<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;RegionTask&gt;();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    try {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      for (HRegionInfo region : admin.getTableRegions(tableDesc.getTableName())) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        tasks.add(new RegionTask(admin.getConnection(), region, sink, taskType));<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    } finally {<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      table.close();<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    return executor.invokeAll(tasks);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>  // a monitor for regionserver mode<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  private static class RegionServerMonitor extends Monitor {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    private boolean allRegions;<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    public RegionServerMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        ExtendedSink sink, ExecutorService executor, boolean allRegions,<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        boolean treatFailureAsError) {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      this.allRegions = allRegions;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span><a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    private ExtendedSink getSink() {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      return (ExtendedSink) this.sink;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span><a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    @Override<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    public void run() {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      if (this.initAdmin() &amp;&amp; this.checkNoTableNames()) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = this.filterRegionServerByName();<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        this.initialized = true;<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>        this.monitorRegionServers(rsAndRMap);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      this.done = true;<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>    private boolean checkNoTableNames() {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      List&lt;String&gt; foundTableNames = new ArrayList&lt;String&gt;();<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>      TableName[] tableNames = null;<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      if (LOG.isDebugEnabled()) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      try {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>        tableNames = this.admin.listTableNames();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      } catch (IOException e) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        LOG.error("Get listTableNames failed", e);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        return false;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      if (this.targets == null || this.targets.length == 0) return true;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      for (String target : this.targets) {<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        for (TableName tableName : tableNames) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          if (target.equals(tableName.getNameAsString())) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>            foundTableNames.add(target);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (foundTableNames.size() &gt; 0) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        System.err.println("Cannot pass a tablename when using the -regionserver " +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>            "option, tablenames:" + foundTableNames.toString());<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        this.errorCode = USAGE_EXIT_CODE;<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      }<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      return foundTableNames.size() == 0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    }<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span><a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    private void monitorRegionServers(Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      List&lt;RegionServerTask&gt; tasks = new ArrayList&lt;RegionServerTask&gt;();<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      Map&lt;String, AtomicLong&gt; successMap = new HashMap&lt;String, AtomicLong&gt;();<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      Random rand = new Random();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        String serverName = entry.getKey();<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        AtomicLong successes = new AtomicLong(0);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        successMap.put(serverName, successes);<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        if (this.allRegions) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>          for (HRegionInfo region : entry.getValue()) {<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            tasks.add(new RegionServerTask(this.connection,<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>                serverName,<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>                region,<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>                getSink(),<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>                successes));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>          }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        } else {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>          // random select a region if flag not set<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>          HRegionInfo region = entry.getValue().get(rand.nextInt(entry.getValue().size()));<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>          tasks.add(new RegionServerTask(this.connection,<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>              serverName,<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>              region,<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>              getSink(),<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>              successes));<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>        }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      }<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>      try {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>          try {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>            future.get();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          } catch (ExecutionException e) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.error("Sniff regionserver failed!", e);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        if (this.allRegions) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>            String serverName = entry.getKey();<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            LOG.info("Successfully read " + successMap.get(serverName) + " regions out of "<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>                    + entry.getValue().size() + " on regionserver:" + serverName);<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      } catch (InterruptedException e) {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        LOG.error("Sniff regionserver interrupted!", e);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      }<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>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; filterRegionServerByName() {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; regionServerAndRegionsMap = this.getAllRegionServerByName();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      regionServerAndRegionsMap = this.doFilterRegionServerByName(regionServerAndRegionsMap);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>      return regionServerAndRegionsMap;<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; getAllRegionServerByName() {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      Table table = null;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      RegionLocator regionLocator = null;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      try {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        if (LOG.isDebugEnabled()) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          LOG.debug(String.format("reading list of tables and locations"));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        HTableDescriptor[] tableDescs = this.admin.listTables();<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        List&lt;HRegionInfo&gt; regions = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>        for (HTableDescriptor tableDesc : tableDescs) {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>          table = this.admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>          regionLocator = this.admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>          for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>            ServerName rs = location.getServerName();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>            String rsName = rs.getHostname();<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>            HRegionInfo r = location.getRegionInfo();<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>            if (rsAndRMap.containsKey(rsName)) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>              regions = rsAndRMap.get(rsName);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            } else {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>              regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>              rsAndRMap.put(rsName, regions);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>            regions.add(r);<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>          }<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>          table.close();<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span><a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      } catch (IOException e) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        String msg = "Get HTables info failed";<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        LOG.error(msg, e);<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>      } finally {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        if (table != null) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          try {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            table.close();<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          } catch (IOException e) {<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>            LOG.warn("Close table failed", e);<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>        }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>      }<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span><a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return rsAndRMap;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; doFilterRegionServerByName(<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; fullRsAndRMap) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; filteredRsAndRMap = null;<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span><a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        filteredRsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        Pattern pattern = null;<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        Matcher matcher = null;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        boolean regExpFound = false;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (String rsName : this.targets) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (this.useRegExp) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>            regExpFound = false;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>            pattern = Pattern.compile(rsName);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : fullRsAndRMap.entrySet()) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>              matcher = pattern.matcher(entry.getKey());<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>              if (matcher.matches()) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>                filteredRsAndRMap.put(entry.getKey(), entry.getValue());<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>                regExpFound = true;<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>            if (!regExpFound) {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>              LOG.info("No RegionServerInfo found, regionServerPattern:" + rsName);<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            if (fullRsAndRMap.containsKey(rsName)) {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>              filteredRsAndRMap.put(rsName, fullRsAndRMap.get(rsName));<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>            } else {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>              LOG.info("No RegionServerInfo found, regionServerName:" + rsName);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>            }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>          }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        }<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>        filteredRsAndRMap = fullRsAndRMap;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return filteredRsAndRMap;<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><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  public static void main(String[] args) throws Exception {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    final Configuration conf = HBaseConfiguration.create();<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span><a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // loading the generic options to conf<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    new GenericOptionsParser(conf, args);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    int numThreads = conf.getInt("hbase.canary.threads.num", MAX_THREADS_NUM);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    LOG.info("Number of exection threads " + numThreads);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span><a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(numThreads);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span><a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    Class&lt;? extends Sink&gt; sinkClass =<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        conf.getClass("hbase.canary.sink.class", RegionServerStdOutSink.class, Sink.class);<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>    Sink sink = ReflectionUtils.newInstance(sinkClass);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span><a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    int exitCode = ToolRunner.run(conf, new Canary(executor, sink), args);<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    executor.shutdown();<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    System.exit(exitCode);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>}<a name="line.1244"></a>
+<span class="sourceLineNo">625</span>            }<a name="line.625"></a>
+<span class="sourceLineNo">626</span>          }<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>            monitorThread.interrupt();<a name="line.629"></a>
+<span class="sourceLineNo">630</span>            return monitor.errorCode;<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        } finally {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>          if (monitor != null) monitor.close();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        }<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>        Thread.sleep(interval);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      } while (interval &gt; 0);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    } // try-with-resources close<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    if (choreService != null) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>      choreService.shutdown();<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    return monitor.errorCode;<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>  private void printUsageAndExit() {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    System.err.printf(<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        getClass().getName());<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    System.err.println(" where [opts] are:");<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.err.println("   -help          Show this help and exit.");<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    System.err.println("      which means to enable regionserver mode");<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    System.err.println("      only works in regionserver mode.");<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        " default is true");<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.665"></a>
+<span class="sourceLineNo">666</span>        + " Default is hbase:canary");<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    System.err<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    System.exit(USAGE_EXIT_CODE);<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>   * A Factory method for {@link Monitor}.<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * Can be overridden by user.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @param index a start index for monitor target<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   * @param args args passed from user<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   * @return a Monitor instance<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   */<a name="line.678"></a>
+<span class="sourceLineNo">679</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Monitor monitor = null;<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    String[] monitorTargets = null;<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>    if(index &gt;= 0) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      int length = args.length - index;<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      monitorTargets = new String[length];<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.regionServerMode) {<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      monitor =<a name="line.690"></a>
+<span class="sourceLineNo">691</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.691"></a>
+<span class="sourceLineNo">692</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.692"></a>
+<span class="sourceLineNo">693</span>              this.treatFailureAsError);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    } else {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      monitor =<a name="line.695"></a>
+<span class="sourceLineNo">696</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.696"></a>
+<span class="sourceLineNo">697</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return monitor;<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">702</span>  // a Monitor super-class can be extended by users<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    protected Connection connection;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    protected Admin admin;<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    protected String[] targets;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    protected boolean useRegExp;<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    protected boolean treatFailureAsError;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    protected boolean initialized = false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>    protected boolean done = false;<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    protected int errorCode = 0;<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    protected Sink sink;<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    protected ExecutorService executor;<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>    public boolean isDone() {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      return done;<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>    public boolean hasError() {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      return errorCode != 0;<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">724</span><a name="line.724"></a>
+<span class="sourceLineNo">725</span>    public boolean finalCheckForErrors() {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      if (errorCode != 0) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        return true;<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      return treatFailureAsError &amp;&amp;<a name="line.729"></a>
+<span class="sourceLineNo">730</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>    @Override<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    public void close() throws IOException {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (this.admin != null) this.admin.close();<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.738"></a>
+<span class="sourceLineNo">739</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.740"></a>
+<span class="sourceLineNo">741</span><a name="line.741"></a>
+<span class="sourceLineNo">742</span>      this.connection = connection;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      this.targets = monitorTargets;<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      this.useRegExp = useRegExp;<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      this.sink = sink;<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      this.executor = executor;<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>    @Override<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    public abstract void run();<a name="line.751"></a>
+<span class="sourceLineNo">752</span><a name="line.752"></a>
+<span class="sourceLineNo">753</span>    protected boolean initAdmin() {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>      if (null == this.admin) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        try {<a name="line.755"></a>
+<span class="sourceLineNo">756</span>          this.admin = this.connection.getAdmin();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        } catch (Exception e) {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.758"></a>
+<span class="sourceLineNo">759</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
+<span class="sourceLineNo">761</span>      } else if (admin.isAborted()) {<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        LOG.error("HBaseAdmin aborted");<a name="line.762"></a>
+<span class="sourceLineNo">763</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      return !this.hasError();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
+<span class="sourceLineNo">767</span>  }<a name="line.767"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>  // a monitor for region mode<a name="line.769"></a>
+<span class="sourceLineNo">770</span>  private static class RegionMonitor extends Monitor {<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    // 10 minutes<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    // 1 days<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    private long lastCheckTime = -1;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    private boolean writeSniffing;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    private TableName writeTableName;<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private int writeDataTTL;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    private float regionsLowerLimit;<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    private float regionsUpperLimit;<a name="line.781"></a>
+<span class="sourceLineNo">782</span>    private int checkPeriod;<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.784"></a>
+<span class="sourceLineNo">785</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.785"></a>
+<span class="sourceLineNo">786</span>        boolean treatFailureAsError) {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      Configuration conf = connection.getConfiguration();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      this.writeSniffing = writeSniffing;<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      this.writeTableName = writeTableName;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      this.writeDataTTL =<a name="line.791"></a>
+<span class="sourceLineNo">792</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.792"></a>
+<span class="sourceLineNo">793</span>      this.regionsLowerLimit =<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      this.regionsUpperLimit =<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.796"></a>
+<span class="sourceLineNo">797</span>      this.checkPeriod =<a name="line.797"></a>
+<span class="sourceLineNo">798</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.798"></a>
+<span class="sourceLineNo">799</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    @Override<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    public void run() {<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      if (this.initAdmin()) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>        try {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>            this.initialized = true;<a name="line.809"></a>
+<span class="sourceLineNo">810</span>            for (String table : tables) {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.811"></a>
+<span class="sourceLineNo">812</span>            }<a name="line.812"></a>
+<span class="sourceLineNo">813</span>          } else {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.814"></a>
+<span class="sourceLineNo">815</span>          }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>          if (writeSniffing) {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>              try {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>                checkWriteTableDistribution();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>              } catch (IOException e) {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>              }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.824"></a>
+<span class="sourceLineNo">825</span>            }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>            // sniff canary table with write operation<a name="line.826"></a>
+<span class="sourceLineNo">827</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.827"></a>
+<span class="sourceLineNo">828</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.828"></a>
+<span class="sourceLineNo">829</span>          }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>            try {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>              future.get();<a name="line.833"></a>
+<span class="sourceLineNo">834</span>            } catch (ExecutionException e) {<a name="line.834"></a>
+<span class="sourceLineNo">835</span>              LOG.error("Sniff region failed!", e);<a name="line.835"></a>
+<span class="sourceLineNo">836</span>            }<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        } catch (Exception e) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>          LOG.error("Run regionMonitor failed", e);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          this.errorCode = ERROR_EXIT_CODE;<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>      this.done = true;<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>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>      String[] returnTables = null;<a name="line.847"></a>
+<span class="sourceLineNo">848</span><a name="line.848"></a>
+<span class="sourceLineNo">849</span>      if (this.useRegExp) {<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        Pattern pattern = null;<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        HTableDescriptor[] tds = null;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        try {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          if (LOG.isDebugEnabled()) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>            LOG.debug(String.format("reading list of tables"));<a name="line.855"></a>
+<span class="sourceLineNo">856</span>          }<a name="line.856"></a>
+<span class="sourceLineNo">857</span>          tds = this.admin.listTables(pattern);<a name="line.857"></a>
+<span class="sourceLineNo">858</span>          if (tds == null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            tds = new HTableDescriptor[0];<a name="line.859"></a>
+<span class="sourceLineNo">860</span>          }<a name="line.860"></a>
+<span class="sourceLineNo">861</span>          for (String monitorTarget : monitorTargets) {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>            pattern = Pattern.compile(monitorTarget);<a name="line.862"></a>
+<span class="sourceLineNo">863</span>            for (HTableDescriptor td : tds) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>                tmpTables.add(td.getNameAsString());<a name="line.865"></a>
+<span class="sourceLineNo">866</span>              }<a name="line.866"></a>
+<span class="sourceLineNo">867</span>            }<a name="line.867"></a>
+<span class="sourceLineNo">868</span>          }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        } catch (IOException e) {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>          LOG.error("Communicate with admin failed", e);<a name="line.870"></a>
+<span class="sourceLineNo">871</span>          throw e;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>        if (tmpTables.size() &gt; 0) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>        } else {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          LOG.error(msg);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          throw new TableNotFoundException(msg);<a name="line.880"></a>
+<span class="sourceLineNo">881</span>        }<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      } else {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>       

<TRUNCATED>

[45/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/client/CoprocessorHConnection.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/CoprocessorHConnection.html b/devapidocs/org/apache/hadoop/hbase/client/CoprocessorHConnection.html
index 9c2b377..e076371 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/CoprocessorHConnection.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/CoprocessorHConnection.html
@@ -237,7 +237,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImpleme
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html" title="class in org.apache.hadoop.hbase.client">ConnectionImplementation</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#abort(java.lang.String,%20java.lang.Throwable)">abort</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearCaches(org.apache.hadoop.hbase.ServerName)">clearCaches</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearRegionCache()">clearRegionCache</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearRegionCache(byte[])">clearRegionCache</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearRegionCache(org.apache.hadoop.hbase.TableName)">clearRegionCache</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearRegionCache(org.apache.hadoop.hbase.TableName,%20byte[])">clearRegionCache</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#close()">close</a>, <
 a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#createAsyncProcess(org.apache.hadoop.conf.Configuration)">createAsyncProcess</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#deleteCachedRegionLocation(org.apache.hadoop.hbase.HRegionLocation)">deleteCachedRegionLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#finalize()">finalize</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getAdmin()">getAdmin</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getAdmin(org.apache.hadoop.hbase.ServerName)">getAdmin</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getAdmin(org.apache.hadoop.hbase.ServerName,%20boolean)">getAdmin</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getAsyncProcess()">getAsyncProcess</a
 >, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getBackoffPolicy()">getBackoffPolicy</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getBufferedMutator(org.apache.hadoop.hbase.client.BufferedMutatorParams)">getBufferedMutator</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getBufferedMutator(org.apache.hadoop.hbase.TableName)">getBufferedMutator</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getCachedLocation(org.apache.hadoop.hbase.TableName,%20byte[])">getCachedLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getConfiguration()">getConfiguration</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getConnectionMetrics()">getConnectionMetrics</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#g
 etCurrentBatchPool()">getCurrentBatchPool</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getCurrentMetaLookupPool()">getCurrentMetaLookupPool</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getCurrentNrHRS()">getCurrentNrHRS</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getHTableDescriptor(byte[])">getHTableDescriptor</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getHTableDescriptor(org.apache.hadoop.hbase.TableName)">getHTableDescriptor</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getHTableDescriptors(java.util.List)">getHTableDescriptors</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getHTableDescriptorsByTableName(java.util.List)">getHTableDescriptorsByTableName</a>, <a href="../../../../../org/apache/hadoop/hbase/client/Co
 nnectionImplementation.html#getKeepAliveMasterService()">getKeepAliveMasterService</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getKeepAliveZooKeeperWatcher()">getKeepAliveZooKeeperWatcher</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getMaster()">getMaster</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getNewRpcRetryingCallerFactory(org.apache.hadoop.conf.Configuration)">getNewRpcRetryingCallerFactory</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getNumberOfCachedRegionLocations(org.apache.hadoop.hbase.TableName)">getNumberOfCachedRegionLocations</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionCachePrefetch(byte[])">getRegionCachePrefetch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionCachePrefetch(org.apach
 e.hadoop.hbase.TableName)">getRegionCachePrefetch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionLocation(byte[],%20byte[],%20boolean)">getRegionLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionLocation(org.apache.hadoop.hbase.TableName,%20byte[],%20boolean)">getRegionLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionLocator(org.apache.hadoop.hbase.TableName)">getRegionLocator</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRpcClient()">getRpcClient</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getStatisticsTracker()">getStatisticsTracker</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getStubKey(java.lang.String,%20java.lang.String,%20int,%20boolean)">getStubKey</a>, <a href="../../../..
 /../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(byte[])">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(byte[],%20java.util.concurrent.ExecutorService)">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(java.lang.String)">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(java.lang.String,%20java.util.concurrent.ExecutorService)">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(org.apache.hadoop.hbase.TableName)">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(org.apache.hadoop.hbase.TableName,%20java.util.concurrent.ExecutorService)">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTableNames()">getTableNames</a>, 
 <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTableState(org.apache.hadoop.hbase.TableName)">getTableState</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#injectNonceGeneratorForTesting(org.apache.hadoop.hbase.client.ClusterConnection,%20org.apache.hadoop.hbase.client.NonceGenerator)">injectNonceGeneratorForTesting</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isAborted()">isAborted</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isClosed()">isClosed</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isDeadServer(org.apache.hadoop.hbase.ServerName)">isDeadServer</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isMasterRunning()">isMasterRunning</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTa
 bleAvailable(byte[])">isTableAvailable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(byte[],%20byte[][])">isTableAvailable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(org.apache.hadoop.hbase.TableName)">isTableAvailable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(org.apache.hadoop.hbase.TableName,%20byte[][])">isTableAvailable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableDisabled(byte[])">isTableDisabled</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableDisabled(org.apache.hadoop.hbase.TableName)">isTableDisabled</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableEnabled(byte[])">isTableEnabled</a>, <a href="../../../../../org/apache/hadoop/hbase/client/Con
 nectionImplementation.html#isTableEnabled(org.apache.hadoop.hbase.TableName)">isTableEnabled</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#listTableNames()">listTableNames</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#listTables()">listTables</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(byte[])">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(byte[],%20byte[])">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(org.apache.hadoop.hbase.TableName,%20byte[])">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(org.apache.hadoop.hbase.TableName,%20byte[],%20boolean,%20boolean)">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/
 ConnectionImplementation.html#locateRegion(org.apache.hadoop.hbase.TableName,%20byte[],%20boolean,%20boolean,%20int)">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(byte[])">locateRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(byte[],%20boolean,%20boolean)">locateRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(org.apache.hadoop.hbase.TableName)">locateRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(org.apache.hadoop.hbase.TableName,%20boolean,%20boolean)">locateRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatch(java.util.List,%20byte[],%20java.util.concurrent.ExecutorService,%20java.lang.Object[])">processBatch</a>, <a href="../../../../../org/apache/hadoop/hbase/cl
 ient/ConnectionImplementation.html#processBatch(java.util.List,%20org.apache.hadoop.hbase.TableName,%20java.util.concurrent.ExecutorService,%20java.lang.Object[])">processBatch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatchCallback(java.util.List,%20byte[],%20java.util.concurrent.ExecutorService,%20java.lang.Object[],%20org.apache.hadoop.hbase.client.coprocessor.Batch.Callback)">processBatchCallback</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatchCallback(java.util.List,%20org.apache.hadoop.hbase.TableName,%20java.util.concurrent.ExecutorService,%20java.lang.Object[],%20org.apache.hadoop.hbase.client.coprocessor.Batch.Callback)">processBatchCallback</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#releaseMaster(org.apache.hadoop.hbase.client.ConnectionImplementation.MasterServiceState)">releaseMaster</a>, <a href="../../../../../org/a
 pache/hadoop/hbase/client/ConnectionImplementation.html#releaseZooKeeperWatcher(org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher)">releaseZooKeeperWatcher</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#relocateRegion(byte[],%20byte[])">relocateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#relocateRegion(org.apache.hadoop.hbase.TableName,%20byte[])">relocateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#relocateRegion(org.apache.hadoop.hbase.TableName,%20byte[],%20int)">relocateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#retrieveClusterId()">retrieveClusterId</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#setRegionCachePrefetch(byte[],%20boolean)">setRegionCachePrefetch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImpleme
 ntation.html#setRegionCachePrefetch(org.apache.hadoop.hbase.TableName,%20boolean)">setRegionCachePrefetch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#toString()">toString</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#updateCachedLocation(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.ServerName,%20org.apache.hadoop.hbase.ServerName,%20long)">updateCachedLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#updateCachedLocations(byte[],%20byte[],%20java.lang.Object,%20org.apache.hadoop.hbase.HRegionLocation)">updateCachedLocations</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#updateCachedLocations(org.apache.hadoop.hbase.TableName,%20byte[],%20byte[],%20java.lang.Object,%20org.apache.hadoop.hbase.ServerName)">updateCachedLocations</a>, <a href="../../../../../org/apache/hadoop/hbase/client/Co
 nnectionImplementation.html#updateCachedLocations(org.apache.hadoop.hbase.TableName,%20byte[],%20java.lang.Object,%20org.apache.hadoop.hbase.HRegionLocation)">updateCachedLocations</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#abort(java.lang.String,%20java.lang.Throwable)">abort</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearCaches(org.apache.hadoop.hbase.ServerName)">clearCaches</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearRegionCache()">clearRegionCache</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearRegionCache(byte[])">clearRegionCache</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearRegionCache(org.apache.hadoop.hbase.TableName)">clearRegionCache</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#clearRegionCache(org.apache.hadoop.hbase.TableName,%20byte[])">clearRegionCache</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#close()">close</a>, <
 a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#createAsyncProcess(org.apache.hadoop.conf.Configuration)">createAsyncProcess</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#deleteCachedRegionLocation(org.apache.hadoop.hbase.HRegionLocation)">deleteCachedRegionLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#finalize()">finalize</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getAdmin()">getAdmin</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getAdmin(org.apache.hadoop.hbase.ServerName)">getAdmin</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getAdmin(org.apache.hadoop.hbase.ServerName,%20boolean)">getAdmin</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getAsyncProcess()">getAsyncProcess</a
 >, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getBackoffPolicy()">getBackoffPolicy</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getBufferedMutator(org.apache.hadoop.hbase.client.BufferedMutatorParams)">getBufferedMutator</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getBufferedMutator(org.apache.hadoop.hbase.TableName)">getBufferedMutator</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getCachedLocation(org.apache.hadoop.hbase.TableName,%20byte[])">getCachedLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getConfiguration()">getConfiguration</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getConnectionMetrics()">getConnectionMetrics</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#g
 etCurrentBatchPool()">getCurrentBatchPool</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getCurrentMetaLookupPool()">getCurrentMetaLookupPool</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getCurrentNrHRS()">getCurrentNrHRS</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getHTableDescriptor(byte[])">getHTableDescriptor</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getHTableDescriptor(org.apache.hadoop.hbase.TableName)">getHTableDescriptor</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getHTableDescriptors(java.util.List)">getHTableDescriptors</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getHTableDescriptorsByTableName(java.util.List)">getHTableDescriptorsByTableName</a>, <a href="../../../../../org/apache/hadoop/hbase/client/Co
 nnectionImplementation.html#getKeepAliveMasterService()">getKeepAliveMasterService</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getKeepAliveZooKeeperWatcher()">getKeepAliveZooKeeperWatcher</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getMaster()">getMaster</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getNewRpcRetryingCallerFactory(org.apache.hadoop.conf.Configuration)">getNewRpcRetryingCallerFactory</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getNumberOfCachedRegionLocations(org.apache.hadoop.hbase.TableName)">getNumberOfCachedRegionLocations</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionCachePrefetch(byte[])">getRegionCachePrefetch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionCachePrefetch(org.apach
 e.hadoop.hbase.TableName)">getRegionCachePrefetch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionLocation(byte[],%20byte[],%20boolean)">getRegionLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionLocation(org.apache.hadoop.hbase.TableName,%20byte[],%20boolean)">getRegionLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRegionLocator(org.apache.hadoop.hbase.TableName)">getRegionLocator</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getRpcClient()">getRpcClient</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getStatisticsTracker()">getStatisticsTracker</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getStubKey(java.lang.String,%20java.lang.String,%20int,%20boolean)">getStubKey</a>, <a href="../../../..
 /../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(byte[])">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(byte[],%20java.util.concurrent.ExecutorService)">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(java.lang.String)">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(java.lang.String,%20java.util.concurrent.ExecutorService)">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(org.apache.hadoop.hbase.TableName)">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTable(org.apache.hadoop.hbase.TableName,%20java.util.concurrent.ExecutorService)">getTable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTableNames()">getTableNames</a>, 
 <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getTableState(org.apache.hadoop.hbase.TableName)">getTableState</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#hasCellBlockSupport()">hasCellBlockSupport</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#injectNonceGeneratorForTesting(org.apache.hadoop.hbase.client.ClusterConnection,%20org.apache.hadoop.hbase.client.NonceGenerator)">injectNonceGeneratorForTesting</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isAborted()">isAborted</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isClosed()">isClosed</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isDeadServer(org.apache.hadoop.hbase.ServerName)">isDeadServer</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.h
 tml#isMasterRunning()">isMasterRunning</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(byte[])">isTableAvailable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(byte[],%20byte[][])">isTableAvailable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(org.apache.hadoop.hbase.TableName)">isTableAvailable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableAvailable(org.apache.hadoop.hbase.TableName,%20byte[][])">isTableAvailable</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableDisabled(byte[])">isTableDisabled</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableDisabled(org.apache.hadoop.hbase.TableName)">isTableDisabled</a>, <a href="../../../../../org/apache/hadoop/hbase/client
 /ConnectionImplementation.html#isTableEnabled(byte[])">isTableEnabled</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#isTableEnabled(org.apache.hadoop.hbase.TableName)">isTableEnabled</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#listTableNames()">listTableNames</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#listTables()">listTables</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(byte[])">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(byte[],%20byte[])">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(org.apache.hadoop.hbase.TableName,%20byte[])">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(org.apac
 he.hadoop.hbase.TableName,%20byte[],%20boolean,%20boolean)">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegion(org.apache.hadoop.hbase.TableName,%20byte[],%20boolean,%20boolean,%20int)">locateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(byte[])">locateRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(byte[],%20boolean,%20boolean)">locateRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(org.apache.hadoop.hbase.TableName)">locateRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#locateRegions(org.apache.hadoop.hbase.TableName,%20boolean,%20boolean)">locateRegions</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatch(java.util.List,%20byte[]
 ,%20java.util.concurrent.ExecutorService,%20java.lang.Object[])">processBatch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatch(java.util.List,%20org.apache.hadoop.hbase.TableName,%20java.util.concurrent.ExecutorService,%20java.lang.Object[])">processBatch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatchCallback(java.util.List,%20byte[],%20java.util.concurrent.ExecutorService,%20java.lang.Object[],%20org.apache.hadoop.hbase.client.coprocessor.Batch.Callback)">processBatchCallback</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#processBatchCallback(java.util.List,%20org.apache.hadoop.hbase.TableName,%20java.util.concurrent.ExecutorService,%20java.lang.Object[],%20org.apache.hadoop.hbase.client.coprocessor.Batch.Callback)">processBatchCallback</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#releas
 eMaster(org.apache.hadoop.hbase.client.ConnectionImplementation.MasterServiceState)">releaseMaster</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#releaseZooKeeperWatcher(org.apache.hadoop.hbase.zookeeper.ZooKeeperWatcher)">releaseZooKeeperWatcher</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#relocateRegion(byte[],%20byte[])">relocateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#relocateRegion(org.apache.hadoop.hbase.TableName,%20byte[])">relocateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#relocateRegion(org.apache.hadoop.hbase.TableName,%20byte[],%20int)">relocateRegion</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#retrieveClusterId()">retrieveClusterId</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#setRegionC
 achePrefetch(byte[],%20boolean)">setRegionCachePrefetch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#setRegionCachePrefetch(org.apache.hadoop.hbase.TableName,%20boolean)">setRegionCachePrefetch</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#toString()">toString</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#updateCachedLocation(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.ServerName,%20org.apache.hadoop.hbase.ServerName,%20long)">updateCachedLocation</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#updateCachedLocations(byte[],%20byte[],%20java.lang.Object,%20org.apache.hadoop.hbase.HRegionLocation)">updateCachedLocations</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#updateCachedLocations(org.apache.hadoop.hbase.TableName,%20byte[],%20byte[],%20java.lan
 g.Object,%20org.apache.hadoop.hbase.ServerName)">updateCachedLocations</a>, <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#updateCachedLocations(org.apache.hadoop.hbase.TableName,%20byte[],%20java.lang.Object,%20org.apache.hadoop.hbase.HRegionLocation)">updateCachedLocations</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/client/MultiServerCallable.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/MultiServerCallable.html b/devapidocs/org/apache/hadoop/hbase/client/MultiServerCallable.html
index 4930484..b80b577 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/MultiServerCallable.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/MultiServerCallable.html
@@ -105,7 +105,7 @@
 </dl>
 <hr>
 <br>
-<pre> class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.54">MultiServerCallable</a>&lt;R&gt;
+<pre> class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.53">MultiServerCallable</a>&lt;R&gt;
 extends <a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCallable.html" title="class in org.apache.hadoop.hbase.client">RegionServerCallable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/MultiResponse.html" title="class in org.apache.hadoop.hbase.client">MultiResponse</a>&gt;
 implements <a href="../../../../../org/apache/hadoop/hbase/client/Cancellable.html" title="interface in org.apache.hadoop.hbase.client">Cancellable</a></pre>
 <div class="block">Callable that handles the <code>multi</code> method call going against a single
@@ -259,7 +259,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Cancellable.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>multiAction</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MultiAction.html" title="class in org.apache.hadoop.hbase.client">MultiAction</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/MultiServerCallable.html" title="type parameter in MultiServerCallable">R</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.55">multiAction</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MultiAction.html" title="class in org.apache.hadoop.hbase.client">MultiAction</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/MultiServerCallable.html" title="type parameter in MultiServerCallable">R</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.54">multiAction</a></pre>
 </li>
 </ul>
 <a name="cellBlock">
@@ -268,7 +268,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Cancellable.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>cellBlock</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.56">cellBlock</a></pre>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.55">cellBlock</a></pre>
 </li>
 </ul>
 <a name="controller">
@@ -277,7 +277,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Cancellable.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>controller</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html" title="class in org.apache.hadoop.hbase.ipc">PayloadCarryingRpcController</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.57">controller</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html" title="class in org.apache.hadoop.hbase.ipc">PayloadCarryingRpcController</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.56">controller</a></pre>
 </li>
 </ul>
 </li>
@@ -294,7 +294,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Cancellable.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MultiServerCallable</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.59">MultiServerCallable</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a>&nbsp;connection,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.58">MultiServerCallable</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ClusterConnection.html" title="interface in org.apache.hadoop.hbase.client">ClusterConnection</a>&nbsp;connection,
                    <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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;location,
                    <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcControllerFactory.html" title="class in org.apache.hadoop.hbase.ipc">RpcControllerFactory</a>&nbsp;rpcFactory,
@@ -315,7 +315,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Cancellable.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getLocation</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.72">getLocation</a>()</pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HRegionLocation.html" title="class in org.apache.hadoop.hbase">HRegionLocation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.71">getLocation</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCallable.html#getLocation()">getLocation</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCallable.html" title="class in org.apache.hadoop.hbase.client">RegionServerCallable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/MultiResponse.html" title="class in org.apache.hadoop.hbase.client">MultiResponse</a>&gt;</code></dd>
@@ -328,7 +328,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Cancellable.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getHRegionInfo</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.77">getHRegionInfo</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.76">getHRegionInfo</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCallable.html#getHRegionInfo()">getHRegionInfo</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCallable.html" title="class in org.apache.hadoop.hbase.client">RegionServerCallable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/MultiResponse.html" title="class in org.apache.hadoop.hbase.client">MultiResponse</a>&gt;</code></dd>
@@ -341,7 +341,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Cancellable.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getMulti</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/client/MultiAction.html" title="class in org.apache.hadoop.hbase.client">MultiAction</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/MultiServerCallable.html" title="type parameter in MultiServerCallable">R</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.81">getMulti</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/client/MultiAction.html" title="class in org.apache.hadoop.hbase.client">MultiAction</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/MultiServerCallable.html" title="type parameter in MultiServerCallable">R</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.80">getMulti</a>()</pre>
 </li>
 </ul>
 <a name="call(int)">
@@ -350,7 +350,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Cancellable.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>call</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MultiResponse.html" title="class in org.apache.hadoop.hbase.client">MultiResponse</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.86">call</a>(int&nbsp;callTimeout)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MultiResponse.html" title="class in org.apache.hadoop.hbase.client">MultiResponse</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.85">call</a>(int&nbsp;callTimeout)
                    throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/RetryingCallable.html#call(int)">RetryingCallable</a></code></strong></div>
 <div class="block">Computes a result, or throws an exception if unable to do so.</div>
@@ -369,7 +369,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Cancellable.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>cancel</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.138">cancel</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.137">cancel</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/Cancellable.html#cancel()">cancel</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Cancellable.html" title="interface in org.apache.hadoop.hbase.client">Cancellable</a></code></dd>
@@ -382,7 +382,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Cancellable.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>isCancelled</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.143">isCancelled</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.142">isCancelled</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/Cancellable.html#isCancelled()">isCancelled</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/Cancellable.html" title="interface in org.apache.hadoop.hbase.client">Cancellable</a></code></dd>
@@ -395,7 +395,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Cancellable.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>isCellBlock</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.151">isCellBlock</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.150">isCellBlock</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>True if we should send data in cellblocks.  This is an expensive call.  Cache the
  result if you can rather than call each time.</dd></dl>
 </li>
@@ -406,7 +406,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Cancellable.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>prepare</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.163">prepare</a>(boolean&nbsp;reload)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.159">prepare</a>(boolean&nbsp;reload)
              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/RegionServerCallable.html#prepare(boolean)">RegionServerCallable</a></code></strong></div>
 <div class="block">Prepare for connection to the server hosting region with row from tablename.  Does lookup
@@ -427,7 +427,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/Cancellable.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getServerName</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.169">getServerName</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html#line.165">getServerName</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/client/class-use/Scan.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/class-use/Scan.html b/devapidocs/org/apache/hadoop/hbase/client/class-use/Scan.html
index 7e65e5c..3436ba3 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/class-use/Scan.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/class-use/Scan.html
@@ -1069,7 +1069,7 @@ service.</div>
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><code>(package private) static <a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a></code></td>
+<td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a></code></td>
 <td class="colLast"><span class="strong">TableMapReduceUtil.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#convertStringToScan(java.lang.String)">convertStringToScan</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;base64)</code>
 <div class="block">Converts the given Base64 string back into a Scan instance.</div>
 </td>
@@ -1158,7 +1158,7 @@ service.</div>
 </td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>(package private) static <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colFirst"><code>static <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><span class="strong">TableMapReduceUtil.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#convertScanToString(org.apache.hadoop.hbase.client.Scan)">convertScanToString</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)</code>
 <div class="block">Writes the given scan into a Base64 encoded string.</div>
 </td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
index 5e209f2..44f4187 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -389,10 +389,10 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">Consistency</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="strong">Durability</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Admin.CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">Admin.CompactType</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="strong">IsolationLevel</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Admin.CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">Admin.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="strong">Consistency</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">AsyncProcess.Retry</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="strong">TableState.State</span></a></li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
index 8249f49..8ce1c12 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -161,14 +161,14 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="strong">Filter.ReturnCode</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="strong">FuzzyRowFilter.SatisfiesCode</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="strong">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="strong">RegexStringComparator.EngineType</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="strong">FuzzyRowFilter.Order</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="strong">CompareFilter.CompareOp</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="strong">FilterList.Operator</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="strong">FilterWrapper.FilterRowRetCode</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="strong">FuzzyRowFilter.Order</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="strong">BitComparator.BitwiseOp</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="strong">CompareFilter.CompareOp</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="strong">Filter.ReturnCode</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="strong">RegexStringComparator.EngineType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
----------------------------------------------------------------------
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 7b98af0..d03ad34 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -271,11 +271,11 @@
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="strong">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="strong">HFileBlock.Writer.State</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="strong">BlockType.BlockCategory</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheConfig.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="strong">CacheConfig.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="strong">BlockPriority</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="strong">Cacheable.MemoryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheConfig.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="strong">CacheConfig.ExternalBlockCaches</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="strong">BlockType.BlockCategory</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="strong">HFileBlock.Writer.State</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html b/devapidocs/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html
index 30755d8..0e1f1c1 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html
@@ -103,7 +103,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#line.295">AbstractRpcClient.BlockingRpcChannelImplementation</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#line.300">AbstractRpcClient.BlockingRpcChannelImplementation</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements com.google.protobuf.BlockingRpcChannel</pre>
 <div class="block">Blocking rpc channel that goes via hbase rpc.</div>
@@ -213,7 +213,7 @@ implements com.google.protobuf.BlockingRpcChannel</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>isa</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html#line.296">isa</a></pre>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html#line.301">isa</a></pre>
 </li>
 </ul>
 <a name="rpcClient">
@@ -222,7 +222,7 @@ implements com.google.protobuf.BlockingRpcChannel</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>rpcClient</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html" title="class in org.apache.hadoop.hbase.ipc">AbstractRpcClient</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html#line.297">rpcClient</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html" title="class in org.apache.hadoop.hbase.ipc">AbstractRpcClient</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html#line.302">rpcClient</a></pre>
 </li>
 </ul>
 <a name="ticket">
@@ -231,7 +231,7 @@ implements com.google.protobuf.BlockingRpcChannel</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>ticket</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html#line.298">ticket</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html#line.303">ticket</a></pre>
 </li>
 </ul>
 <a name="channelOperationTimeout">
@@ -240,7 +240,7 @@ implements com.google.protobuf.BlockingRpcChannel</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>channelOperationTimeout</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html#line.299">channelOperationTimeout</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html#line.304">channelOperationTimeout</a></pre>
 </li>
 </ul>
 </li>
@@ -257,7 +257,7 @@ implements com.google.protobuf.BlockingRpcChannel</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AbstractRpcClient.BlockingRpcChannelImplementation</h4>
-<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html#line.304">AbstractRpcClient.BlockingRpcChannelImplementation</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html" title="class in org.apache.hadoop.hbase.ipc">AbstractRpcClient</a>&nbsp;rpcClient,
+<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html#line.309">AbstractRpcClient.BlockingRpcChannelImplementation</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html" title="class in org.apache.hadoop.hbase.ipc">AbstractRpcClient</a>&nbsp;rpcClient,
                                                   <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn,
                                                   <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;ticket,
                                                   int&nbsp;channelOperationTimeout)</pre>
@@ -278,7 +278,7 @@ implements com.google.protobuf.BlockingRpcChannel</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>callBlockingMethod</h4>
-<pre>public&nbsp;com.google.protobuf.Message&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html#line.313">callBlockingMethod</a>(com.google.protobuf.Descriptors.MethodDescriptor&nbsp;md,
+<pre>public&nbsp;com.google.protobuf.Message&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.BlockingRpcChannelImplementation.html#line.318">callBlockingMethod</a>(com.google.protobuf.Descriptors.MethodDescriptor&nbsp;md,
                                              com.google.protobuf.RpcController&nbsp;controller,
                                              com.google.protobuf.Message&nbsp;param,
                                              com.google.protobuf.Message&nbsp;returnType)

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html b/devapidocs/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html
index c585757..44e963d 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html
@@ -329,6 +329,10 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcClient.html" t
 </td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>boolean</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#hasCellBlockSupport()">hasCellBlockSupport</a></strong>()</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>protected <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#wrapException(java.net.InetSocketAddress,%20java.lang.Exception)">wrapException</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a>&nbsp;addr,
                           <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;exception)</code>
@@ -577,13 +581,27 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcClient.html" t
 <dl><dt><span class="strong">Returns:</span></dt><dd>Codec to use on this client.</dd></dl>
 </li>
 </ul>
+<a name="hasCellBlockSupport()">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>hasCellBlockSupport</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#line.153">hasCellBlockSupport</a>()</pre>
+<dl>
+<dt><strong>Specified by:</strong></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcClient.html#hasCellBlockSupport()">hasCellBlockSupport</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcClient.html" title="interface in org.apache.hadoop.hbase.ipc">RpcClient</a></code></dd>
+<dt><span class="strong">Returns:</span></dt><dd>true when this client uses a <a href="../../../../../org/apache/hadoop/hbase/codec/Codec.html" title="interface in org.apache.hadoop.hbase.codec"><code>Codec</code></a> and so
+         supports cell blocks.</dd></dl>
+</li>
+</ul>
 <a name="getCompressor(org.apache.hadoop.conf.Configuration)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompressor</h4>
-<pre>private static&nbsp;org.apache.hadoop.io.compress.CompressionCodec&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#line.157">getCompressor</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>private static&nbsp;org.apache.hadoop.io.compress.CompressionCodec&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#line.162">getCompressor</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Encapsulate the ugly casting and RuntimeException conversion in private method.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>conf</code> - configuration</dd>
 <dt><span class="strong">Returns:</span></dt><dd>The compressor to use on this client.</dd></dl>
@@ -595,7 +613,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcClient.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>getPoolType</h4>
-<pre>protected static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util">PoolMap.PoolType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#line.183">getPoolType</a>(org.apache.hadoop.conf.Configuration&nbsp;config)</pre>
+<pre>protected static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util">PoolMap.PoolType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#line.188">getPoolType</a>(org.apache.hadoop.conf.Configuration&nbsp;config)</pre>
 <div class="block">Return the pool type specified in the configuration, which must be set to
  either <a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html#RoundRobin"><code>PoolMap.PoolType.RoundRobin</code></a> or
  <a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html#ThreadLocal"><code>PoolMap.PoolType.ThreadLocal</code></a>,
@@ -617,7 +635,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcClient.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>getPoolSize</h4>
-<pre>protected static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#line.196">getPoolSize</a>(org.apache.hadoop.conf.Configuration&nbsp;config)</pre>
+<pre>protected static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#line.201">getPoolSize</a>(org.apache.hadoop.conf.Configuration&nbsp;config)</pre>
 <div class="block">Return the pool size specified in the configuration, which is applicable only if
  the pool type is <a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html#RoundRobin"><code>PoolMap.PoolType.RoundRobin</code></a>.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>config</code> - configuration</dd>
@@ -630,7 +648,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcClient.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>callBlockingMethod</h4>
-<pre>com.google.protobuf.Message&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#line.210">callBlockingMethod</a>(com.google.protobuf.Descriptors.MethodDescriptor&nbsp;md,
+<pre>com.google.protobuf.Message&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#line.215">callBlockingMethod</a>(com.google.protobuf.Descriptors.MethodDescriptor&nbsp;md,
                                              <a href="../../../../../org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html" title="class in org.apache.hadoop.hbase.ipc">PayloadCarryingRpcController</a>&nbsp;pcrc,
                                              com.google.protobuf.Message&nbsp;param,
                                              com.google.protobuf.Message&nbsp;returnType,
@@ -654,7 +672,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcClient.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>call</h4>
-<pre>protected abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;com.google.protobuf.Message,<a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#line.253">call</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html" title="class in org.apache.hadoop.hbase.ipc">PayloadCarryingRpcController</a>&nbsp;pcrc,
+<pre>protected abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;com.google.protobuf.Message,<a href="../../../../../org/apache/hadoop/hbase/CellScanner.html" title="interface in org.apache.hadoop.hbase">CellScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#line.258">call</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html" title="class in org.apache.hadoop.hbase.ipc">PayloadCarryingRpcController</a>&nbsp;pcrc,
                                                  com.google.protobuf.Descriptors.MethodDescriptor&nbsp;md,
                                                  com.google.protobuf.Message&nbsp;param,
                                                  com.google.protobuf.Message&nbsp;returnType,
@@ -684,7 +702,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcClient.html" t
 <ul class="blockList">
 <li class="blockList">
 <h4>createBlockingRpcChannel</h4>
-<pre>public&nbsp;com.google.protobuf.BlockingRpcChannel&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#line.259">createBlockingRpcChannel</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn,
+<pre>public&nbsp;com.google.protobuf.BlockingRpcChannel&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#line.264">createBlockingRpcChannel</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn,
                                                               <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;ticket,
                                                               int&nbsp;defaultOperationTimeout)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcClient.html#createBlockingRpcChannel(org.apache.hadoop.hbase.ServerName,%20org.apache.hadoop.hbase.security.User,%20int)">RpcClient</a></code></strong></div>
@@ -703,7 +721,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcClient.html" t
 <ul class="blockListLast">
 <li class="blockList">
 <h4>wrapException</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#line.274">wrapException</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a>&nbsp;addr,
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#line.279">wrapException</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/net/InetSocketAddress.html?is-external=true" title="class or interface in java.net">InetSocketAddress</a>&nbsp;addr,
                         <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;exception)</pre>
 <div class="block">Takes an Exception and the address we were trying to connect to and return an IOException with
  the input exception as the cause. The new exception provides the stack trace of the place where

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcClient.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcClient.html b/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcClient.html
index 2b444bf..76d20e1 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcClient.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcClient.html
@@ -374,7 +374,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.ht
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html" title="class in org.apache.hadoop.hbase.ipc">AbstractRpcClient</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#callBlockingMethod(com.google.protobuf.Descriptors.MethodDescriptor,%20org.apache.hadoop.hbase.ipc.PayloadCarryingRpcController,%20com.google.protobuf.Message,%20com.google.protobuf.Message,%20org.apache.hadoop.hbase.security.User,%20java.net.InetSocketAddress)">callBlockingMethod</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#createBlockingRpcChannel(org.apache.hadoop.hbase.ServerName,%20org.apache.hadoop.hbase.security.User,%20int)">createBlockingRpcChannel</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#getCodec()">getCodec</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#getDefaultCodec(org.apache.hadoop.conf.Configuration)">getDefaultCodec</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#getPoolSize(org.apache.hadoop.conf.Configuration)">getPoolSize</a>, <a href="../../../.
 ./../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#getPoolType(org.apache.hadoop.conf.Configuration)">getPoolType</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#wrapException(java.net.InetSocketAddress,%20java.lang.Exception)">wrapException</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#callBlockingMethod(com.google.protobuf.Descriptors.MethodDescriptor,%20org.apache.hadoop.hbase.ipc.PayloadCarryingRpcController,%20com.google.protobuf.Message,%20com.google.protobuf.Message,%20org.apache.hadoop.hbase.security.User,%20java.net.InetSocketAddress)">callBlockingMethod</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#createBlockingRpcChannel(org.apache.hadoop.hbase.ServerName,%20org.apache.hadoop.hbase.security.User,%20int)">createBlockingRpcChannel</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#getCodec()">getCodec</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#getDefaultCodec(org.apache.hadoop.conf.Configuration)">getDefaultCodec</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#getPoolSize(org.apache.hadoop.conf.Configuration)">getPoolSize</a>, <a href="../../../.
 ./../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#getPoolType(org.apache.hadoop.conf.Configuration)">getPoolType</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#hasCellBlockSupport()">hasCellBlockSupport</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#wrapException(java.net.InetSocketAddress,%20java.lang.Exception)">wrapException</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/ipc/RpcClient.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/RpcClient.html b/devapidocs/org/apache/hadoop/hbase/ipc/RpcClient.html
index e03bbe4..7121a42 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/RpcClient.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/RpcClient.html
@@ -210,6 +210,10 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html
 <div class="block">Creates a "channel" that can be used by a blocking protobuf service.</div>
 </td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>boolean</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcClient.html#hasCellBlockSupport()">hasCellBlockSupport</a></strong>()</code>&nbsp;</td>
+</tr>
 </table>
 </li>
 </ul>
@@ -412,7 +416,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html
 <a name="close()">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
 <pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClient.html#line.85">close</a>()</pre>
@@ -426,6 +430,17 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/io/Closeable.html
 </dl>
 </li>
 </ul>
+<a name="hasCellBlockSupport()">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>hasCellBlockSupport</h4>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/RpcClient.html#line.91">hasCellBlockSupport</a>()</pre>
+<dl><dt><span class="strong">Returns:</span></dt><dd>true when this client uses a <a href="../../../../../org/apache/hadoop/hbase/codec/Codec.html" title="interface in org.apache.hadoop.hbase.codec"><code>Codec</code></a> and so
+         supports cell blocks.</dd></dl>
+</li>
+</ul>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/ipc/RpcClientImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/RpcClientImpl.html b/devapidocs/org/apache/hadoop/hbase/ipc/RpcClientImpl.html
index 2fb5855..dfd7c10 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/RpcClientImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/RpcClientImpl.html
@@ -313,7 +313,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.ht
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html" title="class in org.apache.hadoop.hbase.ipc">AbstractRpcClient</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#callBlockingMethod(com.google.protobuf.Descriptors.MethodDescriptor,%20org.apache.hadoop.hbase.ipc.PayloadCarryingRpcController,%20com.google.protobuf.Message,%20com.google.protobuf.Message,%20org.apache.hadoop.hbase.security.User,%20java.net.InetSocketAddress)">callBlockingMethod</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#createBlockingRpcChannel(org.apache.hadoop.hbase.ServerName,%20org.apache.hadoop.hbase.security.User,%20int)">createBlockingRpcChannel</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#getCodec()">getCodec</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#getDefaultCodec(org.apache.hadoop.conf.Configuration)">getDefaultCodec</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#getPoolSize(org.apache.hadoop.conf.Configuration)">getPoolSize</a>, <a href="../../../.
 ./../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#getPoolType(org.apache.hadoop.conf.Configuration)">getPoolType</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#wrapException(java.net.InetSocketAddress,%20java.lang.Exception)">wrapException</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#callBlockingMethod(com.google.protobuf.Descriptors.MethodDescriptor,%20org.apache.hadoop.hbase.ipc.PayloadCarryingRpcController,%20com.google.protobuf.Message,%20com.google.protobuf.Message,%20org.apache.hadoop.hbase.security.User,%20java.net.InetSocketAddress)">callBlockingMethod</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#createBlockingRpcChannel(org.apache.hadoop.hbase.ServerName,%20org.apache.hadoop.hbase.security.User,%20int)">createBlockingRpcChannel</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#getCodec()">getCodec</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#getDefaultCodec(org.apache.hadoop.conf.Configuration)">getDefaultCodec</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#getPoolSize(org.apache.hadoop.conf.Configuration)">getPoolSize</a>, <a href="../../../.
 ./../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#getPoolType(org.apache.hadoop.conf.Configuration)">getPoolType</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#hasCellBlockSupport()">hasCellBlockSupport</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#wrapException(java.net.InetSocketAddress,%20java.lang.Exception)">wrapException</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
index 818f1f3..696870b 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
@@ -184,13 +184,13 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 </td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>(package private) static <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colFirst"><code>static <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#convertScanToString(org.apache.hadoop.hbase.client.Scan)">convertScanToString</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)</code>
 <div class="block">Writes the given scan into a Base64 encoded string.</div>
 </td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>(package private) static <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a></code></td>
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#convertStringToScan(java.lang.String)">convertStringToScan</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;base64)</code>
 <div class="block">Converts the given Base64 string back into a Scan instance.</div>
 </td>
@@ -894,8 +894,8 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>convertScanToString</h4>
-<pre>static&nbsp;<a href="http://docs.oracle.com/javase/7/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/mapreduce/TableMapReduceUtil.html#line.564">convertScanToString</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)
-                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<pre>public static&nbsp;<a href="http://docs.oracle.com/javase/7/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/mapreduce/TableMapReduceUtil.html#line.564">convertScanToString</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)
+                                  throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Writes the given scan into a Base64 encoded string.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>scan</code> - The scan to write out.</dd>
 <dt><span class="strong">Returns:</span></dt><dd>The scan saved in a Base64 encoded string.</dd>
@@ -909,8 +909,8 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <ul class="blockList">
 <li class="blockList">
 <h4>convertStringToScan</h4>
-<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.576">convertStringToScan</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;base64)
-                         throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.576">convertStringToScan</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;base64)
+                                throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Converts the given Base64 string back into a Scan instance.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>base64</code> - The scan details.</dd>
 <dt><span class="strong">Returns:</span></dt><dd>The newly created Scan instance.</dd>


[11/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html
index d3abe39..c51826f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Monitor.html
@@ -615,9 +615,9 @@
 <span class="sourceLineNo">607</span>            if (this.failOnError &amp;&amp; monitor.hasError()) {<a name="line.607"></a>
 <span class="sourceLineNo">608</span>              monitorThread.interrupt();<a name="line.608"></a>
 <span class="sourceLineNo">609</span>              if (monitor.initialized) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>                System.exit(monitor.errorCode);<a name="line.610"></a>
+<span class="sourceLineNo">610</span>                return monitor.errorCode;<a name="line.610"></a>
 <span class="sourceLineNo">611</span>              } else {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.612"></a>
+<span class="sourceLineNo">612</span>                return INIT_ERROR_EXIT_CODE;<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>            currentTimeLength = System.currentTimeMillis() - startTime;<a name="line.615"></a>
@@ -626,630 +626,629 @@
 <span class="sourceLineNo">618</span>                  + ") after timeout limit:" + this.timeout<a name="line.618"></a>
 <span class="sourceLineNo">619</span>                  + " will be killed itself !!");<a name="line.619"></a>
 <span class="sourceLineNo">620</span>              if (monitor.initialized) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>                System.exit(TIMEOUT_ERROR_EXIT_CODE);<a name="line.621"></a>
+<span class="sourceLineNo">621</span>                return TIMEOUT_ERROR_EXIT_CODE;<a name="line.621"></a>
 <span class="sourceLineNo">622</span>              } else {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.623"></a>
+<span class="sourceLineNo">623</span>                return INIT_ERROR_EXIT_CODE;<a name="line.623"></a>
 <span class="sourceLineNo">624</span>              }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>              break;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>            monitorThread.interrupt();<a name="line.630"></a>
-<span class="sourceLineNo">631</span>            System.exit(monitor.errorCode);<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } finally {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          if (monitor != null) monitor.close();<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>        Thread.sleep(interval);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      } while (interval &gt; 0);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    } // try-with-resources close<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    if (choreService != null) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      choreService.shutdown();<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    return(monitor.errorCode);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>  }<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private void printUsageAndExit() {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    System.err.printf(<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        getClass().getName());<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    System.err.println(" where [opts] are:");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    System.err.println("   -help          Show this help and exit.");<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    System.err.println("      which means to enable regionserver mode");<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    System.err.println("      only works in regionserver mode.");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        " default is true");<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        + " Default is hbase:canary");<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    System.err<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * A Factory method for {@link Monitor}.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   * Can be overridden by user.<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param index a start index for monitor target<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param args args passed from user<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a Monitor instance<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   */<a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    Monitor monitor = null;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    String[] monitorTargets = null;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    if(index &gt;= 0) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int length = args.length - index;<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      monitorTargets = new String[length];<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>    if (this.regionServerMode) {<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      monitor =<a name="line.691"></a>
-<span class="sourceLineNo">692</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.693"></a>
-<span class="sourceLineNo">694</span>              this.treatFailureAsError);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    } else {<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      monitor =<a name="line.696"></a>
-<span class="sourceLineNo">697</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    return monitor;<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>  // a Monitor super-class can be extended by users<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>    protected Connection connection;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    protected Admin admin;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    protected String[] targets;<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    protected boolean useRegExp;<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    protected boolean treatFailureAsError;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    protected boolean initialized = false;<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    protected boolean done = false;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected int errorCode = 0;<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    protected Sink sink;<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    protected ExecutorService executor;<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>    public boolean isDone() {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return done;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    public boolean hasError() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return errorCode != 0;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span><a name="line.725"></a>
-<span class="sourceLineNo">726</span>    public boolean finalCheckForErrors() {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      if (errorCode != 0) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>        return true;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      return treatFailureAsError &amp;&amp;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>    @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    public void close() throws IOException {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (this.admin != null) this.admin.close();<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span><a name="line.738"></a>
-<span class="sourceLineNo">739</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      this.connection = connection;<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      this.targets = monitorTargets;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      this.useRegExp = useRegExp;<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.sink = sink;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      this.executor = executor;<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>    @Override<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    public abstract void run();<a name="line.752"></a>
-<span class="sourceLineNo">753</span><a name="line.753"></a>
-<span class="sourceLineNo">754</span>    protected boolean initAdmin() {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      if (null == this.admin) {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        try {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>          this.admin = this.connection.getAdmin();<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        } catch (Exception e) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>        }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      } else if (admin.isAborted()) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>        LOG.error("HBaseAdmin aborted");<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      }<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return !this.hasError();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
-<span class="sourceLineNo">769</span><a name="line.769"></a>
-<span class="sourceLineNo">770</span>  // a monitor for region mode<a name="line.770"></a>
-<span class="sourceLineNo">771</span>  private static class RegionMonitor extends Monitor {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    // 10 minutes<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    // 1 days<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>    private long lastCheckTime = -1;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private boolean writeSniffing;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    private TableName writeTableName;<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    private int writeDataTTL;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private float regionsLowerLimit;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    private float regionsUpperLimit;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    private int checkPeriod;<a name="line.783"></a>
-<span class="sourceLineNo">784</span><a name="line.784"></a>
-<span class="sourceLineNo">785</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        boolean treatFailureAsError) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      Configuration conf = connection.getConfiguration();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      this.writeSniffing = writeSniffing;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      this.writeTableName = writeTableName;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      this.writeDataTTL =<a name="line.792"></a>
-<span class="sourceLineNo">793</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      this.regionsLowerLimit =<a name="line.794"></a>
-<span class="sourceLineNo">795</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      this.regionsUpperLimit =<a name="line.796"></a>
-<span class="sourceLineNo">797</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      this.checkPeriod =<a name="line.798"></a>
-<span class="sourceLineNo">799</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.799"></a>
-<span class="sourceLineNo">800</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>    @Override<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    public void run() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      if (this.initAdmin()) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        try {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.809"></a>
-<span class="sourceLineNo">810</span>            this.initialized = true;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>            for (String table : tables) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.812"></a>
-<span class="sourceLineNo">813</span>            }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          } else {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>          }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>          if (writeSniffing) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>              try {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                checkWriteTableDistribution();<a name="line.821"></a>
-<span class="sourceLineNo">822</span>              } catch (IOException e) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.823"></a>
-<span class="sourceLineNo">824</span>              }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>            }<a name="line.826"></a>
-<span class="sourceLineNo">827</span>            // sniff canary table with write operation<a name="line.827"></a>
-<span class="sourceLineNo">828</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.828"></a>
-<span class="sourceLineNo">829</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>          }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            try {<a name="line.833"></a>
-<span class="sourceLineNo">834</span>              future.get();<a name="line.834"></a>
-<span class="sourceLineNo">835</span>            } catch (ExecutionException e) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>              LOG.error("Sniff region failed!", e);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>            }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          }<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        } catch (Exception e) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>          LOG.error("Run regionMonitor failed", e);<a name="line.840"></a>
-<span class="sourceLineNo">841</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      this.done = true;<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      String[] returnTables = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span><a name="line.849"></a>
-<span class="sourceLineNo">850</span>      if (this.useRegExp) {<a name="line.850"></a>
-<span class="sourceLineNo">851</span>        Pattern pattern = null;<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        HTableDescriptor[] tds = null;<a name="line.852"></a>
-<span class="sourceLineNo">853</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        try {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>          if (LOG.isDebugEnabled()) {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>            LOG.debug(String.format("reading list of tables"));<a name="line.856"></a>
-<span class="sourceLineNo">857</span>          }<a name="line.857"></a>
-<span class="sourceLineNo">858</span>          tds = this.admin.listTables(pattern);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>          if (tds == null) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>            tds = new HTableDescriptor[0];<a name="line.860"></a>
-<span class="sourceLineNo">861</span>          }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>          for (String monitorTarget : monitorTargets) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>            pattern = Pattern.compile(monitorTarget);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>            for (HTableDescriptor td : tds) {<a name="line.864"></a>
-<span class="sourceLineNo">865</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>                tmpTables.add(td.getNameAsString());<a name="line.866"></a>
-<span class="sourceLineNo">867</span>              }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>            }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>          }<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        } catch (IOException e) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          LOG.error("Communicate with admin failed", e);<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          throw e;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>        if (tmpTables.size() &gt; 0) {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>        } else {<a name="line.877"></a>
-<span class="sourceLineNo">878</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          LOG.error(msg);<a name="line.879"></a>
-<span class="sourceLineNo">880</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>          throw new TableNotFoundException(msg);<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        }<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      } else {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>        returnTables = monitorTargets;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>      return returnTables;<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    }<a name="line.888"></a>
-<span class="sourceLineNo">889</span><a name="line.889"></a>
-<span class="sourceLineNo">890</span>    /*<a name="line.890"></a>
-<span class="sourceLineNo">891</span>     * canary entry point to monitor all the tables.<a name="line.891"></a>
-<span class="sourceLineNo">892</span>     */<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType) throws Exception {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      if (LOG.isDebugEnabled()) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        LOG.debug(String.format("reading list of tables"));<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.899"></a>
-<span class="sourceLineNo">900</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        }<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      return taskFutures;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      if (!admin.tableExists(writeTableName)) {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>        int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.909"></a>
-<span class="sourceLineNo">910</span>        if (numberOfServers == 0) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>          throw new IllegalStateException("No live regionservers");<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        }<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        createWriteTable(numberOfServers);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        admin.enableTable(writeTableName);<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      }<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>      int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      List&lt;Pair&lt;HRegionInfo, ServerName&gt;&gt; pairs =<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      int numberOfRegions = pairs.size();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        admin.disableTable(writeTableName);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        admin.deleteTable(writeTableName);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        createWriteTable(numberOfServers);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;ServerName&gt;();<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      for (Pair&lt;HRegionInfo, ServerName&gt; pair : pairs) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        serverSet.add(pair.getSecond());<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      int numberOfCoveredServers = serverSet.size();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        admin.balancer();<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    }<a name="line.938"></a>
-<span class="sourceLineNo">939</span><a name="line.939"></a>
-<span class="sourceLineNo">940</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          + " and you can change it by config: "<a name="line.945"></a>
-<span class="sourceLineNo">946</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      family.setMaxVersions(1);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      family.setTimeToLive(writeDataTTL);<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      desc.addFamily(family);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      admin.createTable(desc, splits);<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    }<a name="line.955"></a>
-<span class="sourceLineNo">956</span>  }<a name="line.956"></a>
-<span class="sourceLineNo">957</span><a name="line.957"></a>
-<span class="sourceLineNo">958</span>  /**<a name="line.958"></a>
-<span class="sourceLineNo">959</span>   * Canary entry point for specified table.<a name="line.959"></a>
-<span class="sourceLineNo">960</span>   * @throws Exception<a name="line.960"></a>
-<span class="sourceLineNo">961</span>   */<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static void sniff(final Admin admin, TableName tableName)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      throws Exception {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    sniff(admin, tableName, TaskType.READ);<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>  /**<a name="line.967"></a>
-<span class="sourceLineNo">968</span>   * Canary entry point for specified table with task type(read/write)<a name="line.968"></a>
-<span class="sourceLineNo">969</span>   * @throws Exception<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   */<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  public static void sniff(final Admin admin, TableName tableName, TaskType taskType)<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      throws Exception {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    List&lt;Future&lt;Void&gt;&gt; taskFutures =<a name="line.973"></a>
-<span class="sourceLineNo">974</span>        Canary.sniff(admin, new StdOutSink(), tableName.getNameAsString(),<a name="line.974"></a>
-<span class="sourceLineNo">975</span>          new ScheduledThreadPoolExecutor(1), taskType);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    for (Future&lt;Void&gt; future : taskFutures) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      future.get();<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><a name="line.980"></a>
-<span class="sourceLineNo">981</span>  /**<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   * Canary entry point for specified table.<a name="line.982"></a>
-<span class="sourceLineNo">983</span>   * @throws Exception<a name="line.983"></a>
-<span class="sourceLineNo">984</span>   */<a name="line.984"></a>
-<span class="sourceLineNo">985</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      ExecutorService executor, TaskType taskType) throws Exception {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    if (LOG.isDebugEnabled()) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        tableName));<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        executor, taskType);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    } else {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  /*<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>   * Loops over regions that owns this table, and output some information abouts the state.<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType) throws Exception {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span><a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    if (LOG.isDebugEnabled()) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>    Table table = null;<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    try {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    } catch (TableNotFoundException e) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      return new ArrayList&lt;Future&lt;Void&gt;&gt;();<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;RegionTask&gt;();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    try {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      for (HRegionInfo region : admin.getTableRegions(tableDesc.getTableName())) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        tasks.add(new RegionTask(admin.getConnection(), region, sink, taskType));<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    } finally {<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      table.close();<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    return executor.invokeAll(tasks);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>  // a monitor for regionserver mode<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  private static class RegionServerMonitor extends Monitor {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    private boolean allRegions;<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    public RegionServerMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        ExtendedSink sink, ExecutorService executor, boolean allRegions,<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        boolean treatFailureAsError) {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      this.allRegions = allRegions;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span><a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    private ExtendedSink getSink() {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      return (ExtendedSink) this.sink;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span><a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    @Override<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    public void run() {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      if (this.initAdmin() &amp;&amp; this.checkNoTableNames()) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = this.filterRegionServerByName();<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        this.initialized = true;<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>        this.monitorRegionServers(rsAndRMap);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      this.done = true;<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>    private boolean checkNoTableNames() {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      List&lt;String&gt; foundTableNames = new ArrayList&lt;String&gt;();<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>      TableName[] tableNames = null;<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      if (LOG.isDebugEnabled()) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      try {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>        tableNames = this.admin.listTableNames();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      } catch (IOException e) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        LOG.error("Get listTableNames failed", e);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        return false;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      if (this.targets == null || this.targets.length == 0) return true;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      for (String target : this.targets) {<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        for (TableName tableName : tableNames) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          if (target.equals(tableName.getNameAsString())) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>            foundTableNames.add(target);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (foundTableNames.size() &gt; 0) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        System.err.println("Cannot pass a tablename when using the -regionserver " +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>            "option, tablenames:" + foundTableNames.toString());<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        this.errorCode = USAGE_EXIT_CODE;<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      }<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      return foundTableNames.size() == 0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    }<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span><a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    private void monitorRegionServers(Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      List&lt;RegionServerTask&gt; tasks = new ArrayList&lt;RegionServerTask&gt;();<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      Map&lt;String, AtomicLong&gt; successMap = new HashMap&lt;String, AtomicLong&gt;();<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      Random rand = new Random();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        String serverName = entry.getKey();<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        AtomicLong successes = new AtomicLong(0);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        successMap.put(serverName, successes);<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        if (this.allRegions) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>          for (HRegionInfo region : entry.getValue()) {<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            tasks.add(new RegionServerTask(this.connection,<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>                serverName,<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>                region,<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>                getSink(),<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>                successes));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>          }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        } else {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>          // random select a region if flag not set<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>          HRegionInfo region = entry.getValue().get(rand.nextInt(entry.getValue().size()));<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>          tasks.add(new RegionServerTask(this.connection,<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>              serverName,<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>              region,<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>              getSink(),<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>              successes));<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>        }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      }<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>      try {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>          try {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>            future.get();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          } catch (ExecutionException e) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.error("Sniff regionserver failed!", e);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        if (this.allRegions) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>            String serverName = entry.getKey();<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            LOG.info("Successfully read " + successMap.get(serverName) + " regions out of "<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>                    + entry.getValue().size() + " on regionserver:" + serverName);<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      } catch (InterruptedException e) {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        LOG.error("Sniff regionserver interrupted!", e);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      }<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>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; filterRegionServerByName() {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; regionServerAndRegionsMap = this.getAllRegionServerByName();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      regionServerAndRegionsMap = this.doFilterRegionServerByName(regionServerAndRegionsMap);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>      return regionServerAndRegionsMap;<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; getAllRegionServerByName() {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      Table table = null;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      RegionLocator regionLocator = null;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      try {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        if (LOG.isDebugEnabled()) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          LOG.debug(String.format("reading list of tables and locations"));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        HTableDescriptor[] tableDescs = this.admin.listTables();<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        List&lt;HRegionInfo&gt; regions = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>        for (HTableDescriptor tableDesc : tableDescs) {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>          table = this.admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>          regionLocator = this.admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>          for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>            ServerName rs = location.getServerName();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>            String rsName = rs.getHostname();<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>            HRegionInfo r = location.getRegionInfo();<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>            if (rsAndRMap.containsKey(rsName)) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>              regions = rsAndRMap.get(rsName);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            } else {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>              regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>              rsAndRMap.put(rsName, regions);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>            regions.add(r);<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>          }<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>          table.close();<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span><a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      } catch (IOException e) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        String msg = "Get HTables info failed";<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        LOG.error(msg, e);<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>      } finally {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        if (table != null) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          try {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            table.close();<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          } catch (IOException e) {<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>            LOG.warn("Close table failed", e);<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>        }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>      }<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span><a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return rsAndRMap;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; doFilterRegionServerByName(<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; fullRsAndRMap) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; filteredRsAndRMap = null;<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span><a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        filteredRsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        Pattern pattern = null;<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        Matcher matcher = null;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        boolean regExpFound = false;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (String rsName : this.targets) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (this.useRegExp) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>            regExpFound = false;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>            pattern = Pattern.compile(rsName);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : fullRsAndRMap.entrySet()) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>              matcher = pattern.matcher(entry.getKey());<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>              if (matcher.matches()) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>                filteredRsAndRMap.put(entry.getKey(), entry.getValue());<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>                regExpFound = true;<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>            if (!regExpFound) {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>              LOG.info("No RegionServerInfo found, regionServerPattern:" + rsName);<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            if (fullRsAndRMap.containsKey(rsName)) {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>              filteredRsAndRMap.put(rsName, fullRsAndRMap.get(rsName));<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>            } else {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>              LOG.info("No RegionServerInfo found, regionServerName:" + rsName);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>            }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>          }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        }<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>        filteredRsAndRMap = fullRsAndRMap;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return filteredRsAndRMap;<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><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  public static void main(String[] args) throws Exception {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    final Configuration conf = HBaseConfiguration.create();<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span><a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // loading the generic options to conf<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    new GenericOptionsParser(conf, args);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    int numThreads = conf.getInt("hbase.canary.threads.num", MAX_THREADS_NUM);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    LOG.info("Number of exection threads " + numThreads);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span><a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(numThreads);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span><a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    Class&lt;? extends Sink&gt; sinkClass =<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        conf.getClass("hbase.canary.sink.class", RegionServerStdOutSink.class, Sink.class);<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>    Sink sink = ReflectionUtils.newInstance(sinkClass);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span><a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    int exitCode = ToolRunner.run(conf, new Canary(executor, sink), args);<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    executor.shutdown();<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    System.exit(exitCode);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>}<a name="line.1244"></a>
+<span class="sourceLineNo">625</span>            }<a name="line.625"></a>
+<span class="sourceLineNo">626</span>          }<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>            monitorThread.interrupt();<a name="line.629"></a>
+<span class="sourceLineNo">630</span>            return monitor.errorCode;<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        } finally {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>          if (monitor != null) monitor.close();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        }<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>        Thread.sleep(interval);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      } while (interval &gt; 0);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    } // try-with-resources close<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    if (choreService != null) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>      choreService.shutdown();<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    return monitor.errorCode;<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>  private void printUsageAndExit() {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    System.err.printf(<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        getClass().getName());<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    System.err.println(" where [opts] are:");<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.err.println("   -help          Show this help and exit.");<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    System.err.println("      which means to enable regionserver mode");<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    System.err.println("      only works in regionserver mode.");<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        " default is true");<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.665"></a>
+<span class="sourceLineNo">666</span>        + " Default is hbase:canary");<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    System.err<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    System.exit(USAGE_EXIT_CODE);<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>   * A Factory method for {@link Monitor}.<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * Can be overridden by user.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @param index a start index for monitor target<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   * @param args args passed from user<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   * @return a Monitor instance<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   */<a name="line.678"></a>
+<span class="sourceLineNo">679</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Monitor monitor = null;<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    String[] monitorTargets = null;<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>    if(index &gt;= 0) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      int length = args.length - index;<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      monitorTargets = new String[length];<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.regionServerMode) {<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      monitor =<a name="line.690"></a>
+<span class="sourceLineNo">691</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.691"></a>
+<span class="sourceLineNo">692</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.692"></a>
+<span class="sourceLineNo">693</span>              this.treatFailureAsError);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    } else {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      monitor =<a name="line.695"></a>
+<span class="sourceLineNo">696</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.696"></a>
+<span class="sourceLineNo">697</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return monitor;<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">702</span>  // a Monitor super-class can be extended by users<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    protected Connection connection;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    protected Admin admin;<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    protected String[] targets;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    protected boolean useRegExp;<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    protected boolean treatFailureAsError;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    protected boolean initialized = false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>    protected boolean done = false;<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    protected int errorCode = 0;<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    protected Sink sink;<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    protected ExecutorService executor;<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>    public boolean isDone() {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      return done;<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>    public boolean hasError() {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      return errorCode != 0;<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">724</span><a name="line.724"></a>
+<span class="sourceLineNo">725</span>    public boolean finalCheckForErrors() {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      if (errorCode != 0) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        return true;<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      return treatFailureAsError &amp;&amp;<a name="line.729"></a>
+<span class="sourceLineNo">730</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>    @Override<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    public void close() throws IOException {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (this.admin != null) this.admin.close();<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.738"></a>
+<span class="sourceLineNo">739</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.740"></a>
+<span class="sourceLineNo">741</span><a name="line.741"></a>
+<span class="sourceLineNo">742</span>      this.connection = connection;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      this.targets = monitorTargets;<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      this.useRegExp = useRegExp;<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      this.sink = sink;<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      this.executor = executor;<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>    @Override<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    public abstract void run();<a name="line.751"></a>
+<span class="sourceLineNo">752</span><a name="line.752"></a>
+<span class="sourceLineNo">753</span>    protected boolean initAdmin() {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>      if (null == this.admin) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        try {<a name="line.755"></a>
+<span class="sourceLineNo">756</span>          this.admin = this.connection.getAdmin();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        } catch (Exception e) {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.758"></a>
+<span class="sourceLineNo">759</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
+<span class="sourceLineNo">761</span>      } else if (admin.isAborted()) {<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        LOG.error("HBaseAdmin aborted");<a name="line.762"></a>
+<span class="sourceLineNo">763</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      return !this.hasError();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
+<span class="sourceLineNo">767</span>  }<a name="line.767"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>  // a monitor for region mode<a name="line.769"></a>
+<span class="sourceLineNo">770</span>  private static class RegionMonitor extends Monitor {<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    // 10 minutes<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    // 1 days<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    private long lastCheckTime = -1;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    private boolean writeSniffing;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    private TableName writeTableName;<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private int writeDataTTL;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    private float regionsLowerLimit;<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    private float regionsUpperLimit;<a name="line.781"></a>
+<span class="sourceLineNo">782</span>    private int checkPeriod;<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.784"></a>
+<span class="sourceLineNo">785</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.785"></a>
+<span class="sourceLineNo">786</span>        boolean treatFailureAsError) {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      Configuration conf = connection.getConfiguration();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      this.writeSniffing = writeSniffing;<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      this.writeTableName = writeTableName;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      this.writeDataTTL =<a name="line.791"></a>
+<span class="sourceLineNo">792</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.792"></a>
+<span class="sourceLineNo">793</span>      this.regionsLowerLimit =<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      this.regionsUpperLimit =<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.796"></a>
+<span class="sourceLineNo">797</span>      this.checkPeriod =<a name="line.797"></a>
+<span class="sourceLineNo">798</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.798"></a>
+<span class="sourceLineNo">799</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    @Override<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    public void run() {<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      if (this.initAdmin()) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>        try {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>            this.initialized = true;<a name="line.809"></a>
+<span class="sourceLineNo">810</span>            for (String table : tables) {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.811"></a>
+<span class="sourceLineNo">812</span>            }<a name="line.812"></a>
+<span class="sourceLineNo">813</span>          } else {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.814"></a>
+<span class="sourceLineNo">815</span>          }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>          if (writeSniffing) {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>              try {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>                checkWriteTableDistribution();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>              } catch (IOException e) {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>              }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.824"></a>
+<span class="sourceLineNo">825</span>            }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>            // sniff canary table with write operation<a name="line.826"></a>
+<span class="sourceLineNo">827</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.827"></a>
+<span class="sourceLineNo">828</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.828"></a>
+<span class="sourceLineNo">829</span>          }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>            try {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>              future.get();<a name="line.833"></a>
+<span class="sourceLineNo">834</span>            } catch (ExecutionException e) {<a name="line.834"></a>
+<span class="sourceLineNo">835</span>              LOG.error("Sniff region failed!", e);<a name="line.835"></a>
+<span class="sourceLineNo">836</span>            }<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        } catch (Exception e) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>          LOG.error("Run regionMonitor failed", e);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          this.errorCode = ERROR_EXIT_CODE;<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>      this.done = true;<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>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>      String[] returnTables = null;<a name="line.847"></a>
+<span class="sourceLineNo">848</span><a name="line.848"></a>
+<span class="sourceLineNo">849</span>      if (this.useRegExp) {<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        Pattern pattern = null;<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        HTableDescriptor[] tds = null;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        try {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          if (LOG.isDebugEnabled()) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>            LOG.debug(String.format("reading list of tables"));<a name="line.855"></a>
+<span class="sourceLineNo">856</span>          }<a name="line.856"></a>
+<span class="sourceLineNo">857</span>          tds = this.admin.listTables(pattern);<a name="line.857"></a>
+<span class="sourceLineNo">858</span>          if (tds == null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            tds = new HTableDescriptor[0];<a name="line.859"></a>
+<span class="sourceLineNo">860</span>          }<a name="line.860"></a>
+<span class="sourceLineNo">861</span>          for (String monitorTarget : monitorTargets) {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>            pattern = Pattern.compile(monitorTarget);<a name="line.862"></a>
+<span class="sourceLineNo">863</span>            for (HTableDescriptor td : tds) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>                tmpTables.add(td.getNameAsString());<a name="line.865"></a>
+<span class="sourceLineNo">866</span>              }<a name="line.866"></a>
+<span class="sourceLineNo">867</span>            }<a name="line.867"></a>
+<span class="sourceLineNo">868</span>          }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        } catch (IOException e) {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>          LOG.error("Communicate with admin failed", e);<a name="line.870"></a>
+<span class="sourceLineNo">871</span>          throw e;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>        if (tmpTables.size() &gt; 0) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>        } else {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          LOG.error(msg);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          throw new TableNotFoundException(msg);<a name="line.880"></a>
+<span class="sourceLineNo">881</span>        }<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      } else {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>        returnTables =

<TRUNCATED>

[51/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.


Project: http://git-wip-us.apache.org/repos/asf/hbase-site/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase-site/commit/8bb348c6
Tree: http://git-wip-us.apache.org/repos/asf/hbase-site/tree/8bb348c6
Diff: http://git-wip-us.apache.org/repos/asf/hbase-site/diff/8bb348c6

Branch: refs/heads/asf-site
Commit: 8bb348c660e5512aeca9ed3b6a0b0fb20ca695bb
Parents: 40ef21e
Author: jenkins <bu...@apache.org>
Authored: Thu Feb 11 15:41:49 2016 +0000
Committer: Misty Stanley-Jones <ms...@cloudera.com>
Committed: Thu Feb 11 09:32:25 2016 -0800

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                |     4 +-
 apache_hbase_reference_guide.pdfmarks           |     4 +-
 apidocs/index-all.html                          |     8 +
 .../hadoop/hbase/client/class-use/Scan.html     |    40 +-
 .../hbase/mapreduce/TableMapReduceUtil.html     |    42 +
 .../hadoop/hbase/mapreduce/TableSplit.html      |     6 +-
 .../hbase/mapreduce/TableInputFormatBase.html   |    10 +-
 .../hbase/mapreduce/TableMapReduceUtil.html     |     4 +-
 .../hadoop/hbase/mapreduce/TableSplit.html      |    99 +-
 .../hadoop/hbase/rest/client/Cluster.html       |     2 +-
 book.html                                       |     2 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       | 25792 ++++++++---------
 checkstyle.rss                                  |     8 +-
 coc.html                                        |     4 +-
 cygwin.html                                     |     4 +-
 dependencies.html                               |     4 +-
 dependency-convergence.html                     |     4 +-
 dependency-info.html                            |     4 +-
 dependency-management.html                      |     4 +-
 devapidocs/index-all.html                       |    23 +-
 .../hbase/class-use/HBaseIOException.html       |    15 +-
 .../hadoop/hbase/class-use/HRegionInfo.html     |   110 +-
 .../hadoop/hbase/class-use/ServerName.html      |   120 +-
 .../hbase/classification/package-tree.html      |     6 +-
 .../hadoop/hbase/client/ClusterConnection.html  |    39 +-
 .../hbase/client/ConnectionImplementation.html  |   116 +-
 .../ConnectionUtils.MasterlessConnection.html   |     2 +-
 .../hbase/client/CoprocessorHConnection.html    |     2 +-
 .../hbase/client/MultiServerCallable.html       |    28 +-
 .../hadoop/hbase/client/class-use/Scan.html     |     4 +-
 .../hadoop/hbase/client/package-tree.html       |     4 +-
 .../hadoop/hbase/filter/package-tree.html       |    10 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     6 +-
 ...Client.BlockingRpcChannelImplementation.html |    14 +-
 .../hadoop/hbase/ipc/AbstractRpcClient.html     |    32 +-
 .../apache/hadoop/hbase/ipc/AsyncRpcClient.html |     2 +-
 .../org/apache/hadoop/hbase/ipc/RpcClient.html  |    17 +-
 .../apache/hadoop/hbase/ipc/RpcClientImpl.html  |     2 +-
 .../hbase/mapreduce/TableMapReduceUtil.html     |    12 +-
 .../hadoop/hbase/mapreduce/TableSplit.html      |     6 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |     2 +-
 .../hadoop/hbase/master/LoadBalancer.html       |    67 +-
 .../hbase/master/balancer/BaseLoadBalancer.html |    96 +-
 .../balancer/FavoredNodeLoadBalancer.html       |     2 +-
 .../SimpleLoadBalancer.BalanceInfo.html         |    14 +-
 .../master/balancer/SimpleLoadBalancer.html     |    26 +-
 .../master/balancer/StochasticLoadBalancer.html |     2 +-
 .../balancer/class-use/MetricsBalancer.html     |     2 +-
 .../hadoop/hbase/master/package-tree.html       |     4 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    10 +-
 .../hadoop/hbase/quotas/package-tree.html       |     4 +-
 .../regionserver/HRegion.RegionScannerImpl.html |    92 +-
 .../regionserver/HRegion.RowLockContext.html    |    24 +-
 .../hbase/regionserver/HRegion.RowLockImpl.html |    16 +-
 .../hadoop/hbase/regionserver/HRegion.html      |   308 +-
 .../hadoop/hbase/regionserver/package-tree.html |    24 +-
 .../hadoop/hbase/regionserver/wal/WALEdit.html  |    78 +-
 .../hadoop/hbase/rest/model/package-tree.html   |     2 +-
 .../hbase/security/access/package-tree.html     |     4 +-
 .../tmpl/master/MasterStatusTmpl.ImplData.html  |   270 +-
 .../hbase/tmpl/master/MasterStatusTmpl.html     |   108 +-
 .../hbase/tmpl/master/MasterStatusTmplImpl.html |    54 +-
 .../regionserver/RSStatusTmpl.ImplData.html     |   120 +-
 .../hbase/tmpl/regionserver/RSStatusTmpl.html   |    48 +-
 .../tmpl/regionserver/RSStatusTmplImpl.html     |    24 +-
 .../hadoop/hbase/tool/Canary.Monitor.html       |    36 +-
 .../hadoop/hbase/tool/Canary.RegionMonitor.html |    32 +-
 .../hbase/tool/Canary.RegionServerMonitor.html  |    20 +-
 .../org/apache/hadoop/hbase/tool/Canary.html    |    14 +-
 .../apache/hadoop/hbase/util/package-tree.html  |     4 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 .../hadoop/hbase/client/ClusterConnection.html  |     7 +-
 ...ectionImplementation.MasterServiceState.html |     7 +-
 ...onImplementation.MasterServiceStubMaker.html |     7 +-
 ...nnectionImplementation.NoNonceGenerator.html |     7 +-
 ...ntation.ServerErrorTracker.ServerErrors.html |     7 +-
 ...ectionImplementation.ServerErrorTracker.html |     7 +-
 .../ConnectionImplementation.StubMaker.html     |     7 +-
 .../hbase/client/ConnectionImplementation.html  |     7 +-
 .../hbase/client/MultiServerCallable.html       |   290 +-
 ...Client.BlockingRpcChannelImplementation.html |   361 +-
 .../hadoop/hbase/ipc/AbstractRpcClient.html     |   361 +-
 .../org/apache/hadoop/hbase/ipc/RpcClient.html  |     8 +-
 .../hbase/mapreduce/TableInputFormatBase.html   |    10 +-
 .../hbase/mapreduce/TableMapReduceUtil.html     |     4 +-
 .../hbase/mapreduce/TableSplit.Version.html     |    99 +-
 .../hadoop/hbase/mapreduce/TableSplit.html      |    99 +-
 .../hadoop/hbase/master/LoadBalancer.html       |   205 +-
 .../BaseLoadBalancer.Cluster.Action.Type.html   |   519 +-
 .../BaseLoadBalancer.Cluster.Action.html        |   519 +-
 ...LoadBalancer.Cluster.AssignRegionAction.html |   519 +-
 ...seLoadBalancer.Cluster.MoveRegionAction.html |   519 +-
 ...eLoadBalancer.Cluster.SwapRegionsAction.html |   519 +-
 .../balancer/BaseLoadBalancer.Cluster.html      |   519 +-
 .../BaseLoadBalancer.DefaultRackManager.html    |   519 +-
 .../hbase/master/balancer/BaseLoadBalancer.html |   519 +-
 .../SimpleLoadBalancer.BalanceInfo.html         |   760 +-
 .../master/balancer/SimpleLoadBalancer.html     |   760 +-
 .../regionserver/HRegion.BatchOperation.html    |  9624 +++---
 .../regionserver/HRegion.FlushResultImpl.html   |  9624 +++---
 .../regionserver/HRegion.MutationBatch.html     |  9624 +++---
 .../HRegion.PrepareFlushResult.html             |  9624 +++---
 .../regionserver/HRegion.RegionScannerImpl.html |  9624 +++---
 .../hbase/regionserver/HRegion.ReplayBatch.html |  9624 +++---
 .../regionserver/HRegion.RowLockContext.html    |  9624 +++---
 .../hbase/regionserver/HRegion.RowLockImpl.html |  9624 +++---
 .../hbase/regionserver/HRegion.WriteState.html  |  9624 +++---
 .../hadoop/hbase/regionserver/HRegion.html      |  9624 +++---
 .../hadoop/hbase/regionserver/wal/WALEdit.html  |   525 +-
 .../hadoop/hbase/rest/client/Cluster.html       |     2 +-
 .../tmpl/master/MasterStatusTmpl.ImplData.html  |   270 +-
 .../tmpl/master/MasterStatusTmpl.Intf.html      |   270 +-
 .../hbase/tmpl/master/MasterStatusTmpl.html     |   270 +-
 .../hbase/tmpl/master/MasterStatusTmplImpl.html |    76 +-
 .../regionserver/RSStatusTmpl.ImplData.html     |   120 +-
 .../tmpl/regionserver/RSStatusTmpl.Intf.html    |   120 +-
 .../hbase/tmpl/regionserver/RSStatusTmpl.html   |   120 +-
 .../tmpl/regionserver/RSStatusTmplImpl.html     |    36 +-
 .../hadoop/hbase/tool/Canary.ExtendedSink.html  |  1247 +-
 .../hadoop/hbase/tool/Canary.Monitor.html       |  1247 +-
 .../hadoop/hbase/tool/Canary.RegionMonitor.html |  1247 +-
 .../hbase/tool/Canary.RegionServerMonitor.html  |  1247 +-
 .../tool/Canary.RegionServerStdOutSink.html     |  1247 +-
 .../hbase/tool/Canary.RegionServerTask.html     |  1247 +-
 .../hbase/tool/Canary.RegionTask.TaskType.html  |  1247 +-
 .../hadoop/hbase/tool/Canary.RegionTask.html    |  1247 +-
 .../apache/hadoop/hbase/tool/Canary.Sink.html   |  1247 +-
 .../hadoop/hbase/tool/Canary.StdOutSink.html    |  1247 +-
 .../org/apache/hadoop/hbase/tool/Canary.html    |  1247 +-
 distribution-management.html                    |     4 +-
 export_control.html                             |     4 +-
 hbase-annotations/checkstyle.html               |     6 +-
 hbase-annotations/dependencies.html             |     6 +-
 hbase-annotations/dependency-convergence.html   |     6 +-
 hbase-annotations/dependency-info.html          |     6 +-
 hbase-annotations/dependency-management.html    |     6 +-
 hbase-annotations/distribution-management.html  |     6 +-
 hbase-annotations/index.html                    |     6 +-
 hbase-annotations/integration.html              |     6 +-
 hbase-annotations/issue-tracking.html           |     6 +-
 hbase-annotations/license.html                  |     6 +-
 hbase-annotations/mail-lists.html               |     6 +-
 hbase-annotations/plugin-management.html        |     6 +-
 hbase-annotations/plugins.html                  |     6 +-
 hbase-annotations/project-info.html             |     6 +-
 hbase-annotations/project-reports.html          |     6 +-
 hbase-annotations/project-summary.html          |     6 +-
 hbase-annotations/source-repository.html        |     6 +-
 hbase-annotations/team-list.html                |     6 +-
 hbase-spark/checkstyle.html                     |     6 +-
 hbase-spark/dependencies.html                   |     6 +-
 hbase-spark/dependency-convergence.html         |     6 +-
 hbase-spark/dependency-info.html                |     6 +-
 hbase-spark/dependency-management.html          |     6 +-
 hbase-spark/distribution-management.html        |     6 +-
 hbase-spark/index.html                          |     6 +-
 hbase-spark/integration.html                    |     6 +-
 hbase-spark/issue-tracking.html                 |     6 +-
 hbase-spark/license.html                        |     6 +-
 hbase-spark/mail-lists.html                     |     6 +-
 hbase-spark/plugin-management.html              |     6 +-
 hbase-spark/plugins.html                        |     6 +-
 hbase-spark/project-info.html                   |     6 +-
 hbase-spark/project-reports.html                |     6 +-
 hbase-spark/project-summary.html                |     6 +-
 hbase-spark/source-repository.html              |     6 +-
 hbase-spark/team-list.html                      |     6 +-
 index.html                                      |     4 +-
 integration.html                                |     4 +-
 issue-tracking.html                             |     4 +-
 license.html                                    |     4 +-
 mail-lists.html                                 |     4 +-
 metrics.html                                    |     4 +-
 modules.html                                    |     4 +-
 old_news.html                                   |     4 +-
 plugin-management.html                          |     4 +-
 plugins.html                                    |     4 +-
 poweredbyhbase.html                             |     4 +-
 project-info.html                               |     4 +-
 project-reports.html                            |     4 +-
 project-summary.html                            |     4 +-
 pseudo-distributed.html                         |     4 +-
 replication.html                                |     4 +-
 resources.html                                  |     4 +-
 source-repository.html                          |     4 +-
 sponsors.html                                   |     4 +-
 supportingprojects.html                         |     4 +-
 team-list.html                                  |     4 +-
 testdevapidocs/index-all.html                   |     8 +-
 .../hbase/TestZooKeeper.MockLoadBalancer.html   |     2 +-
 .../TestAsyncProcess.MyConnectionImpl.html      |    99 +-
 .../TestAsyncProcess.MyConnectionImpl2.html     |    97 +-
 ...luster.ManyServersManyRegionsConnection.html |    97 +-
 ...ionServerStoppedOnScannerOpenConnection.html |    97 +-
 ...estClientNoCluster.RpcTimeoutConnection.html |    97 +-
 ...stClientTimeouts.RandomTimeoutRpcClient.html |     2 +-
 .../hbase/client/TestFromClientSide3.html       |    32 +-
 .../ipc/TestRpcClientLeaks.MyRpcClientImpl.html |     2 +-
 ...signmentManagerOnCluster.MyLoadBalancer.html |     2 +-
 .../TestBaseLoadBalancer.MockBalancer.html      |     2 +-
 .../master/balancer/TestBaseLoadBalancer.html   |    45 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    10 +-
 .../security/access/TestAccessController.html   |    86 +-
 .../apache/hadoop/hbase/test/package-tree.html  |     2 +-
 .../hbase/client/TestFromClientSide3.html       |     8 +-
 .../TestBaseLoadBalancer.MockBalancer.html      |   782 +-
 .../master/balancer/TestBaseLoadBalancer.html   |   782 +-
 .../TestAccessController.BulkLoadHelper.html    |   474 +-
 .../TestAccessController.PingCoprocessor.html   |   474 +-
 ...tAccessController.TestTableDDLProcedure.html |   474 +-
 .../security/access/TestAccessController.html   |   474 +-
 .../hbase/client/TestFromClientSide3.html       |     8 +-
 .../master/balancer/TestBaseLoadBalancer.html   |   782 +-
 .../security/access/TestAccessController.html   |   474 +-
 .../hadoop/hbase/client/ClusterConnection.html  |     7 +-
 .../hbase/client/ConnectionImplementation.html  |     7 +-
 .../hbase/client/MultiServerCallable.html       |   290 +-
 .../hadoop/hbase/ipc/AbstractRpcClient.html     |   361 +-
 xref/org/apache/hadoop/hbase/ipc/RpcClient.html |     8 +-
 .../hbase/mapreduce/TableInputFormatBase.html   |    10 +-
 .../hbase/mapreduce/TableMapReduceUtil.html     |     4 +-
 .../hadoop/hbase/mapreduce/TableSplit.html      |    99 +-
 .../hadoop/hbase/master/LoadBalancer.html       |   205 +-
 .../hbase/master/balancer/BaseLoadBalancer.html |   519 +-
 .../master/balancer/SimpleLoadBalancer.html     |   760 +-
 .../hadoop/hbase/protobuf/ProtobufUtil.html     |  4048 ++-
 .../hadoop/hbase/protobuf/RequestConverter.html |  2056 +-
 .../hadoop/hbase/regionserver/HRegion.html      |  9624 +++---
 .../hadoop/hbase/regionserver/wal/WALEdit.html  |   525 +-
 .../hadoop/hbase/rest/client/Cluster.html       |     2 +-
 .../hbase/tmpl/common/TaskMonitorTmpl.html      |    60 +-
 .../hbase/tmpl/common/TaskMonitorTmplImpl.html  |    16 +-
 .../hbase/tmpl/master/MasterStatusTmpl.html     |   270 +-
 .../hbase/tmpl/master/MasterStatusTmplImpl.html |    76 +-
 .../hbase/tmpl/regionserver/RSStatusTmpl.html   |   120 +-
 .../tmpl/regionserver/RSStatusTmplImpl.html     |    36 +-
 xref/org/apache/hadoop/hbase/tool/Canary.html   |  1247 +-
 239 files changed, 86450 insertions(+), 86683 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 8350946..f6ef090 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160210" />
+    <meta name="Date-Revision-yyyymmdd" content="20160211" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -600,7 +600,7 @@ under the License. -->
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-11</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 15fd93e..011e924 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.6, based on Prawn 1.2.1)
 /Producer (Apache HBase Team)
-/CreationDate (D:20160210153420+00'00')
-/ModDate (D:20160210153420+00'00')
+/CreationDate (D:20160211153628+00'00')
+/ModDate (D:20160211153628+00'00')
 >>
 endobj
 2 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/apache_hbase_reference_guide.pdfmarks
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdfmarks b/apache_hbase_reference_guide.pdfmarks
index 4e91a55..99d5ad8 100644
--- a/apache_hbase_reference_guide.pdfmarks
+++ b/apache_hbase_reference_guide.pdfmarks
@@ -2,8 +2,8 @@
   /Author (Apache HBase Team)
   /Subject ()
   /Keywords ()
-  /ModDate (D:20160210153610)
-  /CreationDate (D:20160210153610)
+  /ModDate (D:20160211153818)
+  /CreationDate (D:20160211153818)
   /Creator (Asciidoctor PDF 1.5.0.alpha.6, based on Prawn 1.2.1)
   /Producer ()
   /DOCINFO pdfmark

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/apidocs/index-all.html
----------------------------------------------------------------------
diff --git a/apidocs/index-all.html b/apidocs/index-all.html
index cea5c48..d42c9b7 100644
--- a/apidocs/index-all.html
+++ b/apidocs/index-all.html
@@ -1598,6 +1598,14 @@
 <dd>
 <div class="block">Converts a long expressed in a byte array to an actual long</div>
 </dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#convertScanToString(org.apache.hadoop.hbase.client.Scan)">convertScanToString(Scan)</a></span> - Static method in class org.apache.hadoop.hbase.mapreduce.<a href="./org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapReduceUtil</a></dt>
+<dd>
+<div class="block">Writes the given scan into a Base64 encoded string.</div>
+</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#convertStringToScan(java.lang.String)">convertStringToScan(String)</a></span> - Static method in class org.apache.hadoop.hbase.mapreduce.<a href="./org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html" title="class in org.apache.hadoop.hbase.mapreduce">TableMapReduceUtil</a></dt>
+<dd>
+<div class="block">Converts the given Base64 string back into a Scan instance.</div>
+</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/ProcedureInfo.html#convertToProcedureProto(org.apache.hadoop.hbase.ProcedureInfo)">convertToProcedureProto(ProcedureInfo)</a></span> - Static method in class org.apache.hadoop.hbase.<a href="./org/apache/hadoop/hbase/ProcedureInfo.html" title="class in org.apache.hadoop.hbase">ProcedureInfo</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/HBaseInterfaceAudience.html#COPROC">COPROC</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="./org/apache/hadoop/hbase/HBaseInterfaceAudience.html" title="class in org.apache.hadoop.hbase">HBaseInterfaceAudience</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/apidocs/org/apache/hadoop/hbase/client/class-use/Scan.html
----------------------------------------------------------------------
diff --git a/apidocs/org/apache/hadoop/hbase/client/class-use/Scan.html b/apidocs/org/apache/hadoop/hbase/client/class-use/Scan.html
index a5ff7e9..ab7da16 100644
--- a/apidocs/org/apache/hadoop/hbase/client/class-use/Scan.html
+++ b/apidocs/org/apache/hadoop/hbase/client/class-use/Scan.html
@@ -397,12 +397,18 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </tr>
 <tbody>
 <tr class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a></code></td>
+<td class="colLast"><span class="strong">TableMapReduceUtil.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#convertStringToScan(java.lang.String)">convertStringToScan</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;base64)</code>
+<div class="block">Converts the given Base64 string back into a Scan instance.</div>
+</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a></code></td>
 <td class="colLast"><span class="strong">TableSplit.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.html#getScan()">getScan</a></strong>()</code>
 <div class="block">Returns a Scan object from the stored string representation.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a></code></td>
 <td class="colLast"><span class="strong">TableInputFormatBase.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html#getScan()">getScan</a></strong>()</code>
 <div class="block">Gets the scan defining the actual details like columns etc.</div>
@@ -440,6 +446,12 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>static <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><span class="strong">TableMapReduceUtil.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#convertScanToString(org.apache.hadoop.hbase.client.Scan)">convertScanToString</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)</code>
+<div class="block">Writes the given scan into a Base64 encoded string.</div>
+</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="strong">IdentityTableMapper.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/IdentityTableMapper.html#initJob(java.lang.String,%20org.apache.hadoop.hbase.client.Scan,%20java.lang.Class,%20org.apache.hadoop.mapreduce.Job)">initJob</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
               <a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
@@ -448,7 +460,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Use this before submitting a TableMap job.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="strong">GroupingTableMapper.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/GroupingTableMapper.html#initJob(java.lang.String,%20org.apache.hadoop.hbase.client.Scan,%20java.lang.String,%20java.lang.Class,%20org.apache.hadoop.mapreduce.Job)">initJob</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
               <a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
@@ -458,7 +470,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Use this before submitting a TableMap job.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="strong">TableMapReduceUtil.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#initTableMapperJob(byte[],%20org.apache.hadoop.hbase.client.Scan,%20java.lang.Class,%20java.lang.Class,%20java.lang.Class,%20org.apache.hadoop.mapreduce.Job)">initTableMapperJob</a></strong>(byte[]&nbsp;table,
                                     <a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
@@ -469,7 +481,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Use this before submitting a TableMap job.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="strong">TableMapReduceUtil.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#initTableMapperJob(byte[],%20org.apache.hadoop.hbase.client.Scan,%20java.lang.Class,%20java.lang.Class,%20java.lang.Class,%20org.apache.hadoop.mapreduce.Job,%20boolean)">initTableMapperJob</a></strong>(byte[]&nbsp;table,
                                     <a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
@@ -481,7 +493,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Use this before submitting a TableMap job.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="strong">TableMapReduceUtil.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#initTableMapperJob(byte[],%20org.apache.hadoop.hbase.client.Scan,%20java.lang.Class,%20java.lang.Class,%20java.lang.Class,%20org.apache.hadoop.mapreduce.Job,%20boolean,%20java.lang.Class)">initTableMapperJob</a></strong>(byte[]&nbsp;table,
                                     <a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
@@ -494,7 +506,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Use this before submitting a TableMap job.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="strong">TableMapReduceUtil.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#initTableMapperJob(java.lang.String,%20org.apache.hadoop.hbase.client.Scan,%20java.lang.Class,%20java.lang.Class,%20java.lang.Class,%20org.apache.hadoop.mapreduce.Job)">initTableMapperJob</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                                     <a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
@@ -505,7 +517,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Use this before submitting a TableMap job.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="strong">TableMapReduceUtil.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#initTableMapperJob(java.lang.String,%20org.apache.hadoop.hbase.client.Scan,%20java.lang.Class,%20java.lang.Class,%20java.lang.Class,%20org.apache.hadoop.mapreduce.Job,%20boolean)">initTableMapperJob</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                                     <a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
@@ -517,7 +529,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Use this before submitting a TableMap job.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="strong">TableMapReduceUtil.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#initTableMapperJob(java.lang.String,%20org.apache.hadoop.hbase.client.Scan,%20java.lang.Class,%20java.lang.Class,%20java.lang.Class,%20org.apache.hadoop.mapreduce.Job,%20boolean,%20boolean,%20java.lang.Class)">initTableMapperJob</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                                     <a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
@@ -531,7 +543,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Use this before submitting a TableMap job.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="strong">TableMapReduceUtil.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#initTableMapperJob(java.lang.String,%20org.apache.hadoop.hbase.client.Scan,%20java.lang.Class,%20java.lang.Class,%20java.lang.Class,%20org.apache.hadoop.mapreduce.Job,%20boolean,%20java.lang.Class)">initTableMapperJob</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;table,
                                     <a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
@@ -544,7 +556,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Use this before submitting a TableMap job.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="strong">TableMapReduceUtil.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#initTableMapperJob(org.apache.hadoop.hbase.TableName,%20org.apache.hadoop.hbase.client.Scan,%20java.lang.Class,%20java.lang.Class,%20java.lang.Class,%20org.apache.hadoop.mapreduce.Job)">initTableMapperJob</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;table,
                                     <a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
@@ -555,7 +567,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Use this before submitting a TableMap job.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="strong">TableMapReduceUtil.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#initTableSnapshotMapperJob(java.lang.String,%20org.apache.hadoop.hbase.client.Scan,%20java.lang.Class,%20java.lang.Class,%20java.lang.Class,%20org.apache.hadoop.mapreduce.Job,%20boolean,%20org.apache.hadoop.fs.Path)">initTableSnapshotMapperJob</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;snapshotName,
                                                     <a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
@@ -568,19 +580,19 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Sets up the job for reading from a table snapshot.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="strong">TableRecordReaderImpl.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableRecordReaderImpl.html#setScan(org.apache.hadoop.hbase.client.Scan)">setScan</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)</code>
 <div class="block">Sets the scan defining the actual details like columns etc.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="strong">TableRecordReader.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableRecordReader.html#setScan(org.apache.hadoop.hbase.client.Scan)">setScan</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)</code>
 <div class="block">Sets the scan defining the actual details like columns etc.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="strong">TableInputFormatBase.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html#setScan(org.apache.hadoop.hbase.client.Scan)">setScan</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)</code>
 <div class="block">Sets the scan defining the actual details like columns etc.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/apidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
----------------------------------------------------------------------
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html b/apidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
index e531f43..c6bd1ee 100644
--- a/apidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
@@ -165,6 +165,18 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 </td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>static <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#convertScanToString(org.apache.hadoop.hbase.client.Scan)">convertScanToString</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)</code>
+<div class="block">Writes the given scan into a Base64 encoded string.</div>
+</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a></code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#convertStringToScan(java.lang.String)">convertStringToScan</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;base64)</code>
+<div class="block">Converts the given Base64 string back into a Scan instance.</div>
+</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#initCredentials(org.apache.hadoop.mapreduce.Job)">initCredentials</a></strong>(org.apache.hadoop.mapreduce.Job&nbsp;job)</code>&nbsp;</td>
 </tr>
@@ -811,6 +823,36 @@ public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code> - When the authentication token cannot be obtained.</dd></dl>
 </li>
 </ul>
+<a name="convertScanToString(org.apache.hadoop.hbase.client.Scan)">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>convertScanToString</h4>
+<pre>public static&nbsp;<a href="http://docs.oracle.com/javase/7/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/mapreduce/TableMapReduceUtil.html#line.564">convertScanToString</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan)
+                                  throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<div class="block">Writes the given scan into a Base64 encoded string.</div>
+<dl><dt><span class="strong">Parameters:</span></dt><dd><code>scan</code> - The scan to write out.</dd>
+<dt><span class="strong">Returns:</span></dt><dd>The scan saved in a Base64 encoded string.</dd>
+<dt><span class="strong">Throws:</span></dt>
+<dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code> - When writing the scan fails.</dd></dl>
+</li>
+</ul>
+<a name="convertStringToScan(java.lang.String)">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>convertStringToScan</h4>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html#line.576">convertStringToScan</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;base64)
+                                throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<div class="block">Converts the given Base64 string back into a Scan instance.</div>
+<dl><dt><span class="strong">Parameters:</span></dt><dd><code>base64</code> - The scan details.</dd>
+<dt><span class="strong">Returns:</span></dt><dd>The newly created Scan instance.</dd>
+<dt><span class="strong">Throws:</span></dt>
+<dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code> - When reading the scan instance fails.</dd></dl>
+</li>
+</ul>
 <a name="initTableReducerJob(java.lang.String, java.lang.Class, org.apache.hadoop.mapreduce.Job)">
 <!--   -->
 </a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/apidocs/org/apache/hadoop/hbase/mapreduce/TableSplit.html
----------------------------------------------------------------------
diff --git a/apidocs/org/apache/hadoop/hbase/mapreduce/TableSplit.html b/apidocs/org/apache/hadoop/hbase/mapreduce/TableSplit.html
index a61d279..79b2c87 100644
--- a/apidocs/org/apache/hadoop/hbase/mapreduce/TableSplit.html
+++ b/apidocs/org/apache/hadoop/hbase/mapreduce/TableSplit.html
@@ -565,7 +565,7 @@ public static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../
 <ul class="blockList">
 <li class="blockList">
 <h4>compareTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html#line.320">compareTo</a>(<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.html" title="class in org.apache.hadoop.hbase.mapreduce">TableSplit</a>&nbsp;split)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html#line.331">compareTo</a>(<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.html" title="class in org.apache.hadoop.hbase.mapreduce">TableSplit</a>&nbsp;split)</pre>
 <div class="block">Compares this split against the given one.</div>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -580,7 +580,7 @@ public static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../
 <ul class="blockList">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html#line.330">equals</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;o)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html#line.341">equals</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;o)</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -593,7 +593,7 @@ public static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../
 <ul class="blockListLast">
 <li class="blockList">
 <h4>hashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html#line.341">hashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html#line.352">hashCode</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.lang">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html
index 5344a96..6c2b2de 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.html
@@ -274,7 +274,7 @@
 <span class="sourceLineNo">266</span>        }<a name="line.266"></a>
 <span class="sourceLineNo">267</span>        List&lt;InputSplit&gt; splits = new ArrayList&lt;InputSplit&gt;(1);<a name="line.267"></a>
 <span class="sourceLineNo">268</span>        long regionSize = sizeCalculator.getRegionSize(regLoc.getRegionInfo().getRegionName());<a name="line.268"></a>
-<span class="sourceLineNo">269</span>        TableSplit split = new TableSplit(tableName,<a name="line.269"></a>
+<span class="sourceLineNo">269</span>        TableSplit split = new TableSplit(tableName, scan,<a name="line.269"></a>
 <span class="sourceLineNo">270</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY, regLoc<a name="line.270"></a>
 <span class="sourceLineNo">271</span>                .getHostnamePort().split(Addressing.HOSTNAME_PORT_SEPARATOR)[0], regionSize);<a name="line.271"></a>
 <span class="sourceLineNo">272</span>        splits.add(split);<a name="line.272"></a>
@@ -317,7 +317,7 @@
 <span class="sourceLineNo">309</span>  <a name="line.309"></a>
 <span class="sourceLineNo">310</span>          byte[] regionName = location.getRegionInfo().getRegionName();<a name="line.310"></a>
 <span class="sourceLineNo">311</span>          long regionSize = sizeCalculator.getRegionSize(regionName);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          TableSplit split = new TableSplit(tableName,<a name="line.312"></a>
+<span class="sourceLineNo">312</span>          TableSplit split = new TableSplit(tableName, scan,<a name="line.312"></a>
 <span class="sourceLineNo">313</span>            splitStart, splitStop, regionLocation, regionSize);<a name="line.313"></a>
 <span class="sourceLineNo">314</span>          splits.add(split);<a name="line.314"></a>
 <span class="sourceLineNo">315</span>          if (LOG.isDebugEnabled()) {<a name="line.315"></a>
@@ -405,9 +405,9 @@
 <span class="sourceLineNo">397</span>        byte[] splitKey = getSplitKey(ts.getStartRow(), ts.getEndRow(), isTextKey);<a name="line.397"></a>
 <span class="sourceLineNo">398</span>         //Set the size of child TableSplit as 1/2 of the region size. The exact size of the<a name="line.398"></a>
 <span class="sourceLineNo">399</span>         // MapReduce input splits is not far off.<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        TableSplit t1 = new TableSplit(tableName, ts.getStartRow(), splitKey, regionLocation,<a name="line.400"></a>
+<span class="sourceLineNo">400</span>        TableSplit t1 = new TableSplit(tableName, scan, ts.getStartRow(), splitKey, regionLocation,<a name="line.400"></a>
 <span class="sourceLineNo">401</span>                regionSize / 2);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        TableSplit t2 = new TableSplit(tableName, splitKey, ts.getEndRow(), regionLocation,<a name="line.402"></a>
+<span class="sourceLineNo">402</span>        TableSplit t2 = new TableSplit(tableName, scan, splitKey, ts.getEndRow(), regionLocation,<a name="line.402"></a>
 <span class="sourceLineNo">403</span>                regionSize - regionSize / 2);<a name="line.403"></a>
 <span class="sourceLineNo">404</span>        resultList.add(t1);<a name="line.404"></a>
 <span class="sourceLineNo">405</span>        resultList.add(t2);<a name="line.405"></a>
@@ -434,7 +434,7 @@
 <span class="sourceLineNo">426</span>            break;<a name="line.426"></a>
 <span class="sourceLineNo">427</span>          }<a name="line.427"></a>
 <span class="sourceLineNo">428</span>        }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        TableSplit t = new TableSplit(tableName, splitStartKey, splitEndKey,<a name="line.429"></a>
+<span class="sourceLineNo">429</span>        TableSplit t = new TableSplit(tableName, scan, splitStartKey, splitEndKey,<a name="line.429"></a>
 <span class="sourceLineNo">430</span>                regionLocation, totalSize);<a name="line.430"></a>
 <span class="sourceLineNo">431</span>        resultList.add(t);<a name="line.431"></a>
 <span class="sourceLineNo">432</span>      }<a name="line.432"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
index 4bcfbd0..a5703ad 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.html
@@ -569,7 +569,7 @@
 <span class="sourceLineNo">561</span>   * @return The scan saved in a Base64 encoded string.<a name="line.561"></a>
 <span class="sourceLineNo">562</span>   * @throws IOException When writing the scan fails.<a name="line.562"></a>
 <span class="sourceLineNo">563</span>   */<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  static String convertScanToString(Scan scan) throws IOException {<a name="line.564"></a>
+<span class="sourceLineNo">564</span>  public static String convertScanToString(Scan scan) throws IOException {<a name="line.564"></a>
 <span class="sourceLineNo">565</span>    ClientProtos.Scan proto = ProtobufUtil.toScan(scan);<a name="line.565"></a>
 <span class="sourceLineNo">566</span>    return Base64.encodeBytes(proto.toByteArray());<a name="line.566"></a>
 <span class="sourceLineNo">567</span>  }<a name="line.567"></a>
@@ -581,7 +581,7 @@
 <span class="sourceLineNo">573</span>   * @return The newly created Scan instance.<a name="line.573"></a>
 <span class="sourceLineNo">574</span>   * @throws IOException When reading the scan instance fails.<a name="line.574"></a>
 <span class="sourceLineNo">575</span>   */<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  static Scan convertStringToScan(String base64) throws IOException {<a name="line.576"></a>
+<span class="sourceLineNo">576</span>  public static Scan convertStringToScan(String base64) throws IOException {<a name="line.576"></a>
 <span class="sourceLineNo">577</span>    byte [] decoded = Base64.decode(base64);<a name="line.577"></a>
 <span class="sourceLineNo">578</span>    ClientProtos.Scan scan;<a name="line.578"></a>
 <span class="sourceLineNo">579</span>    try {<a name="line.579"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html
index 5cb57d5..ab01266 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html
@@ -309,52 +309,63 @@
 <span class="sourceLineNo">301</span>    StringBuilder sb = new StringBuilder();<a name="line.301"></a>
 <span class="sourceLineNo">302</span>    sb.append("HBase table split(");<a name="line.302"></a>
 <span class="sourceLineNo">303</span>    sb.append("table name: ").append(tableName);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    sb.append(", scan: ").append(scan);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    sb.append(", start row: ").append(Bytes.toStringBinary(startRow));<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    sb.append(", end row: ").append(Bytes.toStringBinary(endRow));<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    sb.append(", region location: ").append(regionLocation);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    sb.append(")");<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    return sb.toString();<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>  /**<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * Compares this split against the given one.<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   *<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   * @param split  The split to compare to.<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * @return The result of the comparison.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   * @see java.lang.Comparable#compareTo(java.lang.Object)<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   */<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  @Override<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  public int compareTo(TableSplit split) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    // If The table name of the two splits is the same then compare start row<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    // otherwise compare based on table names<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    int tableNameComparison =<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        getTable().compareTo(split.getTable());<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    return tableNameComparison != 0 ? tableNameComparison : Bytes.compareTo(<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        getStartRow(), split.getStartRow());<a name="line.326"></a>
-<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>  @Override<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  public boolean equals(Object o) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    if (o == null || !(o instanceof TableSplit)) {<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>    return tableName.equals(((TableSplit)o).tableName) &amp;&amp;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      Bytes.equals(startRow, ((TableSplit)o).startRow) &amp;&amp;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      Bytes.equals(endRow, ((TableSplit)o).endRow) &amp;&amp;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      regionLocation.equals(((TableSplit)o).regionLocation);<a name="line.337"></a>
+<span class="sourceLineNo">304</span>    // null scan input is represented by ""<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    String printScan = "";<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (!scan.equals("")) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      try {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        // get the real scan here in toString, not the Base64 string<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        printScan = TableMapReduceUtil.convertStringToScan(scan).toString();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      catch (IOException e) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        printScan = "";<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      }<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    }<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    sb.append(", scan: ").append(printScan);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    sb.append(", start row: ").append(Bytes.toStringBinary(startRow));<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    sb.append(", end row: ").append(Bytes.toStringBinary(endRow));<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    sb.append(", region location: ").append(regionLocation);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    sb.append(")");<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    return sb.toString();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  }<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>   * Compares this split against the given one.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   *<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * @param split  The split to compare to.<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * @return The result of the comparison.<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * @see java.lang.Comparable#compareTo(java.lang.Object)<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   */<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  @Override<a name="line.330"></a>
+<span class="sourceLineNo">331</span>  public int compareTo(TableSplit split) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    // If The table name of the two splits is the same then compare start row<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    // otherwise compare based on table names<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    int tableNameComparison =<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        getTable().compareTo(split.getTable());<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    return tableNameComparison != 0 ? tableNameComparison : Bytes.compareTo(<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        getStartRow(), split.getStartRow());<a name="line.337"></a>
 <span class="sourceLineNo">338</span>  }<a name="line.338"></a>
 <span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>    @Override<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    public int hashCode() {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        int result = tableName != null ? tableName.hashCode() : 0;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        result = 31 * result + (scan != null ? scan.hashCode() : 0);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>        result = 31 * result + (startRow != null ? Arrays.hashCode(startRow) : 0);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        result = 31 * result + (endRow != null ? Arrays.hashCode(endRow) : 0);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        result = 31 * result + (regionLocation != null ? regionLocation.hashCode() : 0);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        return result;<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>}<a name="line.349"></a>
+<span class="sourceLineNo">340</span>  @Override<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  public boolean equals(Object o) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (o == null || !(o instanceof TableSplit)) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      return false;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    return tableName.equals(((TableSplit)o).tableName) &amp;&amp;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      Bytes.equals(startRow, ((TableSplit)o).startRow) &amp;&amp;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      Bytes.equals(endRow, ((TableSplit)o).endRow) &amp;&amp;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      regionLocation.equals(((TableSplit)o).regionLocation);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    @Override<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    public int hashCode() {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        int result = tableName != null ? tableName.hashCode() : 0;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        result = 31 * result + (scan != null ? scan.hashCode() : 0);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        result = 31 * result + (startRow != null ? Arrays.hashCode(startRow) : 0);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        result = 31 * result + (endRow != null ? Arrays.hashCode(endRow) : 0);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        result = 31 * result + (regionLocation != null ? regionLocation.hashCode() : 0);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        return result;<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/apidocs/src-html/org/apache/hadoop/hbase/rest/client/Cluster.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/rest/client/Cluster.html b/apidocs/src-html/org/apache/hadoop/hbase/rest/client/Cluster.html
index 6842786..7f0ebee 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/rest/client/Cluster.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/rest/client/Cluster.html
@@ -55,7 +55,7 @@
 <span class="sourceLineNo">047</span>   * @param nodes a list of service locations, in 'host:port' format<a name="line.47"></a>
 <span class="sourceLineNo">048</span>   */<a name="line.48"></a>
 <span class="sourceLineNo">049</span>  public Cluster(List&lt;String&gt; nodes) {<a name="line.49"></a>
-<span class="sourceLineNo">050</span>    nodes.addAll(nodes);<a name="line.50"></a>
+<span class="sourceLineNo">050</span>    this.nodes.addAll(nodes);<a name="line.50"></a>
 <span class="sourceLineNo">051</span>  }<a name="line.51"></a>
 <span class="sourceLineNo">052</span><a name="line.52"></a>
 <span class="sourceLineNo">053</span>  /**<a name="line.53"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 32526ea..bd9a097 100644
--- a/book.html
+++ b/book.html
@@ -33124,7 +33124,7 @@ The server will return cellblocks compressed using this same compressor as long
 <div id="footer">
 <div id="footer-text">
 Version 2.0.0-SNAPSHOT<br>
-Last updated 2016-02-10 15:07:37 UTC
+Last updated 2016-02-11 15:09:33 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index 6dd4a03..11bdfcc 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160210" />
+    <meta name="Date-Revision-yyyymmdd" content="20160211" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -305,7 +305,7 @@ under the License. -->
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-02-10</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-02-11</li>
             </p>
                 </div>
 


[22/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
index fbdde18..1d64963 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
@@ -2959,7 +2959,7 @@
 <span class="sourceLineNo">2951</span>    Set&lt;byte[]&gt; deletesCfSet = null;<a name="line.2951"></a>
 <span class="sourceLineNo">2952</span>    long currentNonceGroup = HConstants.NO_NONCE;<a name="line.2952"></a>
 <span class="sourceLineNo">2953</span>    long currentNonce = HConstants.NO_NONCE;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    WALEdit walEdit = new WALEdit(replay);<a name="line.2954"></a>
+<span class="sourceLineNo">2954</span>    WALEdit walEdit = null;<a name="line.2954"></a>
 <span class="sourceLineNo">2955</span>    boolean locked = false;<a name="line.2955"></a>
 <span class="sourceLineNo">2956</span>    // reference family maps directly so coprocessors can mutate them if desired<a name="line.2956"></a>
 <span class="sourceLineNo">2957</span>    Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps = new Map[batchOp.operations.length];<a name="line.2957"></a>
@@ -2970,4878 +2970,4890 @@
 <span class="sourceLineNo">2962</span>    int noOfPuts = 0;<a name="line.2962"></a>
 <span class="sourceLineNo">2963</span>    int noOfDeletes = 0;<a name="line.2963"></a>
 <span class="sourceLineNo">2964</span>    WriteEntry writeEntry = null;<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    try {<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>      int numReadyToWrite = 0;<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>          lastIndexExclusive++;<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>          continue;<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>        }<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>        RowLock rowLock = null;<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>        try {<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>        } catch (IOException ioe) {<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span>        }<a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>        if (rowLock == null) {<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>          // We failed to grab another lock<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>          break; // Stop acquiring more rows for this batch<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>        } else {<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>          acquiredRowLocks.add(rowLock);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span>        }<a name="line.2989"></a>
-<span class="sourceLineNo">2990</span><a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>        lastIndexExclusive++;<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>        numReadyToWrite++;<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span><a name="line.2993"></a>
-<span class="sourceLineNo">2994</span>        if (mutation instanceof Put) {<a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>          // If Column Families stay consistent through out all of the<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>          // individual puts then metrics can be reported as a multiput across<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>          // column families in the first put.<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>          if (putsCfSet == null) {<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>          } else {<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span>          }<a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>        } else {<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>          if (deletesCfSet == null) {<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>          } else {<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>          }<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span>        }<a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>      }<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span><a name="line.3013"></a>
-<span class="sourceLineNo">3014</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3014"></a>
-<span class="sourceLineNo">3015</span><a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3020"></a>
-<span class="sourceLineNo">3021</span><a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>        return 0L;<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>      }<a name="line.3025"></a>
+<span class="sourceLineNo">2965</span>    int cellCount = 0;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    try {<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>      int numReadyToWrite = 0;<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>          lastIndexExclusive++;<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span>          continue;<a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>        }<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>        RowLock rowLock = null;<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span>        try {<a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>        } catch (IOException ioe) {<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>        }<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>        if (rowLock == null) {<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>          // We failed to grab another lock<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span>          break; // Stop acquiring more rows for this batch<a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>        } else {<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>          acquiredRowLocks.add(rowLock);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>        }<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span><a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>        lastIndexExclusive++;<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span>        numReadyToWrite++;<a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>        if (replay) {<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>          for (List&lt;Cell&gt; cells : mutation.getFamilyCellMap().values()) {<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>            cellCount += cells.size();<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>          }<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>        }<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span>        if (mutation instanceof Put) {<a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>          // If Column Families stay consistent through out all of the<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>          // individual puts then metrics can be reported as a multiput across<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>          // column families in the first put.<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>          if (putsCfSet == null) {<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>          } else {<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>          }<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>        } else {<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>          if (deletesCfSet == null) {<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>          } else {<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>          }<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>        }<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>      }<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span><a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span><a name="line.3020"></a>
+<span class="sourceLineNo">3021</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3025"></a>
 <span class="sourceLineNo">3026</span><a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span>        // skip invalid<a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>          // lastIndexExclusive was incremented above.<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span>          continue;<a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>        }<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span><a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>        if (mutation instanceof Put) {<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>          noOfPuts++;<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>        } else {<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>          noOfDeletes++;<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>        }<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span>      }<a name="line.3044"></a>
-<span class="sourceLineNo">3045</span><a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>      locked = true;<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span><a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>      // calling the pre CP hook for batch mutation<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>          return 0L;<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>        }<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>      }<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span><a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>      // STEP 3. Build WAL edit<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>          continue;<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>        }<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>        Mutation m = batchOp.getMutation(i);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>          durability = tmpDur;<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>        }<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>          continue;<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span>        }<a name="line.3075"></a>
-<span class="sourceLineNo">3076</span><a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>        long nonce = batchOp.getNonce(i);<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>          // Write what we have so far for nonces out to WAL<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>          walEdit = new WALEdit(replay);<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span>          currentNonceGroup = nonceGroup;<a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>          currentNonce = nonce;<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>        }<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span><a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>        // Add WAL edits by CP<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>        if (fromCP != null) {<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span>            walEdit.add(cell);<a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>          }<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>        }<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span>      }<a name="line.3098"></a>
-<span class="sourceLineNo">3099</span><a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>      WALKey walKey = null;<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>      if (replay) {<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>        // use wal key from the original<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3107"></a>
-<span class="sourceLineNo">3108</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>      }<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>      if (!walEdit.isEmpty()) {<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>        if (!replay) {<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>        }<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>        try {<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span>          long txid =<a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>          if (txid != 0) sync(txid, durability);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span>          writeEntry = walKey.getWriteEntry();<a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>        } catch (IOException ioe) {<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>          throw ioe;<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>        }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>      }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span>      if (walKey == null) {<a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>        writeEntry = mvcc.begin();<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>      }<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span><a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>      // STEP 5. Write back to memstore<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>      long addedSize = 0;<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>          continue;<a name="line.3139"></a>
+<span class="sourceLineNo">3027</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>        return 0L;<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span>      }<a name="line.3030"></a>
+<span class="sourceLineNo">3031</span><a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>        // skip invalid<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>          // lastIndexExclusive was incremented above.<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>          continue;<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span>        }<a name="line.3038"></a>
+<span class="sourceLineNo">3039</span><a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>        if (mutation instanceof Put) {<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>          noOfPuts++;<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>        } else {<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>          noOfDeletes++;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>        }<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span>        if (fromCP != null) {<a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>          cellCount += fromCP.size();<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>        }<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>        for (List&lt;Cell&gt; cells : familyMaps[i].values()) {<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span>          cellCount += cells.size();<a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>        }<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>      }<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>      walEdit = new WALEdit(cellCount, replay);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>      locked = true;<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span><a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>      // calling the pre CP hook for batch mutation<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>          return 0L;<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>        }<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>      }<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>      // STEP 3. Build WAL edit<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span>          continue;<a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>        }<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span><a name="line.3078"></a>
+<span class="sourceLineNo">3079</span>        Mutation m = batchOp.getMutation(i);<a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>          durability = tmpDur;<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>        }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>          continue;<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>        }<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span><a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>        long nonce = batchOp.getNonce(i);<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>          // Write what we have so far for nonces out to WAL<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>          walEdit = new WALEdit(cellCount, replay);<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>          currentNonceGroup = nonceGroup;<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>          currentNonce = nonce;<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>        }<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span><a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>        // Add WAL edits by CP<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span>        if (fromCP != null) {<a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>            walEdit.add(cell);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>          }<a name="line.3107"></a>
+<span class="sourceLineNo">3108</span>        }<a name="line.3108"></a>
+<span class="sourceLineNo">3109</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>      }<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span><a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>      WALKey walKey = null;<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>      if (replay) {<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>        // use wal key from the original<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>      }<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>      if (!walEdit.isEmpty()) {<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span>        if (!replay) {<a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>        }<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>        try {<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>          long txid =<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>          if (txid != 0) sync(txid, durability);<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>          writeEntry = walKey.getWriteEntry();<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>        } catch (IOException ioe) {<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>          throw ioe;<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span>        }<a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span>      }<a name="line.3143"></a>
-<span class="sourceLineNo">3144</span><a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>      // STEP 6. Complete mvcc.<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>      if (replay) {<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>        mvcc.completeAndWait(writeEntry);<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>        writeEntry = null;<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span>      }<a name="line.3151"></a>
-<span class="sourceLineNo">3152</span><a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>      // STEP 7. Release row locks, etc.<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>      if (locked) {<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span>        this.updatesLock.readLock().unlock();<a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>        locked = false;<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>      }<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>      // calling the post CP hook for batch mutation<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>      }<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span><a name="line.3167"></a>
-<span class="sourceLineNo">3168</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>        }<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>      }<a name="line.3172"></a>
-<span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>          // only for successful puts<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span>              != OperationStatusCode.SUCCESS) {<a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>            continue;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>          }<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>          Mutation m = batchOp.getMutation(i);<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>          if (m instanceof Put) {<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>          } else {<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>          }<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>        }<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>      }<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span><a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>      success = true;<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span>      return addedSize;<a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    } finally {<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>      if (locked) {<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span>        this.updatesLock.readLock().unlock();<a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>      }<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span><a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>      // See if the column families were consistent through the whole thing.<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>      // null will be treated as unknown.<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span><a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>      if (noOfPuts &gt; 0) {<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>        // There were some Puts in the batch.<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>        if (this.metricsRegion != null) {<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span>          this.metricsRegion.updatePut();<a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>        }<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>      }<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>      if (noOfDeletes &gt; 0) {<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>        // There were some Deletes in the batch.<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>        if (this.metricsRegion != null) {<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span>          this.metricsRegion.updateDelete();<a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>        }<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>      }<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>      if (!success) {<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>          }<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>        }<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>      }<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>        // call the coprocessor hook to do any finalization steps<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>        // after the put is done<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>                lastIndexExclusive);<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>      }<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span><a name="line.3236"></a>
-<span class="sourceLineNo">3237</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    }<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>  }<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>  throws IOException {<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    if (walEdit.isEmpty()) return;<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>  }<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span><a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>  throws IOException {<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    boolean skip = false;<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    // Skip anything that "ran" already<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>      return true;<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span>    }<a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span>    // store the family map reference to allow for mutations<a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    try {<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>      if (mutation instanceof Put) {<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>        // Check the families in the put. If bad, skip this one.<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>        if (batchOp.isInReplay()) {<a name="line.3271"></a>
-<span class="sourceLineNo">3272</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>        } else {<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>          checkFamilies(familyMap.keySet());<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>        }<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>      } else {<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span>        prepareDelete((Delete)mutation);<a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>      }<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>      skip = true;<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>      skip = true;<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    } catch (WrongRegionException we) {<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>      skip = true;<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    }<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    return skip;<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>  }<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>  /**<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>   * During replay, there could exist column families which are removed between region server<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>   * failure and replay<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>   */<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>        if (nonExistentList == null) {<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span>        }<a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>        nonExistentList.add(family);<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>      }<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>    }<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>    if (nonExistentList != null) {<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>      for (byte[] family : nonExistentList) {<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>        // Perhaps schema was changed between crash and replay<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>        familyMap.remove(family);<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>      }<a name="line.3319"></a>
-<span class="sourceLineNo">3320</span>    }<a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>  }<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span><a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>  /**<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span>   * Returns effective durability from the passed durability and<a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>   * the table descriptor.<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span>   */<a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>  }<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span><a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>  @Override<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      boolean writeToWAL)<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>  throws IOException{<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    checkMutationType(mutation, row);<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>      mutation, writeToWAL);<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>  }<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span><a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>  @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3343"></a>
-<span class="sourceLineNo">3344</span>      boolean writeToWAL)<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>  throws IOException {<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, rm, null,<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>      writeToWAL);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>  }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span><a name="line.3349"></a>
-<span class="sourceLineNo">3350</span>  /**<a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>   * checkAndMutate and checkAndRowMutate are 90% the same. Rather than copy/paste, below has<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>   * switches in the few places where there is deviation.<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span>   */<a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>  private boolean doCheckAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rowMutations,<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>      Mutation mutation, boolean writeToWAL)<a name="line.3356"></a>
+<span class="sourceLineNo">3141</span>      }<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>      if (walKey == null) {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>        writeEntry = mvcc.begin();<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>      }<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span><a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>      // STEP 5. Write back to memstore<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>      long addedSize = 0;<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>          continue;<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>        }<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>      }<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span><a name="line.3156"></a>
+<span class="sourceLineNo">3157</span>      // STEP 6. Complete mvcc.<a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>      if (replay) {<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span>        mvcc.completeAndWait(writeEntry);<a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>        writeEntry = null;<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>      }<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span><a name="line.3164"></a>
+<span class="sourceLineNo">3165</span>      // STEP 7. Release row locks, etc.<a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>      if (locked) {<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>        this.updatesLock.readLock().unlock();<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>        locked = false;<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span>      }<a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span><a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>      // calling the post CP hook for batch mutation<a name="line.3172"></a>
+<span class="sourceLineNo">3173</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3173"></a>
+<span class="sourceLineNo">3174</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span>      }<a name="line.3178"></a>
+<span class="sourceLineNo">3179</span><a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span>        }<a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>      }<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span><a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span>          // only for successful puts<a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>              != OperationStatusCode.SUCCESS) {<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>            continue;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>          }<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span>          Mutation m = batchOp.getMutation(i);<a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>          if (m instanceof Put) {<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>          } else {<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>          }<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>        }<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>      }<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>      success = true;<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>      return addedSize;<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    } finally {<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>      if (locked) {<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>        this.updatesLock.readLock().unlock();<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>      }<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span><a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>      // See if the column families were consistent through the whole thing.<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>      // null will be treated as unknown.<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span><a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>      if (noOfPuts &gt; 0) {<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span>        // There were some Puts in the batch.<a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>        if (this.metricsRegion != null) {<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>          this.metricsRegion.updatePut();<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>        }<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>      }<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>      if (noOfDeletes &gt; 0) {<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span>        // There were some Deletes in the batch.<a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>        if (this.metricsRegion != null) {<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>          this.metricsRegion.updateDelete();<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>        }<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>      }<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span>      if (!success) {<a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>          }<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>        }<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>      }<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>        // call the coprocessor hook to do any finalization steps<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span>        // after the put is done<a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>                lastIndexExclusive);<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span>      }<a name="line.3247"></a>
+<span class="sourceLineNo">3248</span><a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span>    }<a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>  }<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span><a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  throws IOException {<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span>    if (walEdit.isEmpty()) return;<a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  }<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span><a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>  throws IOException {<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    boolean skip = false;<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    // Skip anything that "ran" already<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3271"></a>
+<span class="sourceLineNo">3272</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3272"></a>
+<span class="sourceLineNo">3273</span>      return true;<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    }<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span>    // store the family map reference to allow for mutations<a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span><a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    try {<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>      if (mutation instanceof Put) {<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span>        // Check the families in the put. If bad, skip this one.<a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>        if (batchOp.isInReplay()) {<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>        } else {<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>          checkFamilies(familyMap.keySet());<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>        }<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>      } else {<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>        prepareDelete((Delete)mutation);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>      }<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span>      skip = true;<a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>      skip = true;<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    } catch (WrongRegionException we) {<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>      skip = true;<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    }<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span>    return skip;<a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>  }<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span><a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>  /**<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>   * During replay, there could exist column families which are removed between region server<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>   * failure and replay<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3319"></a>
+<span class="sourceLineNo">3320</span>        if (nonExistentList == null) {<a name="line.3320"></a>
+<span class="sourceLineNo">3321</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>        }<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>        nonExistentList.add(family);<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>      }<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>    }<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>    if (nonExistentList != null) {<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>      for (byte[] family : nonExistentList) {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>        // Perhaps schema was changed between crash and replay<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span>        familyMap.remove(family);<a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>      }<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    }<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>  }<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>  /**<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span>   * Returns effective durability from the passed durability and<a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>   * the table descriptor.<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>   */<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>  }<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span><a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>  @Override<a name="line.3343"></a>
+<span class="sourceLineNo">3344</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3344"></a>
+<span class="sourceLineNo">3345</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>      boolean writeToWAL)<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span>  throws IOException{<a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    checkMutationType(mutation, row);<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>      mutation, writeToWAL);<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>  }<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span><a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>  @Override<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      boolean writeToWAL)<a name="line.3356"></a>
 <span class="sourceLineNo">3357</span>  throws IOException {<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // Could do the below checks but seems wacky with two callers only. Just comment out for now.<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // One caller passes a Mutation, the other passes RowMutation. Presume all good so we don't<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // need these commented out checks.<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // if (rowMutations == null &amp;&amp; mutation == null) throw new DoNotRetryIOException("Both null");<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // if (rowMutations != null &amp;&amp; mutation != null) throw new DoNotRetryIOException("Both set");<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    checkReadOnly();<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // TODO, add check for value length also move this check to the client<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span>    checkResources();<a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    startRegionOperation();<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    try {<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>      Get get = new Get(row);<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>      checkFamily(family);<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>      get.addColumn(family, qualifier);<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>      // Lock row - note that doBatchMutate will relock this row if called<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>      RowLock rowLock = getRowLock(get.getRow());<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>      try {<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>        if (mutation != null &amp;&amp; this.getCoprocessorHost() != null) {<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>          // Call coprocessor.<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>          Boolean processed = null;<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>          if (mutation instanceof Put) {<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>            processed = this.getCoprocessorHost().preCheckAndPutAfterRowLock(row, family,<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>                qualifier, compareOp, comparator, (Put)mutation);<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>          } else if (mutation instanceof Delete) {<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>            processed = this.getCoprocessorHost().preCheckAndDeleteAfterRowLock(row, family,<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span>                qualifier, compareOp, comparator, (Delete)mutation);<a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>          }<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>          if (processed != null) {<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>            return processed;<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>          }<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>        }<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>        // NOTE: We used to wait here until mvcc caught up:  mvcc.await();<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        // Supposition is that now all changes are done under row locks, then when we go to read,<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>        // we'll get the latest on this row.<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        List&lt;Cell&gt; result = get(get, false);<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>        boolean valueIsNull = comparator.getValue() == null || comparator.getValue().length == 0;<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        boolean matches = false;<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>        long cellTs = 0;<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        if (result.size() == 0 &amp;&amp; valueIsNull) {<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>          matches = true;<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>        } else if (result.size() &gt; 0 &amp;&amp; result.get(0).getValueLength() == 0 &amp;&amp; valueIsNull) {<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>          matches = true;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>          cellTs = result.get(0).getTimestamp();<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        } else if (result.size() == 1 &amp;&amp; !valueIsNull) {<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>          Cell kv = result.get(0);<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>          cellTs = kv.getTimestamp();<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>          int compareResult = CellComparator.compareValue(kv, comparator);<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span>          matches = matches(compareOp, compareResult);<a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>        }<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>        // If matches put the new put or delete the new delete<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>        if (matches) {<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>          // We have acquire

<TRUNCATED>

[09/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
index d3abe39..c51826f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
@@ -615,9 +615,9 @@
 <span class="sourceLineNo">607</span>            if (this.failOnError &amp;&amp; monitor.hasError()) {<a name="line.607"></a>
 <span class="sourceLineNo">608</span>              monitorThread.interrupt();<a name="line.608"></a>
 <span class="sourceLineNo">609</span>              if (monitor.initialized) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>                System.exit(monitor.errorCode);<a name="line.610"></a>
+<span class="sourceLineNo">610</span>                return monitor.errorCode;<a name="line.610"></a>
 <span class="sourceLineNo">611</span>              } else {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.612"></a>
+<span class="sourceLineNo">612</span>                return INIT_ERROR_EXIT_CODE;<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>            currentTimeLength = System.currentTimeMillis() - startTime;<a name="line.615"></a>
@@ -626,630 +626,629 @@
 <span class="sourceLineNo">618</span>                  + ") after timeout limit:" + this.timeout<a name="line.618"></a>
 <span class="sourceLineNo">619</span>                  + " will be killed itself !!");<a name="line.619"></a>
 <span class="sourceLineNo">620</span>              if (monitor.initialized) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>                System.exit(TIMEOUT_ERROR_EXIT_CODE);<a name="line.621"></a>
+<span class="sourceLineNo">621</span>                return TIMEOUT_ERROR_EXIT_CODE;<a name="line.621"></a>
 <span class="sourceLineNo">622</span>              } else {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.623"></a>
+<span class="sourceLineNo">623</span>                return INIT_ERROR_EXIT_CODE;<a name="line.623"></a>
 <span class="sourceLineNo">624</span>              }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>              break;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>            monitorThread.interrupt();<a name="line.630"></a>
-<span class="sourceLineNo">631</span>            System.exit(monitor.errorCode);<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } finally {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          if (monitor != null) monitor.close();<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>        Thread.sleep(interval);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      } while (interval &gt; 0);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    } // try-with-resources close<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    if (choreService != null) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      choreService.shutdown();<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    return(monitor.errorCode);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>  }<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private void printUsageAndExit() {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    System.err.printf(<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        getClass().getName());<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    System.err.println(" where [opts] are:");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    System.err.println("   -help          Show this help and exit.");<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    System.err.println("      which means to enable regionserver mode");<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    System.err.println("      only works in regionserver mode.");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        " default is true");<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        + " Default is hbase:canary");<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    System.err<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * A Factory method for {@link Monitor}.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   * Can be overridden by user.<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param index a start index for monitor target<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param args args passed from user<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a Monitor instance<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   */<a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    Monitor monitor = null;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    String[] monitorTargets = null;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    if(index &gt;= 0) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int length = args.length - index;<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      monitorTargets = new String[length];<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>    if (this.regionServerMode) {<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      monitor =<a name="line.691"></a>
-<span class="sourceLineNo">692</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.693"></a>
-<span class="sourceLineNo">694</span>              this.treatFailureAsError);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    } else {<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      monitor =<a name="line.696"></a>
-<span class="sourceLineNo">697</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    return monitor;<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>  // a Monitor super-class can be extended by users<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>    protected Connection connection;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    protected Admin admin;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    protected String[] targets;<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    protected boolean useRegExp;<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    protected boolean treatFailureAsError;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    protected boolean initialized = false;<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    protected boolean done = false;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected int errorCode = 0;<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    protected Sink sink;<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    protected ExecutorService executor;<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>    public boolean isDone() {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return done;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    public boolean hasError() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return errorCode != 0;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span><a name="line.725"></a>
-<span class="sourceLineNo">726</span>    public boolean finalCheckForErrors() {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      if (errorCode != 0) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>        return true;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      return treatFailureAsError &amp;&amp;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>    @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    public void close() throws IOException {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (this.admin != null) this.admin.close();<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span><a name="line.738"></a>
-<span class="sourceLineNo">739</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      this.connection = connection;<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      this.targets = monitorTargets;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      this.useRegExp = useRegExp;<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.sink = sink;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      this.executor = executor;<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>    @Override<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    public abstract void run();<a name="line.752"></a>
-<span class="sourceLineNo">753</span><a name="line.753"></a>
-<span class="sourceLineNo">754</span>    protected boolean initAdmin() {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      if (null == this.admin) {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        try {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>          this.admin = this.connection.getAdmin();<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        } catch (Exception e) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>        }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      } else if (admin.isAborted()) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>        LOG.error("HBaseAdmin aborted");<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      }<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return !this.hasError();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
-<span class="sourceLineNo">769</span><a name="line.769"></a>
-<span class="sourceLineNo">770</span>  // a monitor for region mode<a name="line.770"></a>
-<span class="sourceLineNo">771</span>  private static class RegionMonitor extends Monitor {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    // 10 minutes<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    // 1 days<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>    private long lastCheckTime = -1;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private boolean writeSniffing;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    private TableName writeTableName;<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    private int writeDataTTL;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private float regionsLowerLimit;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    private float regionsUpperLimit;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    private int checkPeriod;<a name="line.783"></a>
-<span class="sourceLineNo">784</span><a name="line.784"></a>
-<span class="sourceLineNo">785</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        boolean treatFailureAsError) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      Configuration conf = connection.getConfiguration();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      this.writeSniffing = writeSniffing;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      this.writeTableName = writeTableName;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      this.writeDataTTL =<a name="line.792"></a>
-<span class="sourceLineNo">793</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      this.regionsLowerLimit =<a name="line.794"></a>
-<span class="sourceLineNo">795</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      this.regionsUpperLimit =<a name="line.796"></a>
-<span class="sourceLineNo">797</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      this.checkPeriod =<a name="line.798"></a>
-<span class="sourceLineNo">799</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.799"></a>
-<span class="sourceLineNo">800</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>    @Override<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    public void run() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      if (this.initAdmin()) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        try {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.809"></a>
-<span class="sourceLineNo">810</span>            this.initialized = true;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>            for (String table : tables) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.812"></a>
-<span class="sourceLineNo">813</span>            }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          } else {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>          }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>          if (writeSniffing) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>              try {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                checkWriteTableDistribution();<a name="line.821"></a>
-<span class="sourceLineNo">822</span>              } catch (IOException e) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.823"></a>
-<span class="sourceLineNo">824</span>              }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>            }<a name="line.826"></a>
-<span class="sourceLineNo">827</span>            // sniff canary table with write operation<a name="line.827"></a>
-<span class="sourceLineNo">828</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.828"></a>
-<span class="sourceLineNo">829</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>          }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            try {<a name="line.833"></a>
-<span class="sourceLineNo">834</span>              future.get();<a name="line.834"></a>
-<span class="sourceLineNo">835</span>            } catch (ExecutionException e) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>              LOG.error("Sniff region failed!", e);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>            }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          }<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        } catch (Exception e) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>          LOG.error("Run regionMonitor failed", e);<a name="line.840"></a>
-<span class="sourceLineNo">841</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      this.done = true;<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      String[] returnTables = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span><a name="line.849"></a>
-<span class="sourceLineNo">850</span>      if (this.useRegExp) {<a name="line.850"></a>
-<span class="sourceLineNo">851</span>        Pattern pattern = null;<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        HTableDescriptor[] tds = null;<a name="line.852"></a>
-<span class="sourceLineNo">853</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        try {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>          if (LOG.isDebugEnabled()) {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>            LOG.debug(String.format("reading list of tables"));<a name="line.856"></a>
-<span class="sourceLineNo">857</span>          }<a name="line.857"></a>
-<span class="sourceLineNo">858</span>          tds = this.admin.listTables(pattern);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>          if (tds == null) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>            tds = new HTableDescriptor[0];<a name="line.860"></a>
-<span class="sourceLineNo">861</span>          }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>          for (String monitorTarget : monitorTargets) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>            pattern = Pattern.compile(monitorTarget);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>            for (HTableDescriptor td : tds) {<a name="line.864"></a>
-<span class="sourceLineNo">865</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>                tmpTables.add(td.getNameAsString());<a name="line.866"></a>
-<span class="sourceLineNo">867</span>              }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>            }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>          }<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        } catch (IOException e) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          LOG.error("Communicate with admin failed", e);<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          throw e;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>        if (tmpTables.size() &gt; 0) {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>        } else {<a name="line.877"></a>
-<span class="sourceLineNo">878</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          LOG.error(msg);<a name="line.879"></a>
-<span class="sourceLineNo">880</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>          throw new TableNotFoundException(msg);<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        }<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      } else {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>        returnTables = monitorTargets;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>      return returnTables;<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    }<a name="line.888"></a>
-<span class="sourceLineNo">889</span><a name="line.889"></a>
-<span class="sourceLineNo">890</span>    /*<a name="line.890"></a>
-<span class="sourceLineNo">891</span>     * canary entry point to monitor all the tables.<a name="line.891"></a>
-<span class="sourceLineNo">892</span>     */<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType) throws Exception {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      if (LOG.isDebugEnabled()) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        LOG.debug(String.format("reading list of tables"));<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.899"></a>
-<span class="sourceLineNo">900</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        }<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      return taskFutures;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      if (!admin.tableExists(writeTableName)) {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>        int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.909"></a>
-<span class="sourceLineNo">910</span>        if (numberOfServers == 0) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>          throw new IllegalStateException("No live regionservers");<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        }<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        createWriteTable(numberOfServers);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        admin.enableTable(writeTableName);<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      }<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>      int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      List&lt;Pair&lt;HRegionInfo, ServerName&gt;&gt; pairs =<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      int numberOfRegions = pairs.size();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        admin.disableTable(writeTableName);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        admin.deleteTable(writeTableName);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        createWriteTable(numberOfServers);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;ServerName&gt;();<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      for (Pair&lt;HRegionInfo, ServerName&gt; pair : pairs) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        serverSet.add(pair.getSecond());<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      int numberOfCoveredServers = serverSet.size();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        admin.balancer();<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    }<a name="line.938"></a>
-<span class="sourceLineNo">939</span><a name="line.939"></a>
-<span class="sourceLineNo">940</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          + " and you can change it by config: "<a name="line.945"></a>
-<span class="sourceLineNo">946</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      family.setMaxVersions(1);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      family.setTimeToLive(writeDataTTL);<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      desc.addFamily(family);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      admin.createTable(desc, splits);<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    }<a name="line.955"></a>
-<span class="sourceLineNo">956</span>  }<a name="line.956"></a>
-<span class="sourceLineNo">957</span><a name="line.957"></a>
-<span class="sourceLineNo">958</span>  /**<a name="line.958"></a>
-<span class="sourceLineNo">959</span>   * Canary entry point for specified table.<a name="line.959"></a>
-<span class="sourceLineNo">960</span>   * @throws Exception<a name="line.960"></a>
-<span class="sourceLineNo">961</span>   */<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static void sniff(final Admin admin, TableName tableName)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      throws Exception {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    sniff(admin, tableName, TaskType.READ);<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>  /**<a name="line.967"></a>
-<span class="sourceLineNo">968</span>   * Canary entry point for specified table with task type(read/write)<a name="line.968"></a>
-<span class="sourceLineNo">969</span>   * @throws Exception<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   */<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  public static void sniff(final Admin admin, TableName tableName, TaskType taskType)<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      throws Exception {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    List&lt;Future&lt;Void&gt;&gt; taskFutures =<a name="line.973"></a>
-<span class="sourceLineNo">974</span>        Canary.sniff(admin, new StdOutSink(), tableName.getNameAsString(),<a name="line.974"></a>
-<span class="sourceLineNo">975</span>          new ScheduledThreadPoolExecutor(1), taskType);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    for (Future&lt;Void&gt; future : taskFutures) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      future.get();<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><a name="line.980"></a>
-<span class="sourceLineNo">981</span>  /**<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   * Canary entry point for specified table.<a name="line.982"></a>
-<span class="sourceLineNo">983</span>   * @throws Exception<a name="line.983"></a>
-<span class="sourceLineNo">984</span>   */<a name="line.984"></a>
-<span class="sourceLineNo">985</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      ExecutorService executor, TaskType taskType) throws Exception {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    if (LOG.isDebugEnabled()) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        tableName));<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        executor, taskType);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    } else {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  /*<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>   * Loops over regions that owns this table, and output some information abouts the state.<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType) throws Exception {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span><a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    if (LOG.isDebugEnabled()) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>    Table table = null;<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    try {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    } catch (TableNotFoundException e) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      return new ArrayList&lt;Future&lt;Void&gt;&gt;();<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;RegionTask&gt;();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    try {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      for (HRegionInfo region : admin.getTableRegions(tableDesc.getTableName())) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        tasks.add(new RegionTask(admin.getConnection(), region, sink, taskType));<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    } finally {<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      table.close();<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    return executor.invokeAll(tasks);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>  // a monitor for regionserver mode<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  private static class RegionServerMonitor extends Monitor {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    private boolean allRegions;<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    public RegionServerMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        ExtendedSink sink, ExecutorService executor, boolean allRegions,<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        boolean treatFailureAsError) {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      this.allRegions = allRegions;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span><a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    private ExtendedSink getSink() {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      return (ExtendedSink) this.sink;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span><a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    @Override<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    public void run() {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      if (this.initAdmin() &amp;&amp; this.checkNoTableNames()) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = this.filterRegionServerByName();<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        this.initialized = true;<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>        this.monitorRegionServers(rsAndRMap);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      this.done = true;<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>    private boolean checkNoTableNames() {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      List&lt;String&gt; foundTableNames = new ArrayList&lt;String&gt;();<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>      TableName[] tableNames = null;<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      if (LOG.isDebugEnabled()) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      try {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>        tableNames = this.admin.listTableNames();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      } catch (IOException e) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        LOG.error("Get listTableNames failed", e);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        return false;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      if (this.targets == null || this.targets.length == 0) return true;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      for (String target : this.targets) {<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        for (TableName tableName : tableNames) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          if (target.equals(tableName.getNameAsString())) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>            foundTableNames.add(target);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (foundTableNames.size() &gt; 0) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        System.err.println("Cannot pass a tablename when using the -regionserver " +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>            "option, tablenames:" + foundTableNames.toString());<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        this.errorCode = USAGE_EXIT_CODE;<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      }<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      return foundTableNames.size() == 0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    }<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span><a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    private void monitorRegionServers(Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      List&lt;RegionServerTask&gt; tasks = new ArrayList&lt;RegionServerTask&gt;();<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      Map&lt;String, AtomicLong&gt; successMap = new HashMap&lt;String, AtomicLong&gt;();<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      Random rand = new Random();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        String serverName = entry.getKey();<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        AtomicLong successes = new AtomicLong(0);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        successMap.put(serverName, successes);<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        if (this.allRegions) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>          for (HRegionInfo region : entry.getValue()) {<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            tasks.add(new RegionServerTask(this.connection,<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>                serverName,<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>                region,<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>                getSink(),<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>                successes));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>          }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        } else {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>          // random select a region if flag not set<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>          HRegionInfo region = entry.getValue().get(rand.nextInt(entry.getValue().size()));<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>          tasks.add(new RegionServerTask(this.connection,<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>              serverName,<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>              region,<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>              getSink(),<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>              successes));<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>        }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      }<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>      try {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>          try {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>            future.get();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          } catch (ExecutionException e) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.error("Sniff regionserver failed!", e);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        if (this.allRegions) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>            String serverName = entry.getKey();<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            LOG.info("Successfully read " + successMap.get(serverName) + " regions out of "<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>                    + entry.getValue().size() + " on regionserver:" + serverName);<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      } catch (InterruptedException e) {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        LOG.error("Sniff regionserver interrupted!", e);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      }<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>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; filterRegionServerByName() {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; regionServerAndRegionsMap = this.getAllRegionServerByName();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      regionServerAndRegionsMap = this.doFilterRegionServerByName(regionServerAndRegionsMap);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>      return regionServerAndRegionsMap;<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; getAllRegionServerByName() {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      Table table = null;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      RegionLocator regionLocator = null;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      try {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        if (LOG.isDebugEnabled()) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          LOG.debug(String.format("reading list of tables and locations"));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        HTableDescriptor[] tableDescs = this.admin.listTables();<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        List&lt;HRegionInfo&gt; regions = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>        for (HTableDescriptor tableDesc : tableDescs) {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>          table = this.admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>          regionLocator = this.admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>          for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>            ServerName rs = location.getServerName();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>            String rsName = rs.getHostname();<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>            HRegionInfo r = location.getRegionInfo();<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>            if (rsAndRMap.containsKey(rsName)) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>              regions = rsAndRMap.get(rsName);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            } else {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>              regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>              rsAndRMap.put(rsName, regions);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>            regions.add(r);<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>          }<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>          table.close();<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span><a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      } catch (IOException e) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        String msg = "Get HTables info failed";<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        LOG.error(msg, e);<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>      } finally {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        if (table != null) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          try {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            table.close();<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          } catch (IOException e) {<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>            LOG.warn("Close table failed", e);<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>        }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>      }<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span><a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return rsAndRMap;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; doFilterRegionServerByName(<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; fullRsAndRMap) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; filteredRsAndRMap = null;<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span><a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        filteredRsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        Pattern pattern = null;<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        Matcher matcher = null;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        boolean regExpFound = false;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (String rsName : this.targets) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (this.useRegExp) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>            regExpFound = false;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>            pattern = Pattern.compile(rsName);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : fullRsAndRMap.entrySet()) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>              matcher = pattern.matcher(entry.getKey());<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>              if (matcher.matches()) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>                filteredRsAndRMap.put(entry.getKey(), entry.getValue());<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>                regExpFound = true;<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>            if (!regExpFound) {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>              LOG.info("No RegionServerInfo found, regionServerPattern:" + rsName);<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            if (fullRsAndRMap.containsKey(rsName)) {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>              filteredRsAndRMap.put(rsName, fullRsAndRMap.get(rsName));<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>            } else {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>              LOG.info("No RegionServerInfo found, regionServerName:" + rsName);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>            }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>          }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        }<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>        filteredRsAndRMap = fullRsAndRMap;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return filteredRsAndRMap;<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><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  public static void main(String[] args) throws Exception {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    final Configuration conf = HBaseConfiguration.create();<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span><a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // loading the generic options to conf<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    new GenericOptionsParser(conf, args);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    int numThreads = conf.getInt("hbase.canary.threads.num", MAX_THREADS_NUM);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    LOG.info("Number of exection threads " + numThreads);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span><a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(numThreads);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span><a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    Class&lt;? extends Sink&gt; sinkClass =<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        conf.getClass("hbase.canary.sink.class", RegionServerStdOutSink.class, Sink.class);<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>    Sink sink = ReflectionUtils.newInstance(sinkClass);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span><a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    int exitCode = ToolRunner.run(conf, new Canary(executor, sink), args);<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    executor.shutdown();<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    System.exit(exitCode);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>}<a name="line.1244"></a>
+<span class="sourceLineNo">625</span>            }<a name="line.625"></a>
+<span class="sourceLineNo">626</span>          }<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>            monitorThread.interrupt();<a name="line.629"></a>
+<span class="sourceLineNo">630</span>            return monitor.errorCode;<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        } finally {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>          if (monitor != null) monitor.close();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        }<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>        Thread.sleep(interval);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      } while (interval &gt; 0);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    } // try-with-resources close<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    if (choreService != null) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>      choreService.shutdown();<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    return monitor.errorCode;<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>  private void printUsageAndExit() {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    System.err.printf(<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        getClass().getName());<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    System.err.println(" where [opts] are:");<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.err.println("   -help          Show this help and exit.");<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    System.err.println("      which means to enable regionserver mode");<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    System.err.println("      only works in regionserver mode.");<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        " default is true");<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.665"></a>
+<span class="sourceLineNo">666</span>        + " Default is hbase:canary");<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    System.err<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    System.exit(USAGE_EXIT_CODE);<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>   * A Factory method for {@link Monitor}.<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * Can be overridden by user.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @param index a start index for monitor target<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   * @param args args passed from user<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   * @return a Monitor instance<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   */<a name="line.678"></a>
+<span class="sourceLineNo">679</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Monitor monitor = null;<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    String[] monitorTargets = null;<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>    if(index &gt;= 0) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      int length = args.length - index;<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      monitorTargets = new String[length];<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.regionServerMode) {<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      monitor =<a name="line.690"></a>
+<span class="sourceLineNo">691</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.691"></a>
+<span class="sourceLineNo">692</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.692"></a>
+<span class="sourceLineNo">693</span>              this.treatFailureAsError);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    } else {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      monitor =<a name="line.695"></a>
+<span class="sourceLineNo">696</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.696"></a>
+<span class="sourceLineNo">697</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return monitor;<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">702</span>  // a Monitor super-class can be extended by users<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    protected Connection connection;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    protected Admin admin;<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    protected String[] targets;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    protected boolean useRegExp;<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    protected boolean treatFailureAsError;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    protected boolean initialized = false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>    protected boolean done = false;<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    protected int errorCode = 0;<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    protected Sink sink;<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    protected ExecutorService executor;<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>    public boolean isDone() {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      return done;<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>    public boolean hasError() {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      return errorCode != 0;<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">724</span><a name="line.724"></a>
+<span class="sourceLineNo">725</span>    public boolean finalCheckForErrors() {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      if (errorCode != 0) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        return true;<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      return treatFailureAsError &amp;&amp;<a name="line.729"></a>
+<span class="sourceLineNo">730</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>    @Override<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    public void close() throws IOException {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (this.admin != null) this.admin.close();<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.738"></a>
+<span class="sourceLineNo">739</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.740"></a>
+<span class="sourceLineNo">741</span><a name="line.741"></a>
+<span class="sourceLineNo">742</span>      this.connection = connection;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      this.targets = monitorTargets;<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      this.useRegExp = useRegExp;<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      this.sink = sink;<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      this.executor = executor;<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>    @Override<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    public abstract void run();<a name="line.751"></a>
+<span class="sourceLineNo">752</span><a name="line.752"></a>
+<span class="sourceLineNo">753</span>    protected boolean initAdmin() {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>      if (null == this.admin) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        try {<a name="line.755"></a>
+<span class="sourceLineNo">756</span>          this.admin = this.connection.getAdmin();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        } catch (Exception e) {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.758"></a>
+<span class="sourceLineNo">759</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
+<span class="sourceLineNo">761</span>      } else if (admin.isAborted()) {<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        LOG.error("HBaseAdmin aborted");<a name="line.762"></a>
+<span class="sourceLineNo">763</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      return !this.hasError();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
+<span class="sourceLineNo">767</span>  }<a name="line.767"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>  // a monitor for region mode<a name="line.769"></a>
+<span class="sourceLineNo">770</span>  private static class RegionMonitor extends Monitor {<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    // 10 minutes<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    // 1 days<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    private long lastCheckTime = -1;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    private boolean writeSniffing;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    private TableName writeTableName;<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private int writeDataTTL;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    private float regionsLowerLimit;<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    private float regionsUpperLimit;<a name="line.781"></a>
+<span class="sourceLineNo">782</span>    private int checkPeriod;<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.784"></a>
+<span class="sourceLineNo">785</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.785"></a>
+<span class="sourceLineNo">786</span>        boolean treatFailureAsError) {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      Configuration conf = connection.getConfiguration();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      this.writeSniffing = writeSniffing;<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      this.writeTableName = writeTableName;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      this.writeDataTTL =<a name="line.791"></a>
+<span class="sourceLineNo">792</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.792"></a>
+<span class="sourceLineNo">793</span>      this.regionsLowerLimit =<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      this.regionsUpperLimit =<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.796"></a>
+<span class="sourceLineNo">797</span>      this.checkPeriod =<a name="line.797"></a>
+<span class="sourceLineNo">798</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.798"></a>
+<span class="sourceLineNo">799</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    @Override<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    public void run() {<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      if (this.initAdmin()) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>        try {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>            this.initialized = true;<a name="line.809"></a>
+<span class="sourceLineNo">810</span>            for (String table : tables) {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.811"></a>
+<span class="sourceLineNo">812</span>            }<a name="line.812"></a>
+<span class="sourceLineNo">813</span>          } else {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.814"></a>
+<span class="sourceLineNo">815</span>          }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>          if (writeSniffing) {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>              try {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>                checkWriteTableDistribution();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>              } catch (IOException e) {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>              }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.824"></a>
+<span class="sourceLineNo">825</span>            }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>            // sniff canary table with write operation<a name="line.826"></a>
+<span class="sourceLineNo">827</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.827"></a>
+<span class="sourceLineNo">828</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.828"></a>
+<span class="sourceLineNo">829</span>          }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>            try {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>              future.get();<a name="line.833"></a>
+<span class="sourceLineNo">834</span>            } catch (ExecutionException e) {<a name="line.834"></a>
+<span class="sourceLineNo">835</span>              LOG.error("Sniff region failed!", e);<a name="line.835"></a>
+<span class="sourceLineNo">836</span>            }<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        } catch (Exception e) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>          LOG.error("Run regionMonitor failed", e);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          this.errorCode = ERROR_EXIT_CODE;<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>      this.done = true;<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>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>      String[] returnTables = null;<a name="line.847"></a>
+<span class="sourceLineNo">848</span><a name="line.848"></a>
+<span class="sourceLineNo">849</span>      if (this.useRegExp) {<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        Pattern pattern = null;<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        HTableDescriptor[] tds = null;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        try {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          if (LOG.isDebugEnabled()) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>            LOG.debug(String.format("reading list of tables"));<a name="line.855"></a>
+<span class="sourceLineNo">856</span>          }<a name="line.856"></a>
+<span class="sourceLineNo">857</span>          tds = this.admin.listTables(pattern);<a name="line.857"></a>
+<span class="sourceLineNo">858</span>          if (tds == null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            tds = new HTableDescriptor[0];<a name="line.859"></a>
+<span class="sourceLineNo">860</span>          }<a name="line.860"></a>
+<span class="sourceLineNo">861</span>          for (String monitorTarget : monitorTargets) {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>            pattern = Pattern.compile(monitorTarget);<a name="line.862"></a>
+<span class="sourceLineNo">863</span>            for (HTableDescriptor td : tds) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>                tmpTables.add(td.getNameAsString());<a name="line.865"></a>
+<span class="sourceLineNo">866</span>              }<a name="line.866"></a>
+<span class="sourceLineNo">867</span>            }<a name="line.867"></a>
+<span class="sourceLineNo">868</span>          }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        } catch (IOException e) {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>          LOG.error("Communicate with admin failed", e);<a name="line.870"></a>
+<span class="sourceLineNo">871</span>          throw e;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>        if (tmpTables.size() &gt; 0) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>        } else {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          LOG.error(msg);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          throw new TableNotFoundException(msg);<a name="line.880"></a>
+<span class="sourceLineNo">881</span>        }<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      } else {<a name="line.882"></a>


<TRUNCATED>

[04/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html
index d3abe39..c51826f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.Sink.html
@@ -615,9 +615,9 @@
 <span class="sourceLineNo">607</span>            if (this.failOnError &amp;&amp; monitor.hasError()) {<a name="line.607"></a>
 <span class="sourceLineNo">608</span>              monitorThread.interrupt();<a name="line.608"></a>
 <span class="sourceLineNo">609</span>              if (monitor.initialized) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>                System.exit(monitor.errorCode);<a name="line.610"></a>
+<span class="sourceLineNo">610</span>                return monitor.errorCode;<a name="line.610"></a>
 <span class="sourceLineNo">611</span>              } else {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.612"></a>
+<span class="sourceLineNo">612</span>                return INIT_ERROR_EXIT_CODE;<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>            currentTimeLength = System.currentTimeMillis() - startTime;<a name="line.615"></a>
@@ -626,630 +626,629 @@
 <span class="sourceLineNo">618</span>                  + ") after timeout limit:" + this.timeout<a name="line.618"></a>
 <span class="sourceLineNo">619</span>                  + " will be killed itself !!");<a name="line.619"></a>
 <span class="sourceLineNo">620</span>              if (monitor.initialized) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>                System.exit(TIMEOUT_ERROR_EXIT_CODE);<a name="line.621"></a>
+<span class="sourceLineNo">621</span>                return TIMEOUT_ERROR_EXIT_CODE;<a name="line.621"></a>
 <span class="sourceLineNo">622</span>              } else {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.623"></a>
+<span class="sourceLineNo">623</span>                return INIT_ERROR_EXIT_CODE;<a name="line.623"></a>
 <span class="sourceLineNo">624</span>              }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>              break;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>            monitorThread.interrupt();<a name="line.630"></a>
-<span class="sourceLineNo">631</span>            System.exit(monitor.errorCode);<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } finally {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          if (monitor != null) monitor.close();<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>        Thread.sleep(interval);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      } while (interval &gt; 0);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    } // try-with-resources close<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    if (choreService != null) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      choreService.shutdown();<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    return(monitor.errorCode);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>  }<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private void printUsageAndExit() {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    System.err.printf(<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        getClass().getName());<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    System.err.println(" where [opts] are:");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    System.err.println("   -help          Show this help and exit.");<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    System.err.println("      which means to enable regionserver mode");<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    System.err.println("      only works in regionserver mode.");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        " default is true");<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        + " Default is hbase:canary");<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    System.err<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * A Factory method for {@link Monitor}.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   * Can be overridden by user.<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param index a start index for monitor target<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param args args passed from user<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a Monitor instance<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   */<a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    Monitor monitor = null;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    String[] monitorTargets = null;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    if(index &gt;= 0) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int length = args.length - index;<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      monitorTargets = new String[length];<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>    if (this.regionServerMode) {<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      monitor =<a name="line.691"></a>
-<span class="sourceLineNo">692</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.693"></a>
-<span class="sourceLineNo">694</span>              this.treatFailureAsError);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    } else {<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      monitor =<a name="line.696"></a>
-<span class="sourceLineNo">697</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    return monitor;<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>  // a Monitor super-class can be extended by users<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>    protected Connection connection;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    protected Admin admin;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    protected String[] targets;<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    protected boolean useRegExp;<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    protected boolean treatFailureAsError;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    protected boolean initialized = false;<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    protected boolean done = false;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected int errorCode = 0;<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    protected Sink sink;<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    protected ExecutorService executor;<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>    public boolean isDone() {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return done;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    public boolean hasError() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return errorCode != 0;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span><a name="line.725"></a>
-<span class="sourceLineNo">726</span>    public boolean finalCheckForErrors() {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      if (errorCode != 0) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>        return true;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      return treatFailureAsError &amp;&amp;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>    @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    public void close() throws IOException {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (this.admin != null) this.admin.close();<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span><a name="line.738"></a>
-<span class="sourceLineNo">739</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      this.connection = connection;<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      this.targets = monitorTargets;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      this.useRegExp = useRegExp;<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.sink = sink;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      this.executor = executor;<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>    @Override<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    public abstract void run();<a name="line.752"></a>
-<span class="sourceLineNo">753</span><a name="line.753"></a>
-<span class="sourceLineNo">754</span>    protected boolean initAdmin() {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      if (null == this.admin) {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        try {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>          this.admin = this.connection.getAdmin();<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        } catch (Exception e) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>        }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      } else if (admin.isAborted()) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>        LOG.error("HBaseAdmin aborted");<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      }<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return !this.hasError();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
-<span class="sourceLineNo">769</span><a name="line.769"></a>
-<span class="sourceLineNo">770</span>  // a monitor for region mode<a name="line.770"></a>
-<span class="sourceLineNo">771</span>  private static class RegionMonitor extends Monitor {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    // 10 minutes<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    // 1 days<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>    private long lastCheckTime = -1;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private boolean writeSniffing;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    private TableName writeTableName;<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    private int writeDataTTL;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private float regionsLowerLimit;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    private float regionsUpperLimit;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    private int checkPeriod;<a name="line.783"></a>
-<span class="sourceLineNo">784</span><a name="line.784"></a>
-<span class="sourceLineNo">785</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        boolean treatFailureAsError) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      Configuration conf = connection.getConfiguration();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      this.writeSniffing = writeSniffing;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      this.writeTableName = writeTableName;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      this.writeDataTTL =<a name="line.792"></a>
-<span class="sourceLineNo">793</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      this.regionsLowerLimit =<a name="line.794"></a>
-<span class="sourceLineNo">795</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      this.regionsUpperLimit =<a name="line.796"></a>
-<span class="sourceLineNo">797</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      this.checkPeriod =<a name="line.798"></a>
-<span class="sourceLineNo">799</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.799"></a>
-<span class="sourceLineNo">800</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>    @Override<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    public void run() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      if (this.initAdmin()) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        try {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.809"></a>
-<span class="sourceLineNo">810</span>            this.initialized = true;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>            for (String table : tables) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.812"></a>
-<span class="sourceLineNo">813</span>            }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          } else {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>          }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>          if (writeSniffing) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>              try {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                checkWriteTableDistribution();<a name="line.821"></a>
-<span class="sourceLineNo">822</span>              } catch (IOException e) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.823"></a>
-<span class="sourceLineNo">824</span>              }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>            }<a name="line.826"></a>
-<span class="sourceLineNo">827</span>            // sniff canary table with write operation<a name="line.827"></a>
-<span class="sourceLineNo">828</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.828"></a>
-<span class="sourceLineNo">829</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>          }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            try {<a name="line.833"></a>
-<span class="sourceLineNo">834</span>              future.get();<a name="line.834"></a>
-<span class="sourceLineNo">835</span>            } catch (ExecutionException e) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>              LOG.error("Sniff region failed!", e);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>            }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          }<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        } catch (Exception e) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>          LOG.error("Run regionMonitor failed", e);<a name="line.840"></a>
-<span class="sourceLineNo">841</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      this.done = true;<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      String[] returnTables = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span><a name="line.849"></a>
-<span class="sourceLineNo">850</span>      if (this.useRegExp) {<a name="line.850"></a>
-<span class="sourceLineNo">851</span>        Pattern pattern = null;<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        HTableDescriptor[] tds = null;<a name="line.852"></a>
-<span class="sourceLineNo">853</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        try {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>          if (LOG.isDebugEnabled()) {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>            LOG.debug(String.format("reading list of tables"));<a name="line.856"></a>
-<span class="sourceLineNo">857</span>          }<a name="line.857"></a>
-<span class="sourceLineNo">858</span>          tds = this.admin.listTables(pattern);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>          if (tds == null) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>            tds = new HTableDescriptor[0];<a name="line.860"></a>
-<span class="sourceLineNo">861</span>          }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>          for (String monitorTarget : monitorTargets) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>            pattern = Pattern.compile(monitorTarget);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>            for (HTableDescriptor td : tds) {<a name="line.864"></a>
-<span class="sourceLineNo">865</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>                tmpTables.add(td.getNameAsString());<a name="line.866"></a>
-<span class="sourceLineNo">867</span>              }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>            }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>          }<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        } catch (IOException e) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          LOG.error("Communicate with admin failed", e);<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          throw e;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>        if (tmpTables.size() &gt; 0) {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>        } else {<a name="line.877"></a>
-<span class="sourceLineNo">878</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          LOG.error(msg);<a name="line.879"></a>
-<span class="sourceLineNo">880</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>          throw new TableNotFoundException(msg);<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        }<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      } else {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>        returnTables = monitorTargets;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>      return returnTables;<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    }<a name="line.888"></a>
-<span class="sourceLineNo">889</span><a name="line.889"></a>
-<span class="sourceLineNo">890</span>    /*<a name="line.890"></a>
-<span class="sourceLineNo">891</span>     * canary entry point to monitor all the tables.<a name="line.891"></a>
-<span class="sourceLineNo">892</span>     */<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType) throws Exception {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      if (LOG.isDebugEnabled()) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        LOG.debug(String.format("reading list of tables"));<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.899"></a>
-<span class="sourceLineNo">900</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        }<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      return taskFutures;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      if (!admin.tableExists(writeTableName)) {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>        int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.909"></a>
-<span class="sourceLineNo">910</span>        if (numberOfServers == 0) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>          throw new IllegalStateException("No live regionservers");<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        }<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        createWriteTable(numberOfServers);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        admin.enableTable(writeTableName);<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      }<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>      int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      List&lt;Pair&lt;HRegionInfo, ServerName&gt;&gt; pairs =<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      int numberOfRegions = pairs.size();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        admin.disableTable(writeTableName);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        admin.deleteTable(writeTableName);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        createWriteTable(numberOfServers);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;ServerName&gt;();<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      for (Pair&lt;HRegionInfo, ServerName&gt; pair : pairs) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        serverSet.add(pair.getSecond());<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      int numberOfCoveredServers = serverSet.size();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        admin.balancer();<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    }<a name="line.938"></a>
-<span class="sourceLineNo">939</span><a name="line.939"></a>
-<span class="sourceLineNo">940</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          + " and you can change it by config: "<a name="line.945"></a>
-<span class="sourceLineNo">946</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      family.setMaxVersions(1);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      family.setTimeToLive(writeDataTTL);<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      desc.addFamily(family);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      admin.createTable(desc, splits);<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    }<a name="line.955"></a>
-<span class="sourceLineNo">956</span>  }<a name="line.956"></a>
-<span class="sourceLineNo">957</span><a name="line.957"></a>
-<span class="sourceLineNo">958</span>  /**<a name="line.958"></a>
-<span class="sourceLineNo">959</span>   * Canary entry point for specified table.<a name="line.959"></a>
-<span class="sourceLineNo">960</span>   * @throws Exception<a name="line.960"></a>
-<span class="sourceLineNo">961</span>   */<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static void sniff(final Admin admin, TableName tableName)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      throws Exception {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    sniff(admin, tableName, TaskType.READ);<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>  /**<a name="line.967"></a>
-<span class="sourceLineNo">968</span>   * Canary entry point for specified table with task type(read/write)<a name="line.968"></a>
-<span class="sourceLineNo">969</span>   * @throws Exception<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   */<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  public static void sniff(final Admin admin, TableName tableName, TaskType taskType)<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      throws Exception {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    List&lt;Future&lt;Void&gt;&gt; taskFutures =<a name="line.973"></a>
-<span class="sourceLineNo">974</span>        Canary.sniff(admin, new StdOutSink(), tableName.getNameAsString(),<a name="line.974"></a>
-<span class="sourceLineNo">975</span>          new ScheduledThreadPoolExecutor(1), taskType);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    for (Future&lt;Void&gt; future : taskFutures) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      future.get();<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><a name="line.980"></a>
-<span class="sourceLineNo">981</span>  /**<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   * Canary entry point for specified table.<a name="line.982"></a>
-<span class="sourceLineNo">983</span>   * @throws Exception<a name="line.983"></a>
-<span class="sourceLineNo">984</span>   */<a name="line.984"></a>
-<span class="sourceLineNo">985</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      ExecutorService executor, TaskType taskType) throws Exception {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    if (LOG.isDebugEnabled()) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        tableName));<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        executor, taskType);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    } else {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  /*<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>   * Loops over regions that owns this table, and output some information abouts the state.<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType) throws Exception {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span><a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    if (LOG.isDebugEnabled()) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>    Table table = null;<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    try {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    } catch (TableNotFoundException e) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      return new ArrayList&lt;Future&lt;Void&gt;&gt;();<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;RegionTask&gt;();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    try {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      for (HRegionInfo region : admin.getTableRegions(tableDesc.getTableName())) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        tasks.add(new RegionTask(admin.getConnection(), region, sink, taskType));<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    } finally {<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      table.close();<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    return executor.invokeAll(tasks);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>  // a monitor for regionserver mode<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  private static class RegionServerMonitor extends Monitor {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    private boolean allRegions;<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    public RegionServerMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        ExtendedSink sink, ExecutorService executor, boolean allRegions,<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        boolean treatFailureAsError) {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      this.allRegions = allRegions;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span><a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    private ExtendedSink getSink() {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      return (ExtendedSink) this.sink;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span><a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    @Override<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    public void run() {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      if (this.initAdmin() &amp;&amp; this.checkNoTableNames()) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = this.filterRegionServerByName();<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        this.initialized = true;<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>        this.monitorRegionServers(rsAndRMap);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      this.done = true;<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>    private boolean checkNoTableNames() {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      List&lt;String&gt; foundTableNames = new ArrayList&lt;String&gt;();<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>      TableName[] tableNames = null;<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      if (LOG.isDebugEnabled()) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      try {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>        tableNames = this.admin.listTableNames();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      } catch (IOException e) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        LOG.error("Get listTableNames failed", e);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        return false;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      if (this.targets == null || this.targets.length == 0) return true;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      for (String target : this.targets) {<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        for (TableName tableName : tableNames) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          if (target.equals(tableName.getNameAsString())) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>            foundTableNames.add(target);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (foundTableNames.size() &gt; 0) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        System.err.println("Cannot pass a tablename when using the -regionserver " +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>            "option, tablenames:" + foundTableNames.toString());<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        this.errorCode = USAGE_EXIT_CODE;<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      }<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      return foundTableNames.size() == 0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    }<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span><a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    private void monitorRegionServers(Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      List&lt;RegionServerTask&gt; tasks = new ArrayList&lt;RegionServerTask&gt;();<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      Map&lt;String, AtomicLong&gt; successMap = new HashMap&lt;String, AtomicLong&gt;();<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      Random rand = new Random();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        String serverName = entry.getKey();<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        AtomicLong successes = new AtomicLong(0);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        successMap.put(serverName, successes);<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        if (this.allRegions) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>          for (HRegionInfo region : entry.getValue()) {<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            tasks.add(new RegionServerTask(this.connection,<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>                serverName,<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>                region,<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>                getSink(),<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>                successes));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>          }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        } else {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>          // random select a region if flag not set<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>          HRegionInfo region = entry.getValue().get(rand.nextInt(entry.getValue().size()));<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>          tasks.add(new RegionServerTask(this.connection,<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>              serverName,<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>              region,<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>              getSink(),<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>              successes));<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>        }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      }<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>      try {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>          try {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>            future.get();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          } catch (ExecutionException e) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.error("Sniff regionserver failed!", e);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        if (this.allRegions) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>            String serverName = entry.getKey();<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            LOG.info("Successfully read " + successMap.get(serverName) + " regions out of "<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>                    + entry.getValue().size() + " on regionserver:" + serverName);<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      } catch (InterruptedException e) {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        LOG.error("Sniff regionserver interrupted!", e);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      }<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>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; filterRegionServerByName() {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; regionServerAndRegionsMap = this.getAllRegionServerByName();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      regionServerAndRegionsMap = this.doFilterRegionServerByName(regionServerAndRegionsMap);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>      return regionServerAndRegionsMap;<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; getAllRegionServerByName() {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      Table table = null;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      RegionLocator regionLocator = null;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      try {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        if (LOG.isDebugEnabled()) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          LOG.debug(String.format("reading list of tables and locations"));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        HTableDescriptor[] tableDescs = this.admin.listTables();<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        List&lt;HRegionInfo&gt; regions = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>        for (HTableDescriptor tableDesc : tableDescs) {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>          table = this.admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>          regionLocator = this.admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>          for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>            ServerName rs = location.getServerName();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>            String rsName = rs.getHostname();<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>            HRegionInfo r = location.getRegionInfo();<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>            if (rsAndRMap.containsKey(rsName)) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>              regions = rsAndRMap.get(rsName);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            } else {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>              regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>              rsAndRMap.put(rsName, regions);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>            regions.add(r);<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>          }<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>          table.close();<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span><a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      } catch (IOException e) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        String msg = "Get HTables info failed";<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        LOG.error(msg, e);<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>      } finally {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        if (table != null) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          try {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            table.close();<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          } catch (IOException e) {<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>            LOG.warn("Close table failed", e);<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>        }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>      }<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span><a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return rsAndRMap;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; doFilterRegionServerByName(<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; fullRsAndRMap) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; filteredRsAndRMap = null;<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span><a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        filteredRsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        Pattern pattern = null;<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        Matcher matcher = null;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        boolean regExpFound = false;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (String rsName : this.targets) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (this.useRegExp) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>            regExpFound = false;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>            pattern = Pattern.compile(rsName);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : fullRsAndRMap.entrySet()) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>              matcher = pattern.matcher(entry.getKey());<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>              if (matcher.matches()) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>                filteredRsAndRMap.put(entry.getKey(), entry.getValue());<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>                regExpFound = true;<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>            if (!regExpFound) {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>              LOG.info("No RegionServerInfo found, regionServerPattern:" + rsName);<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            if (fullRsAndRMap.containsKey(rsName)) {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>              filteredRsAndRMap.put(rsName, fullRsAndRMap.get(rsName));<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>            } else {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>              LOG.info("No RegionServerInfo found, regionServerName:" + rsName);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>            }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>          }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        }<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>        filteredRsAndRMap = fullRsAndRMap;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return filteredRsAndRMap;<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><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  public static void main(String[] args) throws Exception {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    final Configuration conf = HBaseConfiguration.create();<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span><a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // loading the generic options to conf<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    new GenericOptionsParser(conf, args);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    int numThreads = conf.getInt("hbase.canary.threads.num", MAX_THREADS_NUM);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    LOG.info("Number of exection threads " + numThreads);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span><a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(numThreads);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span><a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    Class&lt;? extends Sink&gt; sinkClass =<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        conf.getClass("hbase.canary.sink.class", RegionServerStdOutSink.class, Sink.class);<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>    Sink sink = ReflectionUtils.newInstance(sinkClass);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span><a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    int exitCode = ToolRunner.run(conf, new Canary(executor, sink), args);<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    executor.shutdown();<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    System.exit(exitCode);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>}<a name="line.1244"></a>
+<span class="sourceLineNo">625</span>            }<a name="line.625"></a>
+<span class="sourceLineNo">626</span>          }<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>            monitorThread.interrupt();<a name="line.629"></a>
+<span class="sourceLineNo">630</span>            return monitor.errorCode;<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        } finally {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>          if (monitor != null) monitor.close();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        }<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>        Thread.sleep(interval);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      } while (interval &gt; 0);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    } // try-with-resources close<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    if (choreService != null) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>      choreService.shutdown();<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    return monitor.errorCode;<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>  private void printUsageAndExit() {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    System.err.printf(<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        getClass().getName());<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    System.err.println(" where [opts] are:");<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.err.println("   -help          Show this help and exit.");<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    System.err.println("      which means to enable regionserver mode");<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    System.err.println("      only works in regionserver mode.");<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        " default is true");<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.665"></a>
+<span class="sourceLineNo">666</span>        + " Default is hbase:canary");<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    System.err<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    System.exit(USAGE_EXIT_CODE);<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>   * A Factory method for {@link Monitor}.<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * Can be overridden by user.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @param index a start index for monitor target<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   * @param args args passed from user<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   * @return a Monitor instance<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   */<a name="line.678"></a>
+<span class="sourceLineNo">679</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Monitor monitor = null;<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    String[] monitorTargets = null;<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>    if(index &gt;= 0) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      int length = args.length - index;<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      monitorTargets = new String[length];<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.regionServerMode) {<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      monitor =<a name="line.690"></a>
+<span class="sourceLineNo">691</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.691"></a>
+<span class="sourceLineNo">692</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.692"></a>
+<span class="sourceLineNo">693</span>              this.treatFailureAsError);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    } else {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      monitor =<a name="line.695"></a>
+<span class="sourceLineNo">696</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.696"></a>
+<span class="sourceLineNo">697</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return monitor;<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">702</span>  // a Monitor super-class can be extended by users<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    protected Connection connection;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    protected Admin admin;<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    protected String[] targets;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    protected boolean useRegExp;<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    protected boolean treatFailureAsError;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    protected boolean initialized = false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>    protected boolean done = false;<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    protected int errorCode = 0;<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    protected Sink sink;<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    protected ExecutorService executor;<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>    public boolean isDone() {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      return done;<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>    public boolean hasError() {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      return errorCode != 0;<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">724</span><a name="line.724"></a>
+<span class="sourceLineNo">725</span>    public boolean finalCheckForErrors() {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      if (errorCode != 0) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        return true;<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      return treatFailureAsError &amp;&amp;<a name="line.729"></a>
+<span class="sourceLineNo">730</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>    @Override<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    public void close() throws IOException {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (this.admin != null) this.admin.close();<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.738"></a>
+<span class="sourceLineNo">739</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.740"></a>
+<span class="sourceLineNo">741</span><a name="line.741"></a>
+<span class="sourceLineNo">742</span>      this.connection = connection;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      this.targets = monitorTargets;<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      this.useRegExp = useRegExp;<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      this.sink = sink;<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      this.executor = executor;<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>    @Override<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    public abstract void run();<a name="line.751"></a>
+<span class="sourceLineNo">752</span><a name="line.752"></a>
+<span class="sourceLineNo">753</span>    protected boolean initAdmin() {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>      if (null == this.admin) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        try {<a name="line.755"></a>
+<span class="sourceLineNo">756</span>          this.admin = this.connection.getAdmin();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        } catch (Exception e) {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.758"></a>
+<span class="sourceLineNo">759</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
+<span class="sourceLineNo">761</span>      } else if (admin.isAborted()) {<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        LOG.error("HBaseAdmin aborted");<a name="line.762"></a>
+<span class="sourceLineNo">763</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      return !this.hasError();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
+<span class="sourceLineNo">767</span>  }<a name="line.767"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>  // a monitor for region mode<a name="line.769"></a>
+<span class="sourceLineNo">770</span>  private static class RegionMonitor extends Monitor {<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    // 10 minutes<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    // 1 days<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    private long lastCheckTime = -1;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    private boolean writeSniffing;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    private TableName writeTableName;<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private int writeDataTTL;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    private float regionsLowerLimit;<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    private float regionsUpperLimit;<a name="line.781"></a>
+<span class="sourceLineNo">782</span>    private int checkPeriod;<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.784"></a>
+<span class="sourceLineNo">785</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.785"></a>
+<span class="sourceLineNo">786</span>        boolean treatFailureAsError) {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      Configuration conf = connection.getConfiguration();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      this.writeSniffing = writeSniffing;<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      this.writeTableName = writeTableName;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      this.writeDataTTL =<a name="line.791"></a>
+<span class="sourceLineNo">792</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.792"></a>
+<span class="sourceLineNo">793</span>      this.regionsLowerLimit =<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      this.regionsUpperLimit =<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.796"></a>
+<span class="sourceLineNo">797</span>      this.checkPeriod =<a name="line.797"></a>
+<span class="sourceLineNo">798</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.798"></a>
+<span class="sourceLineNo">799</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    @Override<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    public void run() {<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      if (this.initAdmin()) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>        try {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>            this.initialized = true;<a name="line.809"></a>
+<span class="sourceLineNo">810</span>            for (String table : tables) {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.811"></a>
+<span class="sourceLineNo">812</span>            }<a name="line.812"></a>
+<span class="sourceLineNo">813</span>          } else {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.814"></a>
+<span class="sourceLineNo">815</span>          }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>          if (writeSniffing) {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>              try {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>                checkWriteTableDistribution();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>              } catch (IOException e) {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>              }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.824"></a>
+<span class="sourceLineNo">825</span>            }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>            // sniff canary table with write operation<a name="line.826"></a>
+<span class="sourceLineNo">827</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.827"></a>
+<span class="sourceLineNo">828</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.828"></a>
+<span class="sourceLineNo">829</span>          }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>            try {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>              future.get();<a name="line.833"></a>
+<span class="sourceLineNo">834</span>            } catch (ExecutionException e) {<a name="line.834"></a>
+<span class="sourceLineNo">835</span>              LOG.error("Sniff region failed!", e);<a name="line.835"></a>
+<span class="sourceLineNo">836</span>            }<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        } catch (Exception e) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>          LOG.error("Run regionMonitor failed", e);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          this.errorCode = ERROR_EXIT_CODE;<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>      this.done = true;<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>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>      String[] returnTables = null;<a name="line.847"></a>
+<span class="sourceLineNo">848</span><a name="line.848"></a>
+<span class="sourceLineNo">849</span>      if (this.useRegExp) {<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        Pattern pattern = null;<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        HTableDescriptor[] tds = null;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        try {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          if (LOG.isDebugEnabled()) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>            LOG.debug(String.format("reading list of tables"));<a name="line.855"></a>
+<span class="sourceLineNo">856</span>          }<a name="line.856"></a>
+<span class="sourceLineNo">857</span>          tds = this.admin.listTables(pattern);<a name="line.857"></a>
+<span class="sourceLineNo">858</span>          if (tds == null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            tds = new HTableDescriptor[0];<a name="line.859"></a>
+<span class="sourceLineNo">860</span>          }<a name="line.860"></a>
+<span class="sourceLineNo">861</span>          for (String monitorTarget : monitorTargets) {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>            pattern = Pattern.compile(monitorTarget);<a name="line.862"></a>
+<span class="sourceLineNo">863</span>            for (HTableDescriptor td : tds) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>                tmpTables.add(td.getNameAsString());<a name="line.865"></a>
+<span class="sourceLineNo">866</span>              }<a name="line.866"></a>
+<span class="sourceLineNo">867</span>            }<a name="line.867"></a>
+<span class="sourceLineNo">868</span>          }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        } catch (IOException e) {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>          LOG.error("Communicate with admin failed", e);<a name="line.870"></a>
+<span class="sourceLineNo">871</span>          throw e;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>        if (tmpTables.size() &gt; 0) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>        } else {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          LOG.error(msg);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          throw new TableNotFoundException(msg);<a name="line.880"></a>
+<span class="sourceLineNo">881</span>        }<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      } else {<a name="line.882"></a>
+<span class="sourceLineNo">883</span>        returnTables = monitorTargets

<TRUNCATED>

[25/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
index fbdde18..1d64963 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
@@ -2959,7 +2959,7 @@
 <span class="sourceLineNo">2951</span>    Set&lt;byte[]&gt; deletesCfSet = null;<a name="line.2951"></a>
 <span class="sourceLineNo">2952</span>    long currentNonceGroup = HConstants.NO_NONCE;<a name="line.2952"></a>
 <span class="sourceLineNo">2953</span>    long currentNonce = HConstants.NO_NONCE;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    WALEdit walEdit = new WALEdit(replay);<a name="line.2954"></a>
+<span class="sourceLineNo">2954</span>    WALEdit walEdit = null;<a name="line.2954"></a>
 <span class="sourceLineNo">2955</span>    boolean locked = false;<a name="line.2955"></a>
 <span class="sourceLineNo">2956</span>    // reference family maps directly so coprocessors can mutate them if desired<a name="line.2956"></a>
 <span class="sourceLineNo">2957</span>    Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps = new Map[batchOp.operations.length];<a name="line.2957"></a>
@@ -2970,4878 +2970,4890 @@
 <span class="sourceLineNo">2962</span>    int noOfPuts = 0;<a name="line.2962"></a>
 <span class="sourceLineNo">2963</span>    int noOfDeletes = 0;<a name="line.2963"></a>
 <span class="sourceLineNo">2964</span>    WriteEntry writeEntry = null;<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    try {<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>      int numReadyToWrite = 0;<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>          lastIndexExclusive++;<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>          continue;<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>        }<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>        RowLock rowLock = null;<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>        try {<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>        } catch (IOException ioe) {<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span>        }<a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>        if (rowLock == null) {<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>          // We failed to grab another lock<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>          break; // Stop acquiring more rows for this batch<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>        } else {<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>          acquiredRowLocks.add(rowLock);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span>        }<a name="line.2989"></a>
-<span class="sourceLineNo">2990</span><a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>        lastIndexExclusive++;<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>        numReadyToWrite++;<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span><a name="line.2993"></a>
-<span class="sourceLineNo">2994</span>        if (mutation instanceof Put) {<a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>          // If Column Families stay consistent through out all of the<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>          // individual puts then metrics can be reported as a multiput across<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>          // column families in the first put.<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>          if (putsCfSet == null) {<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>          } else {<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span>          }<a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>        } else {<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>          if (deletesCfSet == null) {<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>          } else {<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>          }<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span>        }<a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>      }<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span><a name="line.3013"></a>
-<span class="sourceLineNo">3014</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3014"></a>
-<span class="sourceLineNo">3015</span><a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3020"></a>
-<span class="sourceLineNo">3021</span><a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>        return 0L;<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>      }<a name="line.3025"></a>
+<span class="sourceLineNo">2965</span>    int cellCount = 0;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    try {<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>      int numReadyToWrite = 0;<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>          lastIndexExclusive++;<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span>          continue;<a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>        }<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>        RowLock rowLock = null;<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span>        try {<a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>        } catch (IOException ioe) {<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>        }<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>        if (rowLock == null) {<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>          // We failed to grab another lock<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span>          break; // Stop acquiring more rows for this batch<a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>        } else {<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>          acquiredRowLocks.add(rowLock);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>        }<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span><a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>        lastIndexExclusive++;<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span>        numReadyToWrite++;<a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>        if (replay) {<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>          for (List&lt;Cell&gt; cells : mutation.getFamilyCellMap().values()) {<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>            cellCount += cells.size();<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>          }<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>        }<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span>        if (mutation instanceof Put) {<a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>          // If Column Families stay consistent through out all of the<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>          // individual puts then metrics can be reported as a multiput across<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>          // column families in the first put.<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>          if (putsCfSet == null) {<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>          } else {<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>          }<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>        } else {<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>          if (deletesCfSet == null) {<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>          } else {<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>          }<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>        }<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>      }<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span><a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span><a name="line.3020"></a>
+<span class="sourceLineNo">3021</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3025"></a>
 <span class="sourceLineNo">3026</span><a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span>        // skip invalid<a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>          // lastIndexExclusive was incremented above.<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span>          continue;<a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>        }<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span><a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>        if (mutation instanceof Put) {<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>          noOfPuts++;<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>        } else {<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>          noOfDeletes++;<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>        }<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span>      }<a name="line.3044"></a>
-<span class="sourceLineNo">3045</span><a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>      locked = true;<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span><a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>      // calling the pre CP hook for batch mutation<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>          return 0L;<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>        }<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>      }<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span><a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>      // STEP 3. Build WAL edit<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>          continue;<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>        }<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>        Mutation m = batchOp.getMutation(i);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>          durability = tmpDur;<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>        }<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>          continue;<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span>        }<a name="line.3075"></a>
-<span class="sourceLineNo">3076</span><a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>        long nonce = batchOp.getNonce(i);<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>          // Write what we have so far for nonces out to WAL<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>          walEdit = new WALEdit(replay);<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span>          currentNonceGroup = nonceGroup;<a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>          currentNonce = nonce;<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>        }<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span><a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>        // Add WAL edits by CP<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>        if (fromCP != null) {<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span>            walEdit.add(cell);<a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>          }<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>        }<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span>      }<a name="line.3098"></a>
-<span class="sourceLineNo">3099</span><a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>      WALKey walKey = null;<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>      if (replay) {<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>        // use wal key from the original<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3107"></a>
-<span class="sourceLineNo">3108</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>      }<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>      if (!walEdit.isEmpty()) {<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>        if (!replay) {<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>        }<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>        try {<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span>          long txid =<a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>          if (txid != 0) sync(txid, durability);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span>          writeEntry = walKey.getWriteEntry();<a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>        } catch (IOException ioe) {<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>          throw ioe;<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>        }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>      }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span>      if (walKey == null) {<a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>        writeEntry = mvcc.begin();<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>      }<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span><a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>      // STEP 5. Write back to memstore<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>      long addedSize = 0;<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>          continue;<a name="line.3139"></a>
+<span class="sourceLineNo">3027</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>        return 0L;<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span>      }<a name="line.3030"></a>
+<span class="sourceLineNo">3031</span><a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>        // skip invalid<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>          // lastIndexExclusive was incremented above.<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>          continue;<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span>        }<a name="line.3038"></a>
+<span class="sourceLineNo">3039</span><a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>        if (mutation instanceof Put) {<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>          noOfPuts++;<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>        } else {<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>          noOfDeletes++;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>        }<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span>        if (fromCP != null) {<a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>          cellCount += fromCP.size();<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>        }<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>        for (List&lt;Cell&gt; cells : familyMaps[i].values()) {<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span>          cellCount += cells.size();<a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>        }<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>      }<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>      walEdit = new WALEdit(cellCount, replay);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>      locked = true;<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span><a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>      // calling the pre CP hook for batch mutation<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>          return 0L;<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>        }<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>      }<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>      // STEP 3. Build WAL edit<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span>          continue;<a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>        }<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span><a name="line.3078"></a>
+<span class="sourceLineNo">3079</span>        Mutation m = batchOp.getMutation(i);<a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>          durability = tmpDur;<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>        }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>          continue;<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>        }<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span><a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>        long nonce = batchOp.getNonce(i);<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>          // Write what we have so far for nonces out to WAL<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>          walEdit = new WALEdit(cellCount, replay);<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>          currentNonceGroup = nonceGroup;<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>          currentNonce = nonce;<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>        }<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span><a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>        // Add WAL edits by CP<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span>        if (fromCP != null) {<a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>            walEdit.add(cell);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>          }<a name="line.3107"></a>
+<span class="sourceLineNo">3108</span>        }<a name="line.3108"></a>
+<span class="sourceLineNo">3109</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>      }<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span><a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>      WALKey walKey = null;<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>      if (replay) {<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>        // use wal key from the original<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>      }<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>      if (!walEdit.isEmpty()) {<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span>        if (!replay) {<a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>        }<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>        try {<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>          long txid =<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>          if (txid != 0) sync(txid, durability);<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>          writeEntry = walKey.getWriteEntry();<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>        } catch (IOException ioe) {<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>          throw ioe;<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span>        }<a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span>      }<a name="line.3143"></a>
-<span class="sourceLineNo">3144</span><a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>      // STEP 6. Complete mvcc.<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>      if (replay) {<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>        mvcc.completeAndWait(writeEntry);<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>        writeEntry = null;<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span>      }<a name="line.3151"></a>
-<span class="sourceLineNo">3152</span><a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>      // STEP 7. Release row locks, etc.<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>      if (locked) {<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span>        this.updatesLock.readLock().unlock();<a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>        locked = false;<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>      }<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>      // calling the post CP hook for batch mutation<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>      }<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span><a name="line.3167"></a>
-<span class="sourceLineNo">3168</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>        }<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>      }<a name="line.3172"></a>
-<span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>          // only for successful puts<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span>              != OperationStatusCode.SUCCESS) {<a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>            continue;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>          }<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>          Mutation m = batchOp.getMutation(i);<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>          if (m instanceof Put) {<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>          } else {<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>          }<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>        }<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>      }<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span><a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>      success = true;<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span>      return addedSize;<a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    } finally {<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>      if (locked) {<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span>        this.updatesLock.readLock().unlock();<a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>      }<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span><a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>      // See if the column families were consistent through the whole thing.<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>      // null will be treated as unknown.<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span><a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>      if (noOfPuts &gt; 0) {<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>        // There were some Puts in the batch.<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>        if (this.metricsRegion != null) {<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span>          this.metricsRegion.updatePut();<a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>        }<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>      }<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>      if (noOfDeletes &gt; 0) {<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>        // There were some Deletes in the batch.<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>        if (this.metricsRegion != null) {<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span>          this.metricsRegion.updateDelete();<a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>        }<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>      }<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>      if (!success) {<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>          }<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>        }<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>      }<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>        // call the coprocessor hook to do any finalization steps<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>        // after the put is done<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>                lastIndexExclusive);<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>      }<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span><a name="line.3236"></a>
-<span class="sourceLineNo">3237</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    }<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>  }<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>  throws IOException {<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    if (walEdit.isEmpty()) return;<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>  }<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span><a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>  throws IOException {<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    boolean skip = false;<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    // Skip anything that "ran" already<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>      return true;<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span>    }<a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span>    // store the family map reference to allow for mutations<a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    try {<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>      if (mutation instanceof Put) {<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>        // Check the families in the put. If bad, skip this one.<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>        if (batchOp.isInReplay()) {<a name="line.3271"></a>
-<span class="sourceLineNo">3272</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>        } else {<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>          checkFamilies(familyMap.keySet());<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>        }<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>      } else {<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span>        prepareDelete((Delete)mutation);<a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>      }<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>      skip = true;<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>      skip = true;<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    } catch (WrongRegionException we) {<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>      skip = true;<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    }<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    return skip;<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>  }<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>  /**<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>   * During replay, there could exist column families which are removed between region server<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>   * failure and replay<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>   */<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>        if (nonExistentList == null) {<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span>        }<a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>        nonExistentList.add(family);<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>      }<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>    }<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>    if (nonExistentList != null) {<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>      for (byte[] family : nonExistentList) {<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>        // Perhaps schema was changed between crash and replay<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>        familyMap.remove(family);<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>      }<a name="line.3319"></a>
-<span class="sourceLineNo">3320</span>    }<a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>  }<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span><a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>  /**<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span>   * Returns effective durability from the passed durability and<a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>   * the table descriptor.<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span>   */<a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>  }<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span><a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>  @Override<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      boolean writeToWAL)<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>  throws IOException{<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    checkMutationType(mutation, row);<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>      mutation, writeToWAL);<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>  }<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span><a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>  @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3343"></a>
-<span class="sourceLineNo">3344</span>      boolean writeToWAL)<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>  throws IOException {<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, rm, null,<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>      writeToWAL);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>  }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span><a name="line.3349"></a>
-<span class="sourceLineNo">3350</span>  /**<a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>   * checkAndMutate and checkAndRowMutate are 90% the same. Rather than copy/paste, below has<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>   * switches in the few places where there is deviation.<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span>   */<a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>  private boolean doCheckAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rowMutations,<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>      Mutation mutation, boolean writeToWAL)<a name="line.3356"></a>
+<span class="sourceLineNo">3141</span>      }<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>      if (walKey == null) {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>        writeEntry = mvcc.begin();<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>      }<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span><a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>      // STEP 5. Write back to memstore<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>      long addedSize = 0;<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>          continue;<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>        }<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>      }<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span><a name="line.3156"></a>
+<span class="sourceLineNo">3157</span>      // STEP 6. Complete mvcc.<a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>      if (replay) {<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span>        mvcc.completeAndWait(writeEntry);<a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>        writeEntry = null;<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>      }<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span><a name="line.3164"></a>
+<span class="sourceLineNo">3165</span>      // STEP 7. Release row locks, etc.<a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>      if (locked) {<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>        this.updatesLock.readLock().unlock();<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>        locked = false;<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span>      }<a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span><a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>      // calling the post CP hook for batch mutation<a name="line.3172"></a>
+<span class="sourceLineNo">3173</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3173"></a>
+<span class="sourceLineNo">3174</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span>      }<a name="line.3178"></a>
+<span class="sourceLineNo">3179</span><a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span>        }<a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>      }<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span><a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span>          // only for successful puts<a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>              != OperationStatusCode.SUCCESS) {<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>            continue;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>          }<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span>          Mutation m = batchOp.getMutation(i);<a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>          if (m instanceof Put) {<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>          } else {<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>          }<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>        }<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>      }<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>      success = true;<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>      return addedSize;<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    } finally {<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>      if (locked) {<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>        this.updatesLock.readLock().unlock();<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>      }<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span><a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>      // See if the column families were consistent through the whole thing.<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>      // null will be treated as unknown.<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span><a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>      if (noOfPuts &gt; 0) {<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span>        // There were some Puts in the batch.<a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>        if (this.metricsRegion != null) {<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>          this.metricsRegion.updatePut();<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>        }<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>      }<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>      if (noOfDeletes &gt; 0) {<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span>        // There were some Deletes in the batch.<a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>        if (this.metricsRegion != null) {<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>          this.metricsRegion.updateDelete();<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>        }<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>      }<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span>      if (!success) {<a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>          }<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>        }<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>      }<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>        // call the coprocessor hook to do any finalization steps<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span>        // after the put is done<a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>                lastIndexExclusive);<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span>      }<a name="line.3247"></a>
+<span class="sourceLineNo">3248</span><a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span>    }<a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>  }<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span><a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  throws IOException {<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span>    if (walEdit.isEmpty()) return;<a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  }<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span><a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>  throws IOException {<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    boolean skip = false;<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    // Skip anything that "ran" already<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3271"></a>
+<span class="sourceLineNo">3272</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3272"></a>
+<span class="sourceLineNo">3273</span>      return true;<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    }<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span>    // store the family map reference to allow for mutations<a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span><a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    try {<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>      if (mutation instanceof Put) {<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span>        // Check the families in the put. If bad, skip this one.<a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>        if (batchOp.isInReplay()) {<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>        } else {<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>          checkFamilies(familyMap.keySet());<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>        }<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>      } else {<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>        prepareDelete((Delete)mutation);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>      }<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span>      skip = true;<a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>      skip = true;<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    } catch (WrongRegionException we) {<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>      skip = true;<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    }<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span>    return skip;<a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>  }<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span><a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>  /**<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>   * During replay, there could exist column families which are removed between region server<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>   * failure and replay<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3319"></a>
+<span class="sourceLineNo">3320</span>        if (nonExistentList == null) {<a name="line.3320"></a>
+<span class="sourceLineNo">3321</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>        }<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>        nonExistentList.add(family);<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>      }<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>    }<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>    if (nonExistentList != null) {<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>      for (byte[] family : nonExistentList) {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>        // Perhaps schema was changed between crash and replay<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span>        familyMap.remove(family);<a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>      }<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    }<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>  }<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>  /**<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span>   * Returns effective durability from the passed durability and<a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>   * the table descriptor.<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>   */<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>  }<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span><a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>  @Override<a name="line.3343"></a>
+<span class="sourceLineNo">3344</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3344"></a>
+<span class="sourceLineNo">3345</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>      boolean writeToWAL)<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span>  throws IOException{<a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    checkMutationType(mutation, row);<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>      mutation, writeToWAL);<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>  }<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span><a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>  @Override<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      boolean writeToWAL)<a name="line.3356"></a>
 <span class="sourceLineNo">3357</span>  throws IOException {<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // Could do the below checks but seems wacky with two callers only. Just comment out for now.<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // One caller passes a Mutation, the other passes RowMutation. Presume all good so we don't<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // need these commented out checks.<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // if (rowMutations == null &amp;&amp; mutation == null) throw new DoNotRetryIOException("Both null");<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // if (rowMutations != null &amp;&amp; mutation != null) throw new DoNotRetryIOException("Both set");<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    checkReadOnly();<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // TODO, add check for value length also move this check to the client<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span>    checkResources();<a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    startRegionOperation();<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    try {<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>      Get get = new Get(row);<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>      checkFamily(family);<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>      get.addColumn(family, qualifier);<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>      // Lock row - note that doBatchMutate will relock this row if called<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>      RowLock rowLock = getRowLock(get.getRow());<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>      try {<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>        if (mutation != null &amp;&amp; this.getCoprocessorHost() != null) {<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>          // Call coprocessor.<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>          Boolean processed = null;<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>          if (mutation instanceof Put) {<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>            processed = this.getCoprocessorHost().preCheckAndPutAfterRowLock(row, family,<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>                qualifier, compareOp, comparator, (Put)mutation);<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>          } else if (mutation instanceof Delete) {<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>            processed = this.getCoprocessorHost().preCheckAndDeleteAfterRowLock(row, family,<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span>                qualifier, compareOp, comparator, (Delete)mutation);<a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>          }<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>          if (processed != null) {<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>            return processed;<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>          }<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>        }<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>        // NOTE: We used to wait here until mvcc caught up:  mvcc.await();<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        // Supposition is that now all changes are done under row locks, then when we go to read,<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>        // we'll get the latest on this row.<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        List&lt;Cell&gt; result = get(get, false);<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>        boolean valueIsNull = comparator.getValue() == null || comparator.getValue().length == 0;<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        boolean matches = false;<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>        long cellTs = 0;<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        if (result.size() == 0 &amp;&amp; valueIsNull) {<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>          matches = true;<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>        } else if (result.size() &gt; 0 &amp;&amp; result.get(0).getValueLength() == 0 &amp;&amp; valueIsNull) {<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>          matches = true;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>          cellTs = result.get(0).getTimestamp();<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        } else if (result.size() == 1 &amp;&amp; !valueIsNull) {<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>          Cell kv = result.get(0);<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>          cellTs = kv.getTimestamp();<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>          int compareResult = CellComparator.compareValue(kv, comparator);<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span>          matches = matches(compareOp, compareResult);<a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>        }<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>        // If matches put the new put or delete the new delete<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>        if (matches) {<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>          // We have acquired the row lock alrea

<TRUNCATED>

[08/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
index d3abe39..c51826f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerStdOutSink.html
@@ -615,9 +615,9 @@
 <span class="sourceLineNo">607</span>            if (this.failOnError &amp;&amp; monitor.hasError()) {<a name="line.607"></a>
 <span class="sourceLineNo">608</span>              monitorThread.interrupt();<a name="line.608"></a>
 <span class="sourceLineNo">609</span>              if (monitor.initialized) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>                System.exit(monitor.errorCode);<a name="line.610"></a>
+<span class="sourceLineNo">610</span>                return monitor.errorCode;<a name="line.610"></a>
 <span class="sourceLineNo">611</span>              } else {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.612"></a>
+<span class="sourceLineNo">612</span>                return INIT_ERROR_EXIT_CODE;<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>            currentTimeLength = System.currentTimeMillis() - startTime;<a name="line.615"></a>
@@ -626,630 +626,629 @@
 <span class="sourceLineNo">618</span>                  + ") after timeout limit:" + this.timeout<a name="line.618"></a>
 <span class="sourceLineNo">619</span>                  + " will be killed itself !!");<a name="line.619"></a>
 <span class="sourceLineNo">620</span>              if (monitor.initialized) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>                System.exit(TIMEOUT_ERROR_EXIT_CODE);<a name="line.621"></a>
+<span class="sourceLineNo">621</span>                return TIMEOUT_ERROR_EXIT_CODE;<a name="line.621"></a>
 <span class="sourceLineNo">622</span>              } else {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.623"></a>
+<span class="sourceLineNo">623</span>                return INIT_ERROR_EXIT_CODE;<a name="line.623"></a>
 <span class="sourceLineNo">624</span>              }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>              break;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>            monitorThread.interrupt();<a name="line.630"></a>
-<span class="sourceLineNo">631</span>            System.exit(monitor.errorCode);<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } finally {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          if (monitor != null) monitor.close();<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>        Thread.sleep(interval);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      } while (interval &gt; 0);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    } // try-with-resources close<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    if (choreService != null) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      choreService.shutdown();<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    return(monitor.errorCode);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>  }<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private void printUsageAndExit() {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    System.err.printf(<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        getClass().getName());<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    System.err.println(" where [opts] are:");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    System.err.println("   -help          Show this help and exit.");<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    System.err.println("      which means to enable regionserver mode");<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    System.err.println("      only works in regionserver mode.");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        " default is true");<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        + " Default is hbase:canary");<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    System.err<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * A Factory method for {@link Monitor}.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   * Can be overridden by user.<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param index a start index for monitor target<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param args args passed from user<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a Monitor instance<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   */<a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    Monitor monitor = null;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    String[] monitorTargets = null;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    if(index &gt;= 0) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int length = args.length - index;<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      monitorTargets = new String[length];<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>    if (this.regionServerMode) {<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      monitor =<a name="line.691"></a>
-<span class="sourceLineNo">692</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.693"></a>
-<span class="sourceLineNo">694</span>              this.treatFailureAsError);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    } else {<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      monitor =<a name="line.696"></a>
-<span class="sourceLineNo">697</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    return monitor;<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>  // a Monitor super-class can be extended by users<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>    protected Connection connection;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    protected Admin admin;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    protected String[] targets;<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    protected boolean useRegExp;<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    protected boolean treatFailureAsError;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    protected boolean initialized = false;<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    protected boolean done = false;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected int errorCode = 0;<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    protected Sink sink;<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    protected ExecutorService executor;<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>    public boolean isDone() {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return done;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    public boolean hasError() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return errorCode != 0;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span><a name="line.725"></a>
-<span class="sourceLineNo">726</span>    public boolean finalCheckForErrors() {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      if (errorCode != 0) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>        return true;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      return treatFailureAsError &amp;&amp;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>    @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    public void close() throws IOException {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (this.admin != null) this.admin.close();<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span><a name="line.738"></a>
-<span class="sourceLineNo">739</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      this.connection = connection;<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      this.targets = monitorTargets;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      this.useRegExp = useRegExp;<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.sink = sink;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      this.executor = executor;<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>    @Override<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    public abstract void run();<a name="line.752"></a>
-<span class="sourceLineNo">753</span><a name="line.753"></a>
-<span class="sourceLineNo">754</span>    protected boolean initAdmin() {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      if (null == this.admin) {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        try {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>          this.admin = this.connection.getAdmin();<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        } catch (Exception e) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>        }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      } else if (admin.isAborted()) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>        LOG.error("HBaseAdmin aborted");<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      }<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return !this.hasError();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
-<span class="sourceLineNo">769</span><a name="line.769"></a>
-<span class="sourceLineNo">770</span>  // a monitor for region mode<a name="line.770"></a>
-<span class="sourceLineNo">771</span>  private static class RegionMonitor extends Monitor {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    // 10 minutes<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    // 1 days<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>    private long lastCheckTime = -1;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private boolean writeSniffing;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    private TableName writeTableName;<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    private int writeDataTTL;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private float regionsLowerLimit;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    private float regionsUpperLimit;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    private int checkPeriod;<a name="line.783"></a>
-<span class="sourceLineNo">784</span><a name="line.784"></a>
-<span class="sourceLineNo">785</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        boolean treatFailureAsError) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      Configuration conf = connection.getConfiguration();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      this.writeSniffing = writeSniffing;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      this.writeTableName = writeTableName;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      this.writeDataTTL =<a name="line.792"></a>
-<span class="sourceLineNo">793</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      this.regionsLowerLimit =<a name="line.794"></a>
-<span class="sourceLineNo">795</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      this.regionsUpperLimit =<a name="line.796"></a>
-<span class="sourceLineNo">797</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      this.checkPeriod =<a name="line.798"></a>
-<span class="sourceLineNo">799</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.799"></a>
-<span class="sourceLineNo">800</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>    @Override<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    public void run() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      if (this.initAdmin()) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        try {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.809"></a>
-<span class="sourceLineNo">810</span>            this.initialized = true;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>            for (String table : tables) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.812"></a>
-<span class="sourceLineNo">813</span>            }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          } else {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>          }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>          if (writeSniffing) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>              try {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                checkWriteTableDistribution();<a name="line.821"></a>
-<span class="sourceLineNo">822</span>              } catch (IOException e) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.823"></a>
-<span class="sourceLineNo">824</span>              }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>            }<a name="line.826"></a>
-<span class="sourceLineNo">827</span>            // sniff canary table with write operation<a name="line.827"></a>
-<span class="sourceLineNo">828</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.828"></a>
-<span class="sourceLineNo">829</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>          }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            try {<a name="line.833"></a>
-<span class="sourceLineNo">834</span>              future.get();<a name="line.834"></a>
-<span class="sourceLineNo">835</span>            } catch (ExecutionException e) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>              LOG.error("Sniff region failed!", e);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>            }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          }<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        } catch (Exception e) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>          LOG.error("Run regionMonitor failed", e);<a name="line.840"></a>
-<span class="sourceLineNo">841</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      this.done = true;<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      String[] returnTables = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span><a name="line.849"></a>
-<span class="sourceLineNo">850</span>      if (this.useRegExp) {<a name="line.850"></a>
-<span class="sourceLineNo">851</span>        Pattern pattern = null;<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        HTableDescriptor[] tds = null;<a name="line.852"></a>
-<span class="sourceLineNo">853</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        try {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>          if (LOG.isDebugEnabled()) {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>            LOG.debug(String.format("reading list of tables"));<a name="line.856"></a>
-<span class="sourceLineNo">857</span>          }<a name="line.857"></a>
-<span class="sourceLineNo">858</span>          tds = this.admin.listTables(pattern);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>          if (tds == null) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>            tds = new HTableDescriptor[0];<a name="line.860"></a>
-<span class="sourceLineNo">861</span>          }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>          for (String monitorTarget : monitorTargets) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>            pattern = Pattern.compile(monitorTarget);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>            for (HTableDescriptor td : tds) {<a name="line.864"></a>
-<span class="sourceLineNo">865</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>                tmpTables.add(td.getNameAsString());<a name="line.866"></a>
-<span class="sourceLineNo">867</span>              }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>            }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>          }<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        } catch (IOException e) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          LOG.error("Communicate with admin failed", e);<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          throw e;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>        if (tmpTables.size() &gt; 0) {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>        } else {<a name="line.877"></a>
-<span class="sourceLineNo">878</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          LOG.error(msg);<a name="line.879"></a>
-<span class="sourceLineNo">880</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>          throw new TableNotFoundException(msg);<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        }<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      } else {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>        returnTables = monitorTargets;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>      return returnTables;<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    }<a name="line.888"></a>
-<span class="sourceLineNo">889</span><a name="line.889"></a>
-<span class="sourceLineNo">890</span>    /*<a name="line.890"></a>
-<span class="sourceLineNo">891</span>     * canary entry point to monitor all the tables.<a name="line.891"></a>
-<span class="sourceLineNo">892</span>     */<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType) throws Exception {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      if (LOG.isDebugEnabled()) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        LOG.debug(String.format("reading list of tables"));<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.899"></a>
-<span class="sourceLineNo">900</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        }<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      return taskFutures;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      if (!admin.tableExists(writeTableName)) {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>        int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.909"></a>
-<span class="sourceLineNo">910</span>        if (numberOfServers == 0) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>          throw new IllegalStateException("No live regionservers");<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        }<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        createWriteTable(numberOfServers);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        admin.enableTable(writeTableName);<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      }<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>      int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      List&lt;Pair&lt;HRegionInfo, ServerName&gt;&gt; pairs =<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      int numberOfRegions = pairs.size();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        admin.disableTable(writeTableName);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        admin.deleteTable(writeTableName);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        createWriteTable(numberOfServers);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;ServerName&gt;();<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      for (Pair&lt;HRegionInfo, ServerName&gt; pair : pairs) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        serverSet.add(pair.getSecond());<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      int numberOfCoveredServers = serverSet.size();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        admin.balancer();<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    }<a name="line.938"></a>
-<span class="sourceLineNo">939</span><a name="line.939"></a>
-<span class="sourceLineNo">940</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          + " and you can change it by config: "<a name="line.945"></a>
-<span class="sourceLineNo">946</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      family.setMaxVersions(1);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      family.setTimeToLive(writeDataTTL);<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      desc.addFamily(family);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      admin.createTable(desc, splits);<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    }<a name="line.955"></a>
-<span class="sourceLineNo">956</span>  }<a name="line.956"></a>
-<span class="sourceLineNo">957</span><a name="line.957"></a>
-<span class="sourceLineNo">958</span>  /**<a name="line.958"></a>
-<span class="sourceLineNo">959</span>   * Canary entry point for specified table.<a name="line.959"></a>
-<span class="sourceLineNo">960</span>   * @throws Exception<a name="line.960"></a>
-<span class="sourceLineNo">961</span>   */<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static void sniff(final Admin admin, TableName tableName)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      throws Exception {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    sniff(admin, tableName, TaskType.READ);<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>  /**<a name="line.967"></a>
-<span class="sourceLineNo">968</span>   * Canary entry point for specified table with task type(read/write)<a name="line.968"></a>
-<span class="sourceLineNo">969</span>   * @throws Exception<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   */<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  public static void sniff(final Admin admin, TableName tableName, TaskType taskType)<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      throws Exception {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    List&lt;Future&lt;Void&gt;&gt; taskFutures =<a name="line.973"></a>
-<span class="sourceLineNo">974</span>        Canary.sniff(admin, new StdOutSink(), tableName.getNameAsString(),<a name="line.974"></a>
-<span class="sourceLineNo">975</span>          new ScheduledThreadPoolExecutor(1), taskType);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    for (Future&lt;Void&gt; future : taskFutures) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      future.get();<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><a name="line.980"></a>
-<span class="sourceLineNo">981</span>  /**<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   * Canary entry point for specified table.<a name="line.982"></a>
-<span class="sourceLineNo">983</span>   * @throws Exception<a name="line.983"></a>
-<span class="sourceLineNo">984</span>   */<a name="line.984"></a>
-<span class="sourceLineNo">985</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      ExecutorService executor, TaskType taskType) throws Exception {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    if (LOG.isDebugEnabled()) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        tableName));<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        executor, taskType);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    } else {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  /*<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>   * Loops over regions that owns this table, and output some information abouts the state.<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType) throws Exception {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span><a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    if (LOG.isDebugEnabled()) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>    Table table = null;<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    try {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    } catch (TableNotFoundException e) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      return new ArrayList&lt;Future&lt;Void&gt;&gt;();<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;RegionTask&gt;();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    try {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      for (HRegionInfo region : admin.getTableRegions(tableDesc.getTableName())) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        tasks.add(new RegionTask(admin.getConnection(), region, sink, taskType));<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    } finally {<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      table.close();<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    return executor.invokeAll(tasks);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>  // a monitor for regionserver mode<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  private static class RegionServerMonitor extends Monitor {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    private boolean allRegions;<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    public RegionServerMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        ExtendedSink sink, ExecutorService executor, boolean allRegions,<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        boolean treatFailureAsError) {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      this.allRegions = allRegions;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span><a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    private ExtendedSink getSink() {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      return (ExtendedSink) this.sink;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span><a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    @Override<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    public void run() {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      if (this.initAdmin() &amp;&amp; this.checkNoTableNames()) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = this.filterRegionServerByName();<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        this.initialized = true;<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>        this.monitorRegionServers(rsAndRMap);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      this.done = true;<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>    private boolean checkNoTableNames() {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      List&lt;String&gt; foundTableNames = new ArrayList&lt;String&gt;();<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>      TableName[] tableNames = null;<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      if (LOG.isDebugEnabled()) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      try {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>        tableNames = this.admin.listTableNames();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      } catch (IOException e) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        LOG.error("Get listTableNames failed", e);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        return false;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      if (this.targets == null || this.targets.length == 0) return true;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      for (String target : this.targets) {<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        for (TableName tableName : tableNames) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          if (target.equals(tableName.getNameAsString())) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>            foundTableNames.add(target);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (foundTableNames.size() &gt; 0) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        System.err.println("Cannot pass a tablename when using the -regionserver " +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>            "option, tablenames:" + foundTableNames.toString());<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        this.errorCode = USAGE_EXIT_CODE;<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      }<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      return foundTableNames.size() == 0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    }<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span><a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    private void monitorRegionServers(Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      List&lt;RegionServerTask&gt; tasks = new ArrayList&lt;RegionServerTask&gt;();<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      Map&lt;String, AtomicLong&gt; successMap = new HashMap&lt;String, AtomicLong&gt;();<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      Random rand = new Random();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        String serverName = entry.getKey();<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        AtomicLong successes = new AtomicLong(0);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        successMap.put(serverName, successes);<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        if (this.allRegions) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>          for (HRegionInfo region : entry.getValue()) {<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            tasks.add(new RegionServerTask(this.connection,<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>                serverName,<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>                region,<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>                getSink(),<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>                successes));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>          }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        } else {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>          // random select a region if flag not set<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>          HRegionInfo region = entry.getValue().get(rand.nextInt(entry.getValue().size()));<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>          tasks.add(new RegionServerTask(this.connection,<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>              serverName,<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>              region,<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>              getSink(),<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>              successes));<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>        }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      }<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>      try {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>          try {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>            future.get();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          } catch (ExecutionException e) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.error("Sniff regionserver failed!", e);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        if (this.allRegions) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>            String serverName = entry.getKey();<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            LOG.info("Successfully read " + successMap.get(serverName) + " regions out of "<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>                    + entry.getValue().size() + " on regionserver:" + serverName);<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      } catch (InterruptedException e) {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        LOG.error("Sniff regionserver interrupted!", e);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      }<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>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; filterRegionServerByName() {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; regionServerAndRegionsMap = this.getAllRegionServerByName();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      regionServerAndRegionsMap = this.doFilterRegionServerByName(regionServerAndRegionsMap);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>      return regionServerAndRegionsMap;<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; getAllRegionServerByName() {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      Table table = null;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      RegionLocator regionLocator = null;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      try {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        if (LOG.isDebugEnabled()) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          LOG.debug(String.format("reading list of tables and locations"));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        HTableDescriptor[] tableDescs = this.admin.listTables();<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        List&lt;HRegionInfo&gt; regions = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>        for (HTableDescriptor tableDesc : tableDescs) {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>          table = this.admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>          regionLocator = this.admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>          for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>            ServerName rs = location.getServerName();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>            String rsName = rs.getHostname();<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>            HRegionInfo r = location.getRegionInfo();<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>            if (rsAndRMap.containsKey(rsName)) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>              regions = rsAndRMap.get(rsName);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            } else {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>              regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>              rsAndRMap.put(rsName, regions);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>            regions.add(r);<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>          }<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>          table.close();<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span><a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      } catch (IOException e) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        String msg = "Get HTables info failed";<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        LOG.error(msg, e);<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>      } finally {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        if (table != null) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          try {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            table.close();<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          } catch (IOException e) {<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>            LOG.warn("Close table failed", e);<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>        }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>      }<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span><a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return rsAndRMap;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; doFilterRegionServerByName(<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; fullRsAndRMap) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; filteredRsAndRMap = null;<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span><a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        filteredRsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        Pattern pattern = null;<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        Matcher matcher = null;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        boolean regExpFound = false;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (String rsName : this.targets) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (this.useRegExp) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>            regExpFound = false;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>            pattern = Pattern.compile(rsName);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : fullRsAndRMap.entrySet()) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>              matcher = pattern.matcher(entry.getKey());<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>              if (matcher.matches()) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>                filteredRsAndRMap.put(entry.getKey(), entry.getValue());<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>                regExpFound = true;<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>            if (!regExpFound) {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>              LOG.info("No RegionServerInfo found, regionServerPattern:" + rsName);<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            if (fullRsAndRMap.containsKey(rsName)) {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>              filteredRsAndRMap.put(rsName, fullRsAndRMap.get(rsName));<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>            } else {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>              LOG.info("No RegionServerInfo found, regionServerName:" + rsName);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>            }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>          }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        }<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>        filteredRsAndRMap = fullRsAndRMap;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return filteredRsAndRMap;<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><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  public static void main(String[] args) throws Exception {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    final Configuration conf = HBaseConfiguration.create();<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span><a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // loading the generic options to conf<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    new GenericOptionsParser(conf, args);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    int numThreads = conf.getInt("hbase.canary.threads.num", MAX_THREADS_NUM);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    LOG.info("Number of exection threads " + numThreads);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span><a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(numThreads);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span><a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    Class&lt;? extends Sink&gt; sinkClass =<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        conf.getClass("hbase.canary.sink.class", RegionServerStdOutSink.class, Sink.class);<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>    Sink sink = ReflectionUtils.newInstance(sinkClass);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span><a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    int exitCode = ToolRunner.run(conf, new Canary(executor, sink), args);<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    executor.shutdown();<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    System.exit(exitCode);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>}<a name="line.1244"></a>
+<span class="sourceLineNo">625</span>            }<a name="line.625"></a>
+<span class="sourceLineNo">626</span>          }<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>            monitorThread.interrupt();<a name="line.629"></a>
+<span class="sourceLineNo">630</span>            return monitor.errorCode;<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        } finally {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>          if (monitor != null) monitor.close();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        }<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>        Thread.sleep(interval);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      } while (interval &gt; 0);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    } // try-with-resources close<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    if (choreService != null) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>      choreService.shutdown();<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    return monitor.errorCode;<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>  private void printUsageAndExit() {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    System.err.printf(<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        getClass().getName());<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    System.err.println(" where [opts] are:");<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.err.println("   -help          Show this help and exit.");<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    System.err.println("      which means to enable regionserver mode");<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    System.err.println("      only works in regionserver mode.");<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        " default is true");<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.665"></a>
+<span class="sourceLineNo">666</span>        + " Default is hbase:canary");<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    System.err<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    System.exit(USAGE_EXIT_CODE);<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>   * A Factory method for {@link Monitor}.<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * Can be overridden by user.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @param index a start index for monitor target<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   * @param args args passed from user<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   * @return a Monitor instance<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   */<a name="line.678"></a>
+<span class="sourceLineNo">679</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Monitor monitor = null;<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    String[] monitorTargets = null;<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>    if(index &gt;= 0) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      int length = args.length - index;<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      monitorTargets = new String[length];<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.regionServerMode) {<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      monitor =<a name="line.690"></a>
+<span class="sourceLineNo">691</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.691"></a>
+<span class="sourceLineNo">692</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.692"></a>
+<span class="sourceLineNo">693</span>              this.treatFailureAsError);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    } else {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      monitor =<a name="line.695"></a>
+<span class="sourceLineNo">696</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.696"></a>
+<span class="sourceLineNo">697</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return monitor;<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">702</span>  // a Monitor super-class can be extended by users<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    protected Connection connection;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    protected Admin admin;<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    protected String[] targets;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    protected boolean useRegExp;<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    protected boolean treatFailureAsError;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    protected boolean initialized = false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>    protected boolean done = false;<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    protected int errorCode = 0;<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    protected Sink sink;<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    protected ExecutorService executor;<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>    public boolean isDone() {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      return done;<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>    public boolean hasError() {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      return errorCode != 0;<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">724</span><a name="line.724"></a>
+<span class="sourceLineNo">725</span>    public boolean finalCheckForErrors() {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      if (errorCode != 0) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        return true;<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      return treatFailureAsError &amp;&amp;<a name="line.729"></a>
+<span class="sourceLineNo">730</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>    @Override<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    public void close() throws IOException {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (this.admin != null) this.admin.close();<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.738"></a>
+<span class="sourceLineNo">739</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.740"></a>
+<span class="sourceLineNo">741</span><a name="line.741"></a>
+<span class="sourceLineNo">742</span>      this.connection = connection;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      this.targets = monitorTargets;<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      this.useRegExp = useRegExp;<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      this.sink = sink;<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      this.executor = executor;<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>    @Override<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    public abstract void run();<a name="line.751"></a>
+<span class="sourceLineNo">752</span><a name="line.752"></a>
+<span class="sourceLineNo">753</span>    protected boolean initAdmin() {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>      if (null == this.admin) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        try {<a name="line.755"></a>
+<span class="sourceLineNo">756</span>          this.admin = this.connection.getAdmin();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        } catch (Exception e) {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.758"></a>
+<span class="sourceLineNo">759</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
+<span class="sourceLineNo">761</span>      } else if (admin.isAborted()) {<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        LOG.error("HBaseAdmin aborted");<a name="line.762"></a>
+<span class="sourceLineNo">763</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      return !this.hasError();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
+<span class="sourceLineNo">767</span>  }<a name="line.767"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>  // a monitor for region mode<a name="line.769"></a>
+<span class="sourceLineNo">770</span>  private static class RegionMonitor extends Monitor {<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    // 10 minutes<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    // 1 days<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    private long lastCheckTime = -1;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    private boolean writeSniffing;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    private TableName writeTableName;<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private int writeDataTTL;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    private float regionsLowerLimit;<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    private float regionsUpperLimit;<a name="line.781"></a>
+<span class="sourceLineNo">782</span>    private int checkPeriod;<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.784"></a>
+<span class="sourceLineNo">785</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.785"></a>
+<span class="sourceLineNo">786</span>        boolean treatFailureAsError) {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      Configuration conf = connection.getConfiguration();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      this.writeSniffing = writeSniffing;<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      this.writeTableName = writeTableName;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      this.writeDataTTL =<a name="line.791"></a>
+<span class="sourceLineNo">792</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.792"></a>
+<span class="sourceLineNo">793</span>      this.regionsLowerLimit =<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      this.regionsUpperLimit =<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.796"></a>
+<span class="sourceLineNo">797</span>      this.checkPeriod =<a name="line.797"></a>
+<span class="sourceLineNo">798</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.798"></a>
+<span class="sourceLineNo">799</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    @Override<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    public void run() {<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      if (this.initAdmin()) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>        try {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>            this.initialized = true;<a name="line.809"></a>
+<span class="sourceLineNo">810</span>            for (String table : tables) {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.811"></a>
+<span class="sourceLineNo">812</span>            }<a name="line.812"></a>
+<span class="sourceLineNo">813</span>          } else {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.814"></a>
+<span class="sourceLineNo">815</span>          }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>          if (writeSniffing) {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>              try {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>                checkWriteTableDistribution();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>              } catch (IOException e) {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>              }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.824"></a>
+<span class="sourceLineNo">825</span>            }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>            // sniff canary table with write operation<a name="line.826"></a>
+<span class="sourceLineNo">827</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.827"></a>
+<span class="sourceLineNo">828</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.828"></a>
+<span class="sourceLineNo">829</span>          }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>            try {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>              future.get();<a name="line.833"></a>
+<span class="sourceLineNo">834</span>            } catch (ExecutionException e) {<a name="line.834"></a>
+<span class="sourceLineNo">835</span>              LOG.error("Sniff region failed!", e);<a name="line.835"></a>
+<span class="sourceLineNo">836</span>            }<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        } catch (Exception e) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>          LOG.error("Run regionMonitor failed", e);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          this.errorCode = ERROR_EXIT_CODE;<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>      this.done = true;<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>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>      String[] returnTables = null;<a name="line.847"></a>
+<span class="sourceLineNo">848</span><a name="line.848"></a>
+<span class="sourceLineNo">849</span>      if (this.useRegExp) {<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        Pattern pattern = null;<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        HTableDescriptor[] tds = null;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        try {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          if (LOG.isDebugEnabled()) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>            LOG.debug(String.format("reading list of tables"));<a name="line.855"></a>
+<span class="sourceLineNo">856</span>          }<a name="line.856"></a>
+<span class="sourceLineNo">857</span>          tds = this.admin.listTables(pattern);<a name="line.857"></a>
+<span class="sourceLineNo">858</span>          if (tds == null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            tds = new HTableDescriptor[0];<a name="line.859"></a>
+<span class="sourceLineNo">860</span>          }<a name="line.860"></a>
+<span class="sourceLineNo">861</span>          for (String monitorTarget : monitorTargets) {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>            pattern = Pattern.compile(monitorTarget);<a name="line.862"></a>
+<span class="sourceLineNo">863</span>            for (HTableDescriptor td : tds) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>                tmpTables.add(td.getNameAsString());<a name="line.865"></a>
+<span class="sourceLineNo">866</span>              }<a name="line.866"></a>
+<span class="sourceLineNo">867</span>            }<a name="line.867"></a>
+<span class="sourceLineNo">868</span>          }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        } catch (IOException e) {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>          LOG.error("Communicate with admin failed", e);<a name="line.870"></a>
+<span class="sourceLineNo">871</span>          throw e;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>        if (tmpTables.size() &gt; 0) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>        } else {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          LOG.error(msg);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          throw new TableNotFoundException(msg);<a name="line.880"></a>
+<span class="sourceLineNo">881</span>        }<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      } else {<a name="

<TRUNCATED>

[35/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html
index ccccc8d..d2f53d2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html
@@ -89,16 +89,16 @@
 <span class="sourceLineNo">081</span>      return UNKNOWN_RACK;<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">084</span><a name="line.84"></a>
 <span class="sourceLineNo">085</span>  /**<a name="line.85"></a>
 <span class="sourceLineNo">086</span>   * The constructor that uses the basic MetricsBalancer<a name="line.86"></a>
 <span class="sourceLineNo">087</span>   */<a name="line.87"></a>
 <span class="sourceLineNo">088</span>  protected BaseLoadBalancer() {<a name="line.88"></a>
 <span class="sourceLineNo">089</span>    metricsBalancer = new MetricsBalancer();<a name="line.89"></a>
 <span class="sourceLineNo">090</span>  }<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  <a name="line.91"></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>   * This Constructor accepts an instance of MetricsBalancer, <a name="line.93"></a>
+<span class="sourceLineNo">093</span>   * This Constructor accepts an instance of MetricsBalancer,<a name="line.93"></a>
 <span class="sourceLineNo">094</span>   * which will be used instead of creating a new one<a name="line.94"></a>
 <span class="sourceLineNo">095</span>   */<a name="line.95"></a>
 <span class="sourceLineNo">096</span>  protected BaseLoadBalancer(MetricsBalancer metricsBalancer) {<a name="line.96"></a>
@@ -1287,284 +1287,251 @@
 <span class="sourceLineNo">1279</span>  }<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>   * Generates an immediate assignment plan to be used by a new master for<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   * regions in transition that do not have an already known destination.<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>   *<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>   * Takes a list of regions that need immediate assignment and a list of all<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>   * available servers. Returns a map of regions to the server they should be<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * assigned to.<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   *<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   * This method will return quickly and does not do any intelligent balancing.<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>   * The goal is to make a fast decision not the best decision possible.<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>   *<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>   * Currently this is random.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>   *<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>   * @param regions<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>   * @param servers<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>   * @return map of regions to the server it should be assigned to<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>  public Map&lt;HRegionInfo, ServerName&gt; immediateAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      List&lt;ServerName&gt; servers) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    metricsBalancer.incrMiscInvocations();<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    if (servers == null || servers.isEmpty()) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      LOG.warn("Wanted to do random assignment but no servers to assign to");<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      return null;<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>    Map&lt;HRegionInfo, ServerName&gt; assignments = new TreeMap&lt;HRegionInfo, ServerName&gt;();<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    for (HRegionInfo region : regions) {<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>      assignments.put(region, randomAssignment(region, servers));<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    }<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    return assignments;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>  }<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span><a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>  /**<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>   * Used to assign a single region to a random server.<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>   */<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>  @Override<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>  public ServerName randomAssignment(HRegionInfo regionInfo, List&lt;ServerName&gt; servers) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    metricsBalancer.incrMiscInvocations();<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>        return masterServerName;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      }<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      // Guarantee not to put other regions on master<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      servers.remove(masterServerName);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    }<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span><a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>    if (numServers == 0) {<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      return null;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>    }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      return servers.get(0);<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>    List&lt;HRegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    return randomAssignment(cluster, regionInfo, servers);<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>  }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span><a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  /**<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>   * available/online servers available for assignment.<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>   * &lt;p&gt;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   * completely balanced.<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>   * &lt;p&gt;<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * assigned randomly to available servers.<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   *<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * @param regions regions and existing assignment from meta<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * @param servers available servers<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * @return map of servers and regions to be assigned to them<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   */<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>  @Override<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; retainAssignment(Map&lt;HRegionInfo, ServerName&gt; regions,<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      List&lt;ServerName&gt; servers) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    // Update metrics<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    metricsBalancer.incrMiscInvocations();<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      = assignMasterRegions(regions.keySet(), servers);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      // Guarantee not to put other regions on master<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      servers.remove(masterServerName);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      if (!masterRegions.isEmpty()) {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>        regions = new HashMap&lt;HRegionInfo, ServerName&gt;(regions);<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        for (HRegionInfo region: masterRegions) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>          regions.remove(region);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    if (regions == null || regions.isEmpty()) {<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      return assignments;<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
+<span class="sourceLineNo">1282</span>   * Used to assign a single region to a random server.<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>   */<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>  @Override<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>  public ServerName randomAssignment(HRegionInfo regionInfo, List&lt;ServerName&gt; servers) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>    metricsBalancer.incrMiscInvocations();<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        return masterServerName;<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      // Guarantee not to put other regions on master<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      servers.remove(masterServerName);<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span><a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>    if (numServers == 0) {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      return null;<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      return servers.get(0);<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>    List&lt;HRegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    return randomAssignment(cluster, regionInfo, servers);<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>  }<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span><a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  /**<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>   * available/online servers available for assignment.<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>   * &lt;p&gt;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>   * completely balanced.<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>   * &lt;p&gt;<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>   * assigned randomly to available servers.<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>   *<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>   * @param regions regions and existing assignment from meta<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>   * @param servers available servers<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>   * @return map of servers and regions to be assigned to them<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   */<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>  @Override<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; retainAssignment(Map&lt;HRegionInfo, ServerName&gt; regions,<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      List&lt;ServerName&gt; servers) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>    // Update metrics<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    metricsBalancer.incrMiscInvocations();<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      = assignMasterRegions(regions.keySet(), servers);<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      // Guarantee not to put other regions on master<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      servers.remove(masterServerName);<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      if (!masterRegions.isEmpty()) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        regions = new HashMap&lt;HRegionInfo, ServerName&gt;(regions);<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        for (HRegionInfo region: masterRegions) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          regions.remove(region);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    if (regions == null || regions.isEmpty()) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>      return assignments;<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    }<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    if (numServers == 0) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>      return null;<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      ServerName server = servers.get(0);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions.keySet()));<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>      return assignments;<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    }<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span><a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    // Group all of the old assignments by their hostname.<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    // We can't group directly by ServerName since the servers all have<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    // new start-codes.<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>    // servers on the same host on different ports.<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    for (ServerName server : servers) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>      serversByHostname.put(server.getHostname(), server);<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>    // Collection of the hostnames that used to have regions<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    // assigned, but for which we no longer have any RS running<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>    // after the cluster restart.<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span><a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    int numRandomAssignments = 0;<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    int numRetainedAssigments = 0;<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span><a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1381"></a>
 <span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    if (numServers == 0) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      return null;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    }<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      ServerName server = servers.get(0);<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions.keySet()));<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return assignments;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span><a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    // Group all of the old assignments by their hostname.<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    // We can't group directly by ServerName since the servers all have<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>    // new start-codes.<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span><a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    // servers on the same host on different ports.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    for (ServerName server : servers) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      serversByHostname.put(server.getHostname(), server);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    // Collection of the hostnames that used to have regions<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    // assigned, but for which we no longer have any RS running<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    // after the cluster restart.<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    int numRandomAssignments = 0;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    int numRetainedAssigments = 0;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span><a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    for (Map.Entry&lt;HRegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      HRegionInfo region = entry.getKey();<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>      ServerName oldServerName = entry.getValue();<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;ServerName&gt;();<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      if (oldServerName != null) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        localServers = serversByHostname.get(oldServerName.getHostname());<a name="line.1421"></a>
+<span class="sourceLineNo">1383</span>    for (Map.Entry&lt;HRegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      HRegionInfo region = entry.getKey();<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      ServerName oldServerName = entry.getValue();<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;ServerName&gt;();<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      if (oldServerName != null) {<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        localServers = serversByHostname.get(oldServerName.getHostname());<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      }<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      if (localServers.isEmpty()) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>        // No servers on the new cluster match up with this hostname,<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>        // assign randomly.<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>        ServerName randomServer = randomAssignment(cluster, region, servers);<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>        assignments.get(randomServer).add(region);<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        numRandomAssignments++;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        if (oldServerName != null) oldHostsNoLongerPresent.add(oldServerName.getHostname());<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      } else if (localServers.size() == 1) {<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>        // the usual case - one new server on same host<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>        ServerName target = localServers.get(0);<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>        assignments.get(target).add(region);<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>        cluster.doAssignRegion(region, target);<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>        numRetainedAssigments++;<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      } else {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>        // multiple new servers in the cluster on this same host<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        if (localServers.contains(oldServerName)) {<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>          assignments.get(oldServerName).add(region);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>          cluster.doAssignRegion(region, oldServerName);<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        } else {<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>          ServerName target = null;<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>          for (ServerName tmp: localServers) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>              target = tmp;<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>              break;<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>            }<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>          }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>          if (target == null) {<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>            target = randomAssignment(cluster, region, localServers);<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>          }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>          assignments.get(target).add(region);<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>        }<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>        numRetainedAssigments++;<a name="line.1421"></a>
 <span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      if (localServers.isEmpty()) {<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        // No servers on the new cluster match up with this hostname,<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>        // assign randomly.<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>        ServerName randomServer = randomAssignment(cluster, region, servers);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        assignments.get(randomServer).add(region);<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>        numRandomAssignments++;<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>        if (oldServerName != null) oldHostsNoLongerPresent.add(oldServerName.getHostname());<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      } else if (localServers.size() == 1) {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        // the usual case - one new server on same host<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>        ServerName target = localServers.get(0);<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        assignments.get(target).add(region);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>        cluster.doAssignRegion(region, target);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>        numRetainedAssigments++;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      } else {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        // multiple new servers in the cluster on this same host<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        if (localServers.contains(oldServerName)) {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>          assignments.get(oldServerName).add(region);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>          cluster.doAssignRegion(region, oldServerName);<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        } else {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>          ServerName target = null;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>          for (ServerName tmp: localServers) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>              target = tmp;<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>              break;<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>            }<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          }<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          if (target == null) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            target = randomAssignment(cluster, region, localServers);<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>          }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>          assignments.get(target).add(region);<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>        }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>        numRetainedAssigments++;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    }<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span><a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    String randomAssignMsg = "";<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>    if (numRandomAssignments &gt; 0) {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      randomAssignMsg =<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>          numRandomAssignments + " regions were assigned "<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<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>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    return assignments;<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  }<a name="line.1470"></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>    String randomAssignMsg = "";<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>    if (numRandomAssignments &gt; 0) {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      randomAssignMsg =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>          numRandomAssignments + " regions were assigned "<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    }<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    return assignments;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>  }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span><a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>  @Override<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>  public void initialize() throws HBaseIOException{<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>  }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span><a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>  @Override<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>  public void regionOnline(HRegionInfo regionInfo, ServerName sn) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>  }<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span><a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>  @Override<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>  public void regionOffline(HRegionInfo regionInfo) {<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>  @Override<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>  public boolean isStopped() {<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    return stopped;<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>  }<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span><a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>  @Override<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>  public void stop(String why) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    stopped = true;<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>  }<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span><a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>  /**<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>   * Used to assign a single region to a random server.<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>   */<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>  private ServerName randomAssignment(Cluster cluster, HRegionInfo regionInfo,<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>      List&lt;ServerName&gt; servers) {<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    ServerName sn = null;<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    final int maxIterations = numServers * 4;<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    int iterations = 0;<a name="line.1470"></a>
 <span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  @Override<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  public void initialize() throws HBaseIOException{<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>  }<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span><a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>  @Override<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>  public void regionOnline(HRegionInfo regionInfo, ServerName sn) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>  }<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>  @Override<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>  public void regionOffline(HRegionInfo regionInfo) {<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>  public boolean isStopped() {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>    return stopped;<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>  @Override<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  public void stop(String why) {<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>    stopped = true;<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>  }<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span><a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>  /**<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>   * Used to assign a single region to a random server.<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>   */<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>  private ServerName randomAssignment(Cluster cluster, HRegionInfo regionInfo,<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>      List&lt;ServerName&gt; servers) {<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>    ServerName sn = null;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>    final int maxIterations = numServers * 4;<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    int iterations = 0;<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    do {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>      int i = RANDOM.nextInt(numServers);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      sn = servers.get(i);<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    return sn;<a name="line.1511"></a>
+<span class="sourceLineNo">1472</span>    do {<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      int i = RANDOM.nextInt(numServers);<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      sn = servers.get(i);<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>    return sn;<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>  /**<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>   * Round robin a list of regions to a list of servers<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>   */<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>  private void roundRobinAssignment(Cluster cluster, List&lt;HRegionInfo&gt; regions,<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      List&lt;HRegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments) {<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>    int numServers = servers.size();<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    int numRegions = regions.size();<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>    int serverIdx = 0;<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    if (numServers &gt; 1) {<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    }<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    int regionIdx = 0;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      List&lt;HRegionInfo&gt; serverRegions = new ArrayList&lt;HRegionInfo&gt;(max);<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>        HRegionInfo region = regions.get(i % numRegions);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>          unassignedRegions.add(region);<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>        } else {<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>          serverRegions.add(region);<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>          cluster.doAssignRegion(region, server);<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>      assignments.put(server, serverRegions);<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      regionIdx++;<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    }<a name="line.1511"></a>
 <span class="sourceLineNo">1512</span>  }<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>
-<span class="sourceLineNo">1515</span>   * Round robin a list of regions to a list of servers<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>   */<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>  private void roundRobinAssignment(Cluster cluster, List&lt;HRegionInfo&gt; regions,<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>      List&lt;HRegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments) {<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span><a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    int numServers = servers.size();<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    int numRegions = regions.size();<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    int serverIdx = 0;<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    if (numServers &gt; 1) {<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    }<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>    int regionIdx = 0;<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span><a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>      List&lt;HRegionInfo&gt; serverRegions = new ArrayList&lt;HRegionInfo&gt;(max);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>        HRegionInfo region = regions.get(i % numRegions);<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>          unassignedRegions.add(region);<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>        } else {<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>          serverRegions.add(region);<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>          cluster.doAssignRegion(region, server);<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>        }<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      }<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      assignments.put(server, serverRegions);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>      regionIdx++;<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    }<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>  }<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span><a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>    Collection&lt;HRegionInfo&gt; regions) {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    } else {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      return new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    }<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>  }<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span><a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>  @Override<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>  }<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>}<a name="line.1559"></a>
+<span class="sourceLineNo">1514</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>    Collection&lt;HRegionInfo&gt; regions) {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    } else {<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>      return new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    }<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>  }<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span><a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>  @Override<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>  }<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>}<a name="line.1526"></a>
 
 
 


[48/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/class-use/HRegionInfo.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/class-use/HRegionInfo.html b/devapidocs/org/apache/hadoop/hbase/class-use/HRegionInfo.html
index 217c616..892f8b8 100644
--- a/devapidocs/org/apache/hadoop/hbase/class-use/HRegionInfo.html
+++ b/devapidocs/org/apache/hadoop/hbase/class-use/HRegionInfo.html
@@ -1974,13 +1974,6 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
-<td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)">immediateAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
-                                      <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
-<div class="block">Sync assign a region</div>
-</td>
-</tr>
-<tr class="altColor">
 <td class="colFirst"><code>static <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;</code></td>
 <td class="colLast"><span class="strong">AssignmentManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html#replicaRegionsNotRecordedInMeta(java.util.Set,%20org.apache.hadoop.hbase.master.MasterServices)">replicaRegionsNotRecordedInMeta</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regionsRecordedInMeta,
                                                               <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master)</code>
@@ -1988,21 +1981,21 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
  not recorded in meta yet.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Assign regions to the previously hosting region server</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#roundRobinAssignment(java.util.List,%20java.util.List)">roundRobinAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                         <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Perform a Round Robin assignment of regions.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;</code></td>
 <td class="colLast"><span class="strong">RegionStates.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/RegionStates.html#serverOffline(org.apache.hadoop.hbase.ServerName)">serverOffline</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</code>
 <div class="block">A server is offline, all regions on it are dead.</div>
@@ -2740,36 +2733,29 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <td class="colLast"><span class="strong">AssignmentManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html#getSnapShotOfAssignment(java.util.Collection)">getSnapShotOfAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;infos)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
-<td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)">immediateAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
-                                      <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
-<div class="block">Sync assign a region</div>
-</td>
-</tr>
-<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="strong">SplitLogManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.html#markRegionsRecovering(org.apache.hadoop.hbase.ServerName,%20java.util.Set)">markRegionsRecovering</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;server,
                                           <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;userRegions)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="strong">AssignmentManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html#prepareDaughterReplicaForAssignment(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.HRegionInfo,%20int,%20java.util.Map)">prepareDaughterReplicaForAssignment</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;daughterHri,
                                                                       <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;parentHri,
                                                                       int&nbsp;replicaId,
                                                                       <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;map)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="strong">MasterFileSystem.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/MasterFileSystem.html#prepareLogReplay(org.apache.hadoop.hbase.ServerName,%20java.util.Set)">prepareLogReplay</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                 <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions)</code>
 <div class="block">Mark regions in recovering state when distributedLogReplay are set true</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><span class="strong">AssignmentManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html#processFavoredNodes(java.util.List)">processFavoredNodes</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;</code></td>
 <td class="colLast"><span class="strong">AssignmentManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html#replicaRegionsNotRecordedInMeta(java.util.Set,%20org.apache.hadoop.hbase.master.MasterServices)">replicaRegionsNotRecordedInMeta</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regionsRecordedInMeta,
                                                               <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master)</code>
@@ -2777,46 +2763,46 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
  not recorded in meta yet.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Assign regions to the previously hosting region server</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">LoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#roundRobinAssignment(java.util.List,%20java.util.List)">roundRobinAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                         <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
 <div class="block">Perform a Round Robin assignment of regions.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/regionserver/RegionOpeningState.html" title="enum in org.apache.hadoop.hbase.regionserver">RegionOpeningState</a>&gt;</code></td>
 <td class="colLast"><span class="strong">ServerManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html#sendRegionOpen(org.apache.hadoop.hbase.ServerName,%20java.util.List)">sendRegionOpen</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;server,
                             <a href="http://docs.oracle.com/javase/7/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/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&gt;&gt;&nbsp;regionOpenInfos)</code>
 <div class="block">Sends an OPEN RPC to the specified server to open the specified region.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><span class="strong">RegionStates.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/RegionStates.html#setLastRegionServerOfRegions(org.apache.hadoop.hbase.ServerName,%20java.util.List)">setLastRegionServerOfRegions</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                                         <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regionInfos)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="strong">AssignmentManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html#setRegionsToReopen(java.util.List)">setRegionsToReopen</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions)</code>
 <div class="block">Set the list of regions that will be reopened
  because of an update in table schema</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="strong">BulkReOpen.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/BulkReOpen.html#unassign(java.util.List)">unassign</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions)</code>
 <div class="block">Unassign the list of regions.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><span class="strong">AssignmentManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html#waitForAssignment(java.util.Collection,%20boolean,%20int,%20long)">waitForAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regionSet,
                                   boolean&nbsp;waitTillAllAssigned,
@@ -2825,7 +2811,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Waits until the specified region has completed assignment, or the deadline is reached.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected boolean</code></td>
 <td class="colLast"><span class="strong">AssignmentManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html#waitForAssignment(java.util.Collection,%20boolean,%20long)">waitForAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regionSet,
                                   boolean&nbsp;waitTillAllAssigned,
@@ -3003,29 +2989,21 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <td class="colLast"><span class="strong">ClusterLoadState.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/ClusterLoadState.html#getServersByLoad()">getServersByLoad</a></strong>()</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
-<td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)">immediateAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
-                                      <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
-<div class="block">Generates an immediate assignment plan to be used by a new master for
- regions in transition that do not have an already known destination.</div>
-</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>private <a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#mapRSToPrimaries(java.util.Map)">mapRSToPrimaries</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;primaryRSMap)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#placeSecondaryAndTertiaryRS(java.util.Map)">placeSecondaryAndTertiaryRS</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;primaryRSMap)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#placeSecondaryAndTertiaryWithRestrictions(java.util.Map)">placeSecondaryAndTertiaryWithRestrictions</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;primaryRSMap)</code>
 <div class="block">For regions that share the primary, avoid placing the secondary and tertiary
  on a same RS.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
@@ -3034,7 +3012,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
  available/online servers available for assignment.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment(java.util.List,%20java.util.List)">roundRobinAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                         <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
@@ -3042,17 +3020,17 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
  simple round-robin assignment.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html#roundRobinAssignment(java.util.List,%20java.util.List)">roundRobinAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                         <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;,<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html#segregateRegionsAndAssignRegionsWithFavoredNodes(java.util.List,%20java.util.List)">segregateRegionsAndAssignRegionsWithFavoredNodes</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                                                                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;availableServers)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;,<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html#segregateRegionsAndAssignRegionsWithFavoredNodes(java.util.List,%20java.util.List)">segregateRegionsAndAssignRegionsWithFavoredNodes</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                                                                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;availableServers)</code>&nbsp;</td>
@@ -3298,18 +3276,10 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getRegionAssignmentsByServer(java.util.Collection)">getRegionAssignmentsByServer</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;</code></td>
-<td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)">immediateAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
-                                      <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
-<div class="block">Generates an immediate assignment plan to be used by a new master for
- regions in transition that do not have an already known destination.</div>
-</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>private <a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#mapRSToPrimaries(java.util.Map)">mapRSToPrimaries</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;primaryRSMap)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#multiRackCaseWithRestrictions(java.util.Map,%20java.util.Map,%20java.lang.String,%20org.apache.hadoop.hbase.ServerName,%20org.apache.hadoop.hbase.HRegionInfo)">multiRackCaseWithRestrictions</a></strong>(<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;serverToPrimaries,
                                                           <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]&gt;&nbsp;secondaryAndTertiaryMap,
@@ -3317,7 +3287,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
                                                           <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;primaryRS,
                                                           <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#multiRackCaseWithRestrictions(java.util.Map,%20java.util.Map,%20java.lang.String,%20org.apache.hadoop.hbase.ServerName,%20org.apache.hadoop.hbase.HRegionInfo)">multiRackCaseWithRestrictions</a></strong>(<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;serverToPrimaries,
                                                           <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]&gt;&nbsp;secondaryAndTertiaryMap,
@@ -3325,36 +3295,36 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
                                                           <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;primaryRS,
                                                           <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;regionInfo)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#placePrimaryRSAsRoundRobin(java.util.Map,%20java.util.Map,%20java.util.List)">placePrimaryRSAsRoundRobin</a></strong>(<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;assignmentMap,
                                                     <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;primaryRSMap,
                                                     <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#placePrimaryRSAsRoundRobin(java.util.Map,%20java.util.Map,%20java.util.List)">placePrimaryRSAsRoundRobin</a></strong>(<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;assignmentMap,
                                                     <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;primaryRSMap,
                                                     <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#placePrimaryRSAsRoundRobin(java.util.Map,%20java.util.Map,%20java.util.List)">placePrimaryRSAsRoundRobin</a></strong>(<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;assignmentMap,
                                                     <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;primaryRSMap,
                                                     <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#placeSecondaryAndTertiaryRS(java.util.Map)">placeSecondaryAndTertiaryRS</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;primaryRSMap)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>[]&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#placeSecondaryAndTertiaryWithRestrictions(java.util.Map)">placeSecondaryAndTertiaryWithRestrictions</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;primaryRSMap)</code>
 <div class="block">For regions that share the primary, avoid placing the secondary and tertiary
  on a same RS.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;regions,
                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
@@ -3363,7 +3333,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
  available/online servers available for assignment.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster,%20java.util.List,%20java.util.List,%20java.util.List,%20java.util.Map)">roundRobinAssignment</a></strong>(<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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
@@ -3373,7 +3343,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Round robin a list of regions to a list of servers</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster,%20java.util.List,%20java.util.List,%20java.util.List,%20java.util.Map)">roundRobinAssignment</a></strong>(<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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
@@ -3383,7 +3353,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Round robin a list of regions to a list of servers</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster,%20java.util.List,%20java.util.List,%20java.util.List,%20java.util.Map)">roundRobinAssignment</a></strong>(<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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
@@ -3393,7 +3363,7 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <div class="block">Round robin a list of regions to a list of servers</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">BaseLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment(java.util.List,%20java.util.List)">roundRobinAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                         <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>
@@ -3401,38 +3371,38 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
  simple round-robin assignment.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html#roundRobinAssignment(java.util.List,%20java.util.List)">roundRobinAssignment</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                         <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="strong">FavoredNodeLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html#roundRobinAssignmentImpl(org.apache.hadoop.hbase.master.balancer.FavoredNodeAssignmentHelper,%20java.util.Map,%20java.util.List,%20java.util.List)">roundRobinAssignmentImpl</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html" title="class in org.apache.hadoop.hbase.master.balancer">FavoredNodeAssignmentHelper</a>&nbsp;assignmentHelper,
                                                 <a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;assignmentMap,
                                                 <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="strong">FavoredNodeLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html#roundRobinAssignmentImpl(org.apache.hadoop.hbase.master.balancer.FavoredNodeAssignmentHelper,%20java.util.Map,%20java.util.List,%20java.util.List)">roundRobinAssignmentImpl</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html" title="class in org.apache.hadoop.hbase.master.balancer">FavoredNodeAssignmentHelper</a>&nbsp;assignmentHelper,
                                                 <a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;assignmentMap,
                                                 <a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;servers)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;,<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;</code></td>
 <td class="colLast"><span class="strong">FavoredNodeLoadBalancer.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeLoadBalancer.html#segregateRegionsAndAssignRegionsWithFavoredNodes(java.util.List,%20java.util.List)">segregateRegionsAndAssignRegionsWithFavoredNodes</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&nbsp;regions,
                                                                                                 <a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;availableServers)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#updateMetaWithFavoredNodesInfo(java.util.Map,%20org.apache.hadoop.conf.Configuration)">updateMetaWithFavoredNodesInfo</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&gt;&nbsp;regionToFavoredNodes,
                                                             org.apache.hadoop.conf.Configuration&nbsp;conf)</code>
 <div class="block">Update meta table with favored nodes info</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><span class="strong">FavoredNodeAssignmentHelper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#updateMetaWithFavoredNodesInfo(java.util.Map,%20org.apache.hadoop.hbase.client.Connection)">updateMetaWithFavoredNodesInfo</a></strong>(<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>,<a href="http://docs.oracle.com/javase/7/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/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&gt;&nbsp;regionToFavoredNodes,
                                                             <a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection)</code>


[16/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
index fbdde18..1d64963 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
@@ -2959,7 +2959,7 @@
 <span class="sourceLineNo">2951</span>    Set&lt;byte[]&gt; deletesCfSet = null;<a name="line.2951"></a>
 <span class="sourceLineNo">2952</span>    long currentNonceGroup = HConstants.NO_NONCE;<a name="line.2952"></a>
 <span class="sourceLineNo">2953</span>    long currentNonce = HConstants.NO_NONCE;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    WALEdit walEdit = new WALEdit(replay);<a name="line.2954"></a>
+<span class="sourceLineNo">2954</span>    WALEdit walEdit = null;<a name="line.2954"></a>
 <span class="sourceLineNo">2955</span>    boolean locked = false;<a name="line.2955"></a>
 <span class="sourceLineNo">2956</span>    // reference family maps directly so coprocessors can mutate them if desired<a name="line.2956"></a>
 <span class="sourceLineNo">2957</span>    Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps = new Map[batchOp.operations.length];<a name="line.2957"></a>
@@ -2970,4878 +2970,4890 @@
 <span class="sourceLineNo">2962</span>    int noOfPuts = 0;<a name="line.2962"></a>
 <span class="sourceLineNo">2963</span>    int noOfDeletes = 0;<a name="line.2963"></a>
 <span class="sourceLineNo">2964</span>    WriteEntry writeEntry = null;<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    try {<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>      int numReadyToWrite = 0;<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>          lastIndexExclusive++;<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>          continue;<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>        }<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>        RowLock rowLock = null;<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>        try {<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>        } catch (IOException ioe) {<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span>        }<a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>        if (rowLock == null) {<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>          // We failed to grab another lock<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>          break; // Stop acquiring more rows for this batch<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>        } else {<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>          acquiredRowLocks.add(rowLock);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span>        }<a name="line.2989"></a>
-<span class="sourceLineNo">2990</span><a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>        lastIndexExclusive++;<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>        numReadyToWrite++;<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span><a name="line.2993"></a>
-<span class="sourceLineNo">2994</span>        if (mutation instanceof Put) {<a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>          // If Column Families stay consistent through out all of the<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>          // individual puts then metrics can be reported as a multiput across<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>          // column families in the first put.<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>          if (putsCfSet == null) {<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>          } else {<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span>          }<a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>        } else {<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>          if (deletesCfSet == null) {<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>          } else {<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>          }<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span>        }<a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>      }<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span><a name="line.3013"></a>
-<span class="sourceLineNo">3014</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3014"></a>
-<span class="sourceLineNo">3015</span><a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3020"></a>
-<span class="sourceLineNo">3021</span><a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>        return 0L;<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>      }<a name="line.3025"></a>
+<span class="sourceLineNo">2965</span>    int cellCount = 0;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    try {<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>      int numReadyToWrite = 0;<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>          lastIndexExclusive++;<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span>          continue;<a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>        }<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>        RowLock rowLock = null;<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span>        try {<a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>        } catch (IOException ioe) {<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>        }<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>        if (rowLock == null) {<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>          // We failed to grab another lock<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span>          break; // Stop acquiring more rows for this batch<a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>        } else {<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>          acquiredRowLocks.add(rowLock);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>        }<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span><a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>        lastIndexExclusive++;<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span>        numReadyToWrite++;<a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>        if (replay) {<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>          for (List&lt;Cell&gt; cells : mutation.getFamilyCellMap().values()) {<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>            cellCount += cells.size();<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>          }<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>        }<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span>        if (mutation instanceof Put) {<a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>          // If Column Families stay consistent through out all of the<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>          // individual puts then metrics can be reported as a multiput across<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>          // column families in the first put.<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>          if (putsCfSet == null) {<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>          } else {<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>          }<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>        } else {<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>          if (deletesCfSet == null) {<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>          } else {<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>          }<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>        }<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>      }<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span><a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span><a name="line.3020"></a>
+<span class="sourceLineNo">3021</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3025"></a>
 <span class="sourceLineNo">3026</span><a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span>        // skip invalid<a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>          // lastIndexExclusive was incremented above.<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span>          continue;<a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>        }<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span><a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>        if (mutation instanceof Put) {<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>          noOfPuts++;<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>        } else {<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>          noOfDeletes++;<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>        }<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span>      }<a name="line.3044"></a>
-<span class="sourceLineNo">3045</span><a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>      locked = true;<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span><a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>      // calling the pre CP hook for batch mutation<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>          return 0L;<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>        }<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>      }<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span><a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>      // STEP 3. Build WAL edit<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>          continue;<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>        }<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>        Mutation m = batchOp.getMutation(i);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>          durability = tmpDur;<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>        }<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>          continue;<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span>        }<a name="line.3075"></a>
-<span class="sourceLineNo">3076</span><a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>        long nonce = batchOp.getNonce(i);<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>          // Write what we have so far for nonces out to WAL<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>          walEdit = new WALEdit(replay);<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span>          currentNonceGroup = nonceGroup;<a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>          currentNonce = nonce;<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>        }<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span><a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>        // Add WAL edits by CP<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>        if (fromCP != null) {<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span>            walEdit.add(cell);<a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>          }<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>        }<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span>      }<a name="line.3098"></a>
-<span class="sourceLineNo">3099</span><a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>      WALKey walKey = null;<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>      if (replay) {<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>        // use wal key from the original<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3107"></a>
-<span class="sourceLineNo">3108</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>      }<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>      if (!walEdit.isEmpty()) {<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>        if (!replay) {<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>        }<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>        try {<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span>          long txid =<a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>          if (txid != 0) sync(txid, durability);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span>          writeEntry = walKey.getWriteEntry();<a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>        } catch (IOException ioe) {<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>          throw ioe;<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>        }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>      }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span>      if (walKey == null) {<a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>        writeEntry = mvcc.begin();<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>      }<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span><a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>      // STEP 5. Write back to memstore<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>      long addedSize = 0;<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>          continue;<a name="line.3139"></a>
+<span class="sourceLineNo">3027</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>        return 0L;<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span>      }<a name="line.3030"></a>
+<span class="sourceLineNo">3031</span><a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>        // skip invalid<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>          // lastIndexExclusive was incremented above.<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>          continue;<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span>        }<a name="line.3038"></a>
+<span class="sourceLineNo">3039</span><a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>        if (mutation instanceof Put) {<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>          noOfPuts++;<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>        } else {<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>          noOfDeletes++;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>        }<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span>        if (fromCP != null) {<a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>          cellCount += fromCP.size();<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>        }<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>        for (List&lt;Cell&gt; cells : familyMaps[i].values()) {<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span>          cellCount += cells.size();<a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>        }<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>      }<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>      walEdit = new WALEdit(cellCount, replay);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>      locked = true;<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span><a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>      // calling the pre CP hook for batch mutation<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>          return 0L;<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>        }<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>      }<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>      // STEP 3. Build WAL edit<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span>          continue;<a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>        }<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span><a name="line.3078"></a>
+<span class="sourceLineNo">3079</span>        Mutation m = batchOp.getMutation(i);<a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>          durability = tmpDur;<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>        }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>          continue;<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>        }<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span><a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>        long nonce = batchOp.getNonce(i);<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>          // Write what we have so far for nonces out to WAL<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>          walEdit = new WALEdit(cellCount, replay);<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>          currentNonceGroup = nonceGroup;<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>          currentNonce = nonce;<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>        }<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span><a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>        // Add WAL edits by CP<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span>        if (fromCP != null) {<a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>            walEdit.add(cell);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>          }<a name="line.3107"></a>
+<span class="sourceLineNo">3108</span>        }<a name="line.3108"></a>
+<span class="sourceLineNo">3109</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>      }<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span><a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>      WALKey walKey = null;<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>      if (replay) {<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>        // use wal key from the original<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>      }<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>      if (!walEdit.isEmpty()) {<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span>        if (!replay) {<a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>        }<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>        try {<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>          long txid =<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>          if (txid != 0) sync(txid, durability);<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>          writeEntry = walKey.getWriteEntry();<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>        } catch (IOException ioe) {<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>          throw ioe;<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span>        }<a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span>      }<a name="line.3143"></a>
-<span class="sourceLineNo">3144</span><a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>      // STEP 6. Complete mvcc.<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>      if (replay) {<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>        mvcc.completeAndWait(writeEntry);<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>        writeEntry = null;<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span>      }<a name="line.3151"></a>
-<span class="sourceLineNo">3152</span><a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>      // STEP 7. Release row locks, etc.<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>      if (locked) {<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span>        this.updatesLock.readLock().unlock();<a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>        locked = false;<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>      }<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>      // calling the post CP hook for batch mutation<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>      }<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span><a name="line.3167"></a>
-<span class="sourceLineNo">3168</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>        }<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>      }<a name="line.3172"></a>
-<span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>          // only for successful puts<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span>              != OperationStatusCode.SUCCESS) {<a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>            continue;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>          }<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>          Mutation m = batchOp.getMutation(i);<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>          if (m instanceof Put) {<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>          } else {<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>          }<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>        }<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>      }<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span><a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>      success = true;<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span>      return addedSize;<a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    } finally {<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>      if (locked) {<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span>        this.updatesLock.readLock().unlock();<a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>      }<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span><a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>      // See if the column families were consistent through the whole thing.<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>      // null will be treated as unknown.<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span><a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>      if (noOfPuts &gt; 0) {<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>        // There were some Puts in the batch.<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>        if (this.metricsRegion != null) {<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span>          this.metricsRegion.updatePut();<a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>        }<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>      }<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>      if (noOfDeletes &gt; 0) {<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>        // There were some Deletes in the batch.<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>        if (this.metricsRegion != null) {<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span>          this.metricsRegion.updateDelete();<a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>        }<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>      }<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>      if (!success) {<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>          }<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>        }<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>      }<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>        // call the coprocessor hook to do any finalization steps<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>        // after the put is done<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>                lastIndexExclusive);<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>      }<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span><a name="line.3236"></a>
-<span class="sourceLineNo">3237</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    }<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>  }<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>  throws IOException {<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    if (walEdit.isEmpty()) return;<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>  }<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span><a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>  throws IOException {<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    boolean skip = false;<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    // Skip anything that "ran" already<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>      return true;<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span>    }<a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span>    // store the family map reference to allow for mutations<a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    try {<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>      if (mutation instanceof Put) {<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>        // Check the families in the put. If bad, skip this one.<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>        if (batchOp.isInReplay()) {<a name="line.3271"></a>
-<span class="sourceLineNo">3272</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>        } else {<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>          checkFamilies(familyMap.keySet());<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>        }<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>      } else {<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span>        prepareDelete((Delete)mutation);<a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>      }<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>      skip = true;<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>      skip = true;<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    } catch (WrongRegionException we) {<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>      skip = true;<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    }<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    return skip;<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>  }<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>  /**<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>   * During replay, there could exist column families which are removed between region server<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>   * failure and replay<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>   */<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>        if (nonExistentList == null) {<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span>        }<a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>        nonExistentList.add(family);<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>      }<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>    }<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>    if (nonExistentList != null) {<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>      for (byte[] family : nonExistentList) {<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>        // Perhaps schema was changed between crash and replay<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>        familyMap.remove(family);<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>      }<a name="line.3319"></a>
-<span class="sourceLineNo">3320</span>    }<a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>  }<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span><a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>  /**<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span>   * Returns effective durability from the passed durability and<a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>   * the table descriptor.<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span>   */<a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>  }<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span><a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>  @Override<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      boolean writeToWAL)<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>  throws IOException{<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    checkMutationType(mutation, row);<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>      mutation, writeToWAL);<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>  }<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span><a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>  @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3343"></a>
-<span class="sourceLineNo">3344</span>      boolean writeToWAL)<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>  throws IOException {<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, rm, null,<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>      writeToWAL);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>  }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span><a name="line.3349"></a>
-<span class="sourceLineNo">3350</span>  /**<a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>   * checkAndMutate and checkAndRowMutate are 90% the same. Rather than copy/paste, below has<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>   * switches in the few places where there is deviation.<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span>   */<a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>  private boolean doCheckAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rowMutations,<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>      Mutation mutation, boolean writeToWAL)<a name="line.3356"></a>
+<span class="sourceLineNo">3141</span>      }<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>      if (walKey == null) {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>        writeEntry = mvcc.begin();<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>      }<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span><a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>      // STEP 5. Write back to memstore<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>      long addedSize = 0;<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>          continue;<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>        }<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>      }<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span><a name="line.3156"></a>
+<span class="sourceLineNo">3157</span>      // STEP 6. Complete mvcc.<a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>      if (replay) {<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span>        mvcc.completeAndWait(writeEntry);<a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>        writeEntry = null;<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>      }<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span><a name="line.3164"></a>
+<span class="sourceLineNo">3165</span>      // STEP 7. Release row locks, etc.<a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>      if (locked) {<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>        this.updatesLock.readLock().unlock();<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>        locked = false;<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span>      }<a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span><a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>      // calling the post CP hook for batch mutation<a name="line.3172"></a>
+<span class="sourceLineNo">3173</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3173"></a>
+<span class="sourceLineNo">3174</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span>      }<a name="line.3178"></a>
+<span class="sourceLineNo">3179</span><a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span>        }<a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>      }<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span><a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span>          // only for successful puts<a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>              != OperationStatusCode.SUCCESS) {<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>            continue;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>          }<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span>          Mutation m = batchOp.getMutation(i);<a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>          if (m instanceof Put) {<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>          } else {<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>          }<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>        }<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>      }<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>      success = true;<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>      return addedSize;<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    } finally {<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>      if (locked) {<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>        this.updatesLock.readLock().unlock();<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>      }<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span><a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>      // See if the column families were consistent through the whole thing.<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>      // null will be treated as unknown.<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span><a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>      if (noOfPuts &gt; 0) {<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span>        // There were some Puts in the batch.<a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>        if (this.metricsRegion != null) {<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>          this.metricsRegion.updatePut();<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>        }<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>      }<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>      if (noOfDeletes &gt; 0) {<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span>        // There were some Deletes in the batch.<a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>        if (this.metricsRegion != null) {<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>          this.metricsRegion.updateDelete();<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>        }<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>      }<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span>      if (!success) {<a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>          }<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>        }<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>      }<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>        // call the coprocessor hook to do any finalization steps<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span>        // after the put is done<a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>                lastIndexExclusive);<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span>      }<a name="line.3247"></a>
+<span class="sourceLineNo">3248</span><a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span>    }<a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>  }<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span><a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  throws IOException {<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span>    if (walEdit.isEmpty()) return;<a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  }<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span><a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>  throws IOException {<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    boolean skip = false;<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    // Skip anything that "ran" already<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3271"></a>
+<span class="sourceLineNo">3272</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3272"></a>
+<span class="sourceLineNo">3273</span>      return true;<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    }<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span>    // store the family map reference to allow for mutations<a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span><a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    try {<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>      if (mutation instanceof Put) {<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span>        // Check the families in the put. If bad, skip this one.<a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>        if (batchOp.isInReplay()) {<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>        } else {<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>          checkFamilies(familyMap.keySet());<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>        }<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>      } else {<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>        prepareDelete((Delete)mutation);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>      }<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span>      skip = true;<a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>      skip = true;<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    } catch (WrongRegionException we) {<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>      skip = true;<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    }<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span>    return skip;<a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>  }<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span><a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>  /**<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>   * During replay, there could exist column families which are removed between region server<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>   * failure and replay<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3319"></a>
+<span class="sourceLineNo">3320</span>        if (nonExistentList == null) {<a name="line.3320"></a>
+<span class="sourceLineNo">3321</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>        }<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>        nonExistentList.add(family);<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>      }<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>    }<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>    if (nonExistentList != null) {<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>      for (byte[] family : nonExistentList) {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>        // Perhaps schema was changed between crash and replay<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span>        familyMap.remove(family);<a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>      }<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    }<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>  }<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>  /**<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span>   * Returns effective durability from the passed durability and<a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>   * the table descriptor.<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>   */<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>  }<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span><a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>  @Override<a name="line.3343"></a>
+<span class="sourceLineNo">3344</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3344"></a>
+<span class="sourceLineNo">3345</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>      boolean writeToWAL)<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span>  throws IOException{<a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    checkMutationType(mutation, row);<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>      mutation, writeToWAL);<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>  }<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span><a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>  @Override<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      boolean writeToWAL)<a name="line.3356"></a>
 <span class="sourceLineNo">3357</span>  throws IOException {<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // Could do the below checks but seems wacky with two callers only. Just comment out for now.<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // One caller passes a Mutation, the other passes RowMutation. Presume all good so we don't<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // need these commented out checks.<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // if (rowMutations == null &amp;&amp; mutation == null) throw new DoNotRetryIOException("Both null");<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // if (rowMutations != null &amp;&amp; mutation != null) throw new DoNotRetryIOException("Both set");<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    checkReadOnly();<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // TODO, add check for value length also move this check to the client<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span>    checkResources();<a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    startRegionOperation();<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    try {<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>      Get get = new Get(row);<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>      checkFamily(family);<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>      get.addColumn(family, qualifier);<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>      // Lock row - note that doBatchMutate will relock this row if called<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>      RowLock rowLock = getRowLock(get.getRow());<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>      try {<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>        if (mutation != null &amp;&amp; this.getCoprocessorHost() != null) {<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>          // Call coprocessor.<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>          Boolean processed = null;<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>          if (mutation instanceof Put) {<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>            processed = this.getCoprocessorHost().preCheckAndPutAfterRowLock(row, family,<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>                qualifier, compareOp, comparator, (Put)mutation);<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>          } else if (mutation instanceof Delete) {<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>            processed = this.getCoprocessorHost().preCheckAndDeleteAfterRowLock(row, family,<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span>                qualifier, compareOp, comparator, (Delete)mutation);<a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>          }<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>          if (processed != null) {<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>            return processed;<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>          }<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>        }<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>        // NOTE: We used to wait here until mvcc caught up:  mvcc.await();<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        // Supposition is that now all changes are done under row locks, then when we go to read,<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>        // we'll get the latest on this row.<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        List&lt;Cell&gt; result = get(get, false);<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>        boolean valueIsNull = comparator.getValue() == null || comparator.getValue().length == 0;<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        boolean matches = false;<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>        long cellTs = 0;<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        if (result.size() == 0 &amp;&amp; valueIsNull) {<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>          matches = true;<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>        } else if (result.size() &gt; 0 &amp;&amp; result.get(0).getValueLength() == 0 &amp;&amp; valueIsNull) {<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>          matches = true;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>          cellTs = result.get(0).getTimestamp();<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        } else if (result.size() == 1 &amp;&amp; !valueIsNull) {<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>          Cell kv = result.get(0);<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>          cellTs = kv.getTimestamp();<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>          int compareResult = CellComparator.compareValue(kv, comparator);<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span>          matches = matches(compareOp, compareResult);<a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>        }<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>        // If matches put the new put or delete the new delete<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>        if (matches) {<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>          // We have acquired the row lock already. If the system clock is NOT monotonically<a name="line.3408"></a>
-<span

<TRUNCATED>

[31/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html
index ccccc8d..d2f53d2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.SwapRegionsAction.html
@@ -89,16 +89,16 @@
 <span class="sourceLineNo">081</span>      return UNKNOWN_RACK;<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">084</span><a name="line.84"></a>
 <span class="sourceLineNo">085</span>  /**<a name="line.85"></a>
 <span class="sourceLineNo">086</span>   * The constructor that uses the basic MetricsBalancer<a name="line.86"></a>
 <span class="sourceLineNo">087</span>   */<a name="line.87"></a>
 <span class="sourceLineNo">088</span>  protected BaseLoadBalancer() {<a name="line.88"></a>
 <span class="sourceLineNo">089</span>    metricsBalancer = new MetricsBalancer();<a name="line.89"></a>
 <span class="sourceLineNo">090</span>  }<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  <a name="line.91"></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>   * This Constructor accepts an instance of MetricsBalancer, <a name="line.93"></a>
+<span class="sourceLineNo">093</span>   * This Constructor accepts an instance of MetricsBalancer,<a name="line.93"></a>
 <span class="sourceLineNo">094</span>   * which will be used instead of creating a new one<a name="line.94"></a>
 <span class="sourceLineNo">095</span>   */<a name="line.95"></a>
 <span class="sourceLineNo">096</span>  protected BaseLoadBalancer(MetricsBalancer metricsBalancer) {<a name="line.96"></a>
@@ -1287,284 +1287,251 @@
 <span class="sourceLineNo">1279</span>  }<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>   * Generates an immediate assignment plan to be used by a new master for<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   * regions in transition that do not have an already known destination.<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>   *<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>   * Takes a list of regions that need immediate assignment and a list of all<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>   * available servers. Returns a map of regions to the server they should be<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * assigned to.<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   *<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   * This method will return quickly and does not do any intelligent balancing.<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>   * The goal is to make a fast decision not the best decision possible.<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>   *<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>   * Currently this is random.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>   *<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>   * @param regions<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>   * @param servers<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>   * @return map of regions to the server it should be assigned to<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>  public Map&lt;HRegionInfo, ServerName&gt; immediateAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      List&lt;ServerName&gt; servers) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    metricsBalancer.incrMiscInvocations();<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    if (servers == null || servers.isEmpty()) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      LOG.warn("Wanted to do random assignment but no servers to assign to");<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      return null;<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>    Map&lt;HRegionInfo, ServerName&gt; assignments = new TreeMap&lt;HRegionInfo, ServerName&gt;();<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    for (HRegionInfo region : regions) {<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>      assignments.put(region, randomAssignment(region, servers));<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    }<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    return assignments;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>  }<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span><a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>  /**<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>   * Used to assign a single region to a random server.<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>   */<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>  @Override<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>  public ServerName randomAssignment(HRegionInfo regionInfo, List&lt;ServerName&gt; servers) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    metricsBalancer.incrMiscInvocations();<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>        return masterServerName;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      }<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      // Guarantee not to put other regions on master<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      servers.remove(masterServerName);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    }<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span><a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>    if (numServers == 0) {<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      return null;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>    }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      return servers.get(0);<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>    List&lt;HRegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    return randomAssignment(cluster, regionInfo, servers);<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>  }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span><a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  /**<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>   * available/online servers available for assignment.<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>   * &lt;p&gt;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   * completely balanced.<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>   * &lt;p&gt;<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * assigned randomly to available servers.<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   *<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * @param regions regions and existing assignment from meta<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * @param servers available servers<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * @return map of servers and regions to be assigned to them<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   */<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>  @Override<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; retainAssignment(Map&lt;HRegionInfo, ServerName&gt; regions,<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      List&lt;ServerName&gt; servers) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    // Update metrics<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    metricsBalancer.incrMiscInvocations();<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      = assignMasterRegions(regions.keySet(), servers);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      // Guarantee not to put other regions on master<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      servers.remove(masterServerName);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      if (!masterRegions.isEmpty()) {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>        regions = new HashMap&lt;HRegionInfo, ServerName&gt;(regions);<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        for (HRegionInfo region: masterRegions) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>          regions.remove(region);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    if (regions == null || regions.isEmpty()) {<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      return assignments;<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
+<span class="sourceLineNo">1282</span>   * Used to assign a single region to a random server.<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>   */<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>  @Override<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>  public ServerName randomAssignment(HRegionInfo regionInfo, List&lt;ServerName&gt; servers) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>    metricsBalancer.incrMiscInvocations();<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        return masterServerName;<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      // Guarantee not to put other regions on master<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      servers.remove(masterServerName);<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span><a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>    if (numServers == 0) {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      return null;<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      return servers.get(0);<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>    List&lt;HRegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    return randomAssignment(cluster, regionInfo, servers);<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>  }<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span><a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  /**<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>   * available/online servers available for assignment.<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>   * &lt;p&gt;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>   * completely balanced.<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>   * &lt;p&gt;<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>   * assigned randomly to available servers.<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>   *<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>   * @param regions regions and existing assignment from meta<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>   * @param servers available servers<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>   * @return map of servers and regions to be assigned to them<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   */<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>  @Override<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; retainAssignment(Map&lt;HRegionInfo, ServerName&gt; regions,<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      List&lt;ServerName&gt; servers) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>    // Update metrics<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    metricsBalancer.incrMiscInvocations();<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      = assignMasterRegions(regions.keySet(), servers);<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      // Guarantee not to put other regions on master<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      servers.remove(masterServerName);<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      if (!masterRegions.isEmpty()) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        regions = new HashMap&lt;HRegionInfo, ServerName&gt;(regions);<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        for (HRegionInfo region: masterRegions) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          regions.remove(region);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    if (regions == null || regions.isEmpty()) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>      return assignments;<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    }<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    if (numServers == 0) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>      return null;<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      ServerName server = servers.get(0);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions.keySet()));<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>      return assignments;<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    }<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span><a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    // Group all of the old assignments by their hostname.<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    // We can't group directly by ServerName since the servers all have<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    // new start-codes.<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>    // servers on the same host on different ports.<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    for (ServerName server : servers) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>      serversByHostname.put(server.getHostname(), server);<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>    // Collection of the hostnames that used to have regions<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    // assigned, but for which we no longer have any RS running<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>    // after the cluster restart.<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span><a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    int numRandomAssignments = 0;<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    int numRetainedAssigments = 0;<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span><a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1381"></a>
 <span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    if (numServers == 0) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      return null;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    }<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      ServerName server = servers.get(0);<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions.keySet()));<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return assignments;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span><a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    // Group all of the old assignments by their hostname.<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    // We can't group directly by ServerName since the servers all have<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>    // new start-codes.<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span><a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    // servers on the same host on different ports.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    for (ServerName server : servers) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      serversByHostname.put(server.getHostname(), server);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    // Collection of the hostnames that used to have regions<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    // assigned, but for which we no longer have any RS running<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    // after the cluster restart.<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    int numRandomAssignments = 0;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    int numRetainedAssigments = 0;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span><a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    for (Map.Entry&lt;HRegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      HRegionInfo region = entry.getKey();<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>      ServerName oldServerName = entry.getValue();<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;ServerName&gt;();<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      if (oldServerName != null) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        localServers = serversByHostname.get(oldServerName.getHostname());<a name="line.1421"></a>
+<span class="sourceLineNo">1383</span>    for (Map.Entry&lt;HRegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      HRegionInfo region = entry.getKey();<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      ServerName oldServerName = entry.getValue();<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;ServerName&gt;();<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      if (oldServerName != null) {<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        localServers = serversByHostname.get(oldServerName.getHostname());<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      }<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      if (localServers.isEmpty()) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>        // No servers on the new cluster match up with this hostname,<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>        // assign randomly.<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>        ServerName randomServer = randomAssignment(cluster, region, servers);<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>        assignments.get(randomServer).add(region);<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        numRandomAssignments++;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        if (oldServerName != null) oldHostsNoLongerPresent.add(oldServerName.getHostname());<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      } else if (localServers.size() == 1) {<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>        // the usual case - one new server on same host<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>        ServerName target = localServers.get(0);<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>        assignments.get(target).add(region);<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>        cluster.doAssignRegion(region, target);<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>        numRetainedAssigments++;<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      } else {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>        // multiple new servers in the cluster on this same host<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        if (localServers.contains(oldServerName)) {<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>          assignments.get(oldServerName).add(region);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>          cluster.doAssignRegion(region, oldServerName);<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        } else {<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>          ServerName target = null;<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>          for (ServerName tmp: localServers) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>              target = tmp;<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>              break;<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>            }<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>          }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>          if (target == null) {<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>            target = randomAssignment(cluster, region, localServers);<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>          }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>          assignments.get(target).add(region);<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>        }<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>        numRetainedAssigments++;<a name="line.1421"></a>
 <span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      if (localServers.isEmpty()) {<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        // No servers on the new cluster match up with this hostname,<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>        // assign randomly.<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>        ServerName randomServer = randomAssignment(cluster, region, servers);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        assignments.get(randomServer).add(region);<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>        numRandomAssignments++;<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>        if (oldServerName != null) oldHostsNoLongerPresent.add(oldServerName.getHostname());<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      } else if (localServers.size() == 1) {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        // the usual case - one new server on same host<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>        ServerName target = localServers.get(0);<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        assignments.get(target).add(region);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>        cluster.doAssignRegion(region, target);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>        numRetainedAssigments++;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      } else {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        // multiple new servers in the cluster on this same host<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        if (localServers.contains(oldServerName)) {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>          assignments.get(oldServerName).add(region);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>          cluster.doAssignRegion(region, oldServerName);<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        } else {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>          ServerName target = null;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>          for (ServerName tmp: localServers) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>              target = tmp;<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>              break;<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>            }<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          }<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          if (target == null) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            target = randomAssignment(cluster, region, localServers);<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>          }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>          assignments.get(target).add(region);<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>        }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>        numRetainedAssigments++;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    }<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span><a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    String randomAssignMsg = "";<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>    if (numRandomAssignments &gt; 0) {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      randomAssignMsg =<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>          numRandomAssignments + " regions were assigned "<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<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>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    return assignments;<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  }<a name="line.1470"></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>    String randomAssignMsg = "";<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>    if (numRandomAssignments &gt; 0) {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      randomAssignMsg =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>          numRandomAssignments + " regions were assigned "<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    }<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    return assignments;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>  }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span><a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>  @Override<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>  public void initialize() throws HBaseIOException{<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>  }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span><a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>  @Override<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>  public void regionOnline(HRegionInfo regionInfo, ServerName sn) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>  }<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span><a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>  @Override<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>  public void regionOffline(HRegionInfo regionInfo) {<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>  @Override<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>  public boolean isStopped() {<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    return stopped;<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>  }<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span><a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>  @Override<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>  public void stop(String why) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    stopped = true;<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>  }<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span><a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>  /**<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>   * Used to assign a single region to a random server.<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>   */<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>  private ServerName randomAssignment(Cluster cluster, HRegionInfo regionInfo,<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>      List&lt;ServerName&gt; servers) {<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    ServerName sn = null;<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    final int maxIterations = numServers * 4;<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    int iterations = 0;<a name="line.1470"></a>
 <span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  @Override<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  public void initialize() throws HBaseIOException{<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>  }<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span><a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>  @Override<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>  public void regionOnline(HRegionInfo regionInfo, ServerName sn) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>  }<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>  @Override<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>  public void regionOffline(HRegionInfo regionInfo) {<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>  public boolean isStopped() {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>    return stopped;<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>  @Override<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  public void stop(String why) {<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>    stopped = true;<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>  }<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span><a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>  /**<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>   * Used to assign a single region to a random server.<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>   */<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>  private ServerName randomAssignment(Cluster cluster, HRegionInfo regionInfo,<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>      List&lt;ServerName&gt; servers) {<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>    ServerName sn = null;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>    final int maxIterations = numServers * 4;<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    int iterations = 0;<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    do {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>      int i = RANDOM.nextInt(numServers);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      sn = servers.get(i);<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    return sn;<a name="line.1511"></a>
+<span class="sourceLineNo">1472</span>    do {<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      int i = RANDOM.nextInt(numServers);<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      sn = servers.get(i);<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>    return sn;<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>  /**<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>   * Round robin a list of regions to a list of servers<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>   */<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>  private void roundRobinAssignment(Cluster cluster, List&lt;HRegionInfo&gt; regions,<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      List&lt;HRegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments) {<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>    int numServers = servers.size();<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    int numRegions = regions.size();<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>    int serverIdx = 0;<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    if (numServers &gt; 1) {<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    }<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    int regionIdx = 0;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      List&lt;HRegionInfo&gt; serverRegions = new ArrayList&lt;HRegionInfo&gt;(max);<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>        HRegionInfo region = regions.get(i % numRegions);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>          unassignedRegions.add(region);<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>        } else {<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>          serverRegions.add(region);<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>          cluster.doAssignRegion(region, server);<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>      assignments.put(server, serverRegions);<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      regionIdx++;<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    }<a name="line.1511"></a>
 <span class="sourceLineNo">1512</span>  }<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>
-<span class="sourceLineNo">1515</span>   * Round robin a list of regions to a list of servers<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>   */<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>  private void roundRobinAssignment(Cluster cluster, List&lt;HRegionInfo&gt; regions,<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>      List&lt;HRegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments) {<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span><a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    int numServers = servers.size();<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    int numRegions = regions.size();<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    int serverIdx = 0;<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    if (numServers &gt; 1) {<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    }<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>    int regionIdx = 0;<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span><a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>      List&lt;HRegionInfo&gt; serverRegions = new ArrayList&lt;HRegionInfo&gt;(max);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>        HRegionInfo region = regions.get(i % numRegions);<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>          unassignedRegions.add(region);<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>        } else {<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>          serverRegions.add(region);<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>          cluster.doAssignRegion(region, server);<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>        }<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      }<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      assignments.put(server, serverRegions);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>      regionIdx++;<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    }<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>  }<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span><a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>    Collection&lt;HRegionInfo&gt; regions) {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    } else {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      return new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    }<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>  }<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span><a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>  @Override<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>  }<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>}<a name="line.1559"></a>
+<span class="sourceLineNo">1514</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>    Collection&lt;HRegionInfo&gt; regions) {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    } else {<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>      return new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    }<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>  }<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span><a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>  @Override<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>  }<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>}<a name="line.1526"></a>
 
 
 


[15/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html
index a74e672..bfc43fa 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/WALEdit.html
@@ -107,7 +107,7 @@
 <span class="sourceLineNo">099</span>  private final int VERSION_2 = -1;<a name="line.99"></a>
 <span class="sourceLineNo">100</span>  private final boolean isReplay;<a name="line.100"></a>
 <span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  private ArrayList&lt;Cell&gt; cells = new ArrayList&lt;Cell&gt;(1);<a name="line.102"></a>
+<span class="sourceLineNo">102</span>  private ArrayList&lt;Cell&gt; cells = null;<a name="line.102"></a>
 <span class="sourceLineNo">103</span><a name="line.103"></a>
 <span class="sourceLineNo">104</span>  public static final WALEdit EMPTY_WALEDIT = new WALEdit();<a name="line.104"></a>
 <span class="sourceLineNo">105</span><a name="line.105"></a>
@@ -125,274 +125,283 @@
 <span class="sourceLineNo">117</span>  }<a name="line.117"></a>
 <span class="sourceLineNo">118</span><a name="line.118"></a>
 <span class="sourceLineNo">119</span>  public WALEdit(boolean isReplay) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    this.isReplay = isReplay;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>    this(1, isReplay);<a name="line.120"></a>
 <span class="sourceLineNo">121</span>  }<a name="line.121"></a>
 <span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>  /**<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   * @param f<a name="line.124"></a>
-<span class="sourceLineNo">125</span>   * @return True is &lt;code&gt;f&lt;/code&gt; is {@link #METAFAMILY}<a name="line.125"></a>
-<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  public static boolean isMetaEditFamily(final byte [] f) {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    return Bytes.equals(METAFAMILY, f);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  }<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  public static boolean isMetaEditFamily(Cell cell) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    return CellUtil.matchingFamily(cell, METAFAMILY);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public boolean isMetaEdit() {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    for (Cell cell: cells) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      if (!isMetaEditFamily(cell)) {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        return false;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    }<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    return true;<a name="line.141"></a>
+<span class="sourceLineNo">123</span>  public WALEdit(int cellCount) {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    this(cellCount, false);<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  }<a name="line.125"></a>
+<span class="sourceLineNo">126</span><a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public WALEdit(int cellCount, boolean isReplay) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    this.isReplay = isReplay;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    cells = new ArrayList&lt;Cell&gt;(cellCount);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  }<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>   * @param f<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * @return True is &lt;code&gt;f&lt;/code&gt; is {@link #METAFAMILY}<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   */<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  public static boolean isMetaEditFamily(final byte [] f) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    return Bytes.equals(METAFAMILY, f);<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>  public static boolean isMetaEditFamily(Cell cell) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    return CellUtil.matchingFamily(cell, METAFAMILY);<a name="line.141"></a>
 <span class="sourceLineNo">142</span>  }<a name="line.142"></a>
 <span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  /**<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   * @return True when current WALEdit is created by log replay. Replication skips WALEdits from<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   *         replay.<a name="line.146"></a>
-<span class="sourceLineNo">147</span>   */<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public boolean isReplay() {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    return this.isReplay;<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">152</span>  public void setCompressionContext(final CompressionContext compressionContext) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    this.compressionContext = compressionContext;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  public WALEdit add(Cell cell) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    this.cells.add(cell);<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    return this;<a name="line.158"></a>
+<span class="sourceLineNo">144</span>  public boolean isMetaEdit() {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    for (Cell cell: cells) {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      if (!isMetaEditFamily(cell)) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        return false;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      }<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    }<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    return true;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * @return True when current WALEdit is created by log replay. Replication skips WALEdits from<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   *         replay.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   */<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  public boolean isReplay() {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    return this.isReplay;<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>  public boolean isEmpty() {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    return cells.isEmpty();<a name="line.162"></a>
+<span class="sourceLineNo">161</span>  public void setCompressionContext(final CompressionContext compressionContext) {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    this.compressionContext = compressionContext;<a name="line.162"></a>
 <span class="sourceLineNo">163</span>  }<a name="line.163"></a>
 <span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>  public int size() {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    return cells.size();<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  }<a name="line.167"></a>
-<span class="sourceLineNo">168</span><a name="line.168"></a>
-<span class="sourceLineNo">169</span>  public ArrayList&lt;Cell&gt; getCells() {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    return cells;<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>  /**<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * This is not thread safe.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * This will change the WALEdit and shouldn't be used unless you are sure that nothing<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * else depends on the contents being immutable.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   *<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   * @param cells the list of cells that this WALEdit now contains.<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   */<a name="line.179"></a>
-<span class="sourceLineNo">180</span>  @InterfaceAudience.Private<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  public void setCells(ArrayList&lt;Cell&gt; cells) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    this.cells = cells;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  }<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>  public NavigableMap&lt;byte[], Integer&gt; getAndRemoveScopes() {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    NavigableMap&lt;byte[], Integer&gt; result = scopes;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    scopes = null;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    return result;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>  }<a name="line.189"></a>
-<span class="sourceLineNo">190</span><a name="line.190"></a>
-<span class="sourceLineNo">191</span>  @Override<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  public void readFields(DataInput in) throws IOException {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    cells.clear();<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    if (scopes != null) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      scopes.clear();<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    }<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    int versionOrLength = in.readInt();<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    // TODO: Change version when we protobuf.  Also, change way we serialize KV!  Pb it too.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    if (versionOrLength == VERSION_2) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      // this is new style WAL entry containing multiple KeyValues.<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      int numEdits = in.readInt();<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      for (int idx = 0; idx &lt; numEdits; idx++) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        if (compressionContext != null) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>          this.add(KeyValueCompression.readKV(in, compressionContext));<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        } else {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          this.add(KeyValueUtil.create(in));<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        }<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      int numFamilies = in.readInt();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      if (numFamilies &gt; 0) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>        if (scopes == null) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>          scopes = new TreeMap&lt;byte[], Integer&gt;(Bytes.BYTES_COMPARATOR);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        for (int i = 0; i &lt; numFamilies; i++) {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>          byte[] fam = Bytes.readByteArray(in);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>          int scope = in.readInt();<a name="line.216"></a>
-<span class="sourceLineNo">217</span>          scopes.put(fam, scope);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        }<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    } else {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      // this is an old style WAL entry. The int that we just<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      // read is actually the length of a single KeyValue<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      this.add(KeyValueUtil.create(versionOrLength, in));<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>  }<a name="line.225"></a>
-<span class="sourceLineNo">226</span><a name="line.226"></a>
-<span class="sourceLineNo">227</span>  @Override<a name="line.227"></a>
-<span class="sourceLineNo">228</span>  public void write(DataOutput out) throws IOException {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    LOG.warn("WALEdit is being serialized to writable - only expected in test code");<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    out.writeInt(VERSION_2);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    out.writeInt(cells.size());<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    // We interleave the two lists for code simplicity<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    for (Cell cell : cells) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      // This is not used in any of the core code flows so it is just fine to convert to KV<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      KeyValue kv = KeyValueUtil.ensureKeyValue(cell);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      if (compressionContext != null) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        KeyValueCompression.writeKV(out, kv, compressionContext);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      } else{<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        KeyValueUtil.write(kv, out);<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>    if (scopes == null) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      out.writeInt(0);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    } else {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      out.writeInt(scopes.size());<a name="line.245"></a>
-<span class="sourceLineNo">246</span>      for (byte[] key : scopes.keySet()) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        Bytes.writeByteArray(out, key);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        out.writeInt(scopes.get(key));<a name="line.248"></a>
+<span class="sourceLineNo">165</span>  public WALEdit add(Cell cell) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    this.cells.add(cell);<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    return this;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  }<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>  public boolean isEmpty() {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    return cells.isEmpty();<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>  public int size() {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    return cells.size();<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>  public ArrayList&lt;Cell&gt; getCells() {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    return cells;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>  /**<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * This is not thread safe.<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * This will change the WALEdit and shouldn't be used unless you are sure that nothing<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * else depends on the contents being immutable.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   *<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   * @param cells the list of cells that this WALEdit now contains.<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  @InterfaceAudience.Private<a name="line.189"></a>
+<span class="sourceLineNo">190</span>  public void setCells(ArrayList&lt;Cell&gt; cells) {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    this.cells = cells;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  public NavigableMap&lt;byte[], Integer&gt; getAndRemoveScopes() {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    NavigableMap&lt;byte[], Integer&gt; result = scopes;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    scopes = null;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    return result;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  }<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>  @Override<a name="line.200"></a>
+<span class="sourceLineNo">201</span>  public void readFields(DataInput in) throws IOException {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    cells.clear();<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    if (scopes != null) {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      scopes.clear();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    int versionOrLength = in.readInt();<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    // TODO: Change version when we protobuf.  Also, change way we serialize KV!  Pb it too.<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    if (versionOrLength == VERSION_2) {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      // this is new style WAL entry containing multiple KeyValues.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      int numEdits = in.readInt();<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      for (int idx = 0; idx &lt; numEdits; idx++) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>        if (compressionContext != null) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>          this.add(KeyValueCompression.readKV(in, compressionContext));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        } else {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>          this.add(KeyValueUtil.create(in));<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        }<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      }<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      int numFamilies = in.readInt();<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      if (numFamilies &gt; 0) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        if (scopes == null) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>          scopes = new TreeMap&lt;byte[], Integer&gt;(Bytes.BYTES_COMPARATOR);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        for (int i = 0; i &lt; numFamilies; i++) {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>          byte[] fam = Bytes.readByteArray(in);<a name="line.224"></a>
+<span class="sourceLineNo">225</span>          int scope = in.readInt();<a name="line.225"></a>
+<span class="sourceLineNo">226</span>          scopes.put(fam, scope);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        }<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      }<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    } else {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      // this is an old style WAL entry. The int that we just<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      // read is actually the length of a single KeyValue<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      this.add(KeyValueUtil.create(versionOrLength, in));<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>  @Override<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  public void write(DataOutput out) throws IOException {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    LOG.warn("WALEdit is being serialized to writable - only expected in test code");<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    out.writeInt(VERSION_2);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    out.writeInt(cells.size());<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    // We interleave the two lists for code simplicity<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    for (Cell cell : cells) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      // This is not used in any of the core code flows so it is just fine to convert to KV<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      KeyValue kv = KeyValueUtil.ensureKeyValue(cell);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      if (compressionContext != null) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        KeyValueCompression.writeKV(out, kv, compressionContext);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      } else{<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        KeyValueUtil.write(kv, out);<a name="line.248"></a>
 <span class="sourceLineNo">249</span>      }<a name="line.249"></a>
 <span class="sourceLineNo">250</span>    }<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  }<a name="line.251"></a>
-<span class="sourceLineNo">252</span><a name="line.252"></a>
-<span class="sourceLineNo">253</span>  /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * Reads WALEdit from cells.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @param cellDecoder Cell decoder.<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * @param expectedCount Expected cell count.<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * @return Number of KVs read.<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>  public int readFromCells(Codec.Decoder cellDecoder, int expectedCount) throws IOException {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    cells.clear();<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    cells.ensureCapacity(expectedCount);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    while (cells.size() &lt; expectedCount &amp;&amp; cellDecoder.advance()) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      cells.add(cellDecoder.current());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    return cells.size();<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  }<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>  @Override<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public long heapSize() {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    long ret = ClassSize.ARRAYLIST;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    for (Cell cell : cells) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      ret += CellUtil.estimatedHeapSizeOf(cell);<a name="line.272"></a>
+<span class="sourceLineNo">251</span>    if (scopes == null) {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      out.writeInt(0);<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    } else {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      out.writeInt(scopes.size());<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      for (byte[] key : scopes.keySet()) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        Bytes.writeByteArray(out, key);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        out.writeInt(scopes.get(key));<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    }<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * Reads WALEdit from cells.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * @param cellDecoder Cell decoder.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   * @param expectedCount Expected cell count.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>   * @return Number of KVs read.<a name="line.266"></a>
+<span class="sourceLineNo">267</span>   */<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  public int readFromCells(Codec.Decoder cellDecoder, int expectedCount) throws IOException {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    cells.clear();<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    cells.ensureCapacity(expectedCount);<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    while (cells.size() &lt; expectedCount &amp;&amp; cellDecoder.advance()) {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>      cells.add(cellDecoder.current());<a name="line.272"></a>
 <span class="sourceLineNo">273</span>    }<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (scopes != null) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      ret += ClassSize.TREEMAP;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      ret += ClassSize.align(scopes.size() * ClassSize.MAP_ENTRY);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      // TODO this isn't quite right, need help here<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    return ret;<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 String toString() {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    StringBuilder sb = new StringBuilder();<a name="line.284"></a>
-<span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span>    sb.append("[#edits: " + cells.size() + " = &lt;");<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    for (Cell cell : cells) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      sb.append(cell);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      sb.append("; ");<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    if (scopes != null) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      sb.append(" scopes: " + scopes.toString());<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    }<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    sb.append("&gt;]");<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    return sb.toString();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>  public static WALEdit createFlushWALEdit(HRegionInfo hri, FlushDescriptor f) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    KeyValue kv = new KeyValue(getRowForRegion(hri), METAFAMILY, FLUSH,<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      EnvironmentEdgeManager.currentTime(), f.toByteArray());<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    return new WALEdit().add(kv);<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>  public static FlushDescriptor getFlushDescriptor(Cell cell) throws IOException {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    if (CellUtil.matchingColumn(cell, METAFAMILY, FLUSH)) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      return FlushDescriptor.parseFrom(CellUtil.cloneValue(cell));<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    return null;<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>  public static WALEdit createRegionEventWALEdit(HRegionInfo hri,<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      RegionEventDescriptor regionEventDesc) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    KeyValue kv = new KeyValue(getRowForRegion(hri), METAFAMILY, REGION_EVENT,<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      EnvironmentEdgeManager.currentTime(), regionEventDesc.toByteArray());<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    return new WALEdit().add(kv);<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>  public static RegionEventDescriptor getRegionEventDescriptor(Cell cell) throws IOException {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    if (CellUtil.matchingColumn(cell, METAFAMILY, REGION_EVENT)) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      return RegionEventDescriptor.parseFrom(CellUtil.cloneValue(cell));<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    }<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    return null;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  /**<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * Create a compaction WALEdit<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * @param c<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * @return A WALEdit that has &lt;code&gt;c&lt;/code&gt; serialized as its value<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   */<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  public static WALEdit createCompaction(final HRegionInfo hri, final CompactionDescriptor c) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    byte [] pbbytes = c.toByteArray();<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    KeyValue kv = new KeyValue(getRowForRegion(hri), METAFAMILY, COMPACTION,<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      EnvironmentEdgeManager.currentTime(), pbbytes);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    return new WALEdit().add(kv); //replication scope null so that this won't be replicated<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  }<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  private static byte[] getRowForRegion(HRegionInfo hri) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    byte[] startKey = hri.getStartKey();<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    if (startKey.length == 0) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      // empty row key is not allowed in mutations because it is both the start key and the end key<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      // we return the smallest byte[] that is bigger (in lex comparison) than byte[0].<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      return new byte[] {0};<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    return startKey;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  }<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>  /**<a name="line.347"></a>
-<span class="sourceLineNo">348</span>   * Deserialized and returns a CompactionDescriptor is the KeyValue contains one.<a name="line.348"></a>
-<span class="sourceLineNo">349</span>   * @param kv the key value<a name="line.349"></a>
-<span class="sourceLineNo">350</span>   * @return deserialized CompactionDescriptor or null.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>   */<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  public static CompactionDescriptor getCompaction(Cell kv) throws IOException {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    if (CellUtil.matchingColumn(kv, METAFAMILY, COMPACTION)) {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      return CompactionDescriptor.parseFrom(CellUtil.cloneValue(kv));<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    return null;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>  }<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * Create a bulk loader WALEdit<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   *<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   * @param hri                The HRegionInfo for the region in which we are bulk loading<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   * @param bulkLoadDescriptor The descriptor for the Bulk Loader<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   * @return The WALEdit for the BulkLoad<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   */<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  public static WALEdit createBulkLoadEvent(HRegionInfo hri,<a name="line.366"></a>
-<span class="sourceLineNo">367</span>                                            WALProtos.BulkLoadDescriptor bulkLoadDescriptor) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    KeyValue kv = new KeyValue(getRowForRegion(hri),<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        METAFAMILY,<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        BULK_LOAD,<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        EnvironmentEdgeManager.currentTime(),<a name="line.371"></a>
-<span class="sourceLineNo">372</span>        bulkLoadDescriptor.toByteArray());<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    return new WALEdit().add(kv);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  }<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>   * Deserialized and returns a BulkLoadDescriptor from the passed in Cell<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * @param cell the key value<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   * @return deserialized BulkLoadDescriptor or null.<a name="line.379"></a>
-<span class="sourceLineNo">380</span>   */<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public static WALProtos.BulkLoadDescriptor getBulkLoadDescriptor(Cell cell) throws IOException {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    if (CellUtil.matchingColumn(cell, METAFAMILY, BULK_LOAD)) {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      return WALProtos.BulkLoadDescriptor.parseFrom(CellUtil.cloneValue(cell));<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    return null;<a name="line.385"></a>
-<span class="sourceLineNo">386</span>  }<a name="line.386"></a>
-<span class="sourceLineNo">387</span>}<a name="line.387"></a>
+<span class="sourceLineNo">274</span>    return cells.size();<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>  public long heapSize() {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    long ret = ClassSize.ARRAYLIST;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    for (Cell cell : cells) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      ret += CellUtil.estimatedHeapSizeOf(cell);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    if (scopes != null) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      ret += ClassSize.TREEMAP;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      ret += ClassSize.align(scopes.size() * ClassSize.MAP_ENTRY);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      // TODO this isn't quite right, need help here<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    return ret;<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>  @Override<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  public String toString() {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    StringBuilder sb = new StringBuilder();<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>    sb.append("[#edits: " + cells.size() + " = &lt;");<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    for (Cell cell : cells) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      sb.append(cell);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      sb.append("; ");<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    if (scopes != null) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      sb.append(" scopes: " + scopes.toString());<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    }<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    sb.append("&gt;]");<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    return sb.toString();<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  }<a name="line.305"></a>
+<span class="sourceLineNo">306</span><a name="line.306"></a>
+<span class="sourceLineNo">307</span>  public static WALEdit createFlushWALEdit(HRegionInfo hri, FlushDescriptor f) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    KeyValue kv = new KeyValue(getRowForRegion(hri), METAFAMILY, FLUSH,<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      EnvironmentEdgeManager.currentTime(), f.toByteArray());<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    return new WALEdit().add(kv);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
+<span class="sourceLineNo">312</span><a name="line.312"></a>
+<span class="sourceLineNo">313</span>  public static FlushDescriptor getFlushDescriptor(Cell cell) throws IOException {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    if (CellUtil.matchingColumn(cell, METAFAMILY, FLUSH)) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return FlushDescriptor.parseFrom(CellUtil.cloneValue(cell));<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    return null;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
+<span class="sourceLineNo">319</span><a name="line.319"></a>
+<span class="sourceLineNo">320</span>  public static WALEdit createRegionEventWALEdit(HRegionInfo hri,<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      RegionEventDescriptor regionEventDesc) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    KeyValue kv = new KeyValue(getRowForRegion(hri), METAFAMILY, REGION_EVENT,<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      EnvironmentEdgeManager.currentTime(), regionEventDesc.toByteArray());<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    return new WALEdit().add(kv);<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>  public static RegionEventDescriptor getRegionEventDescriptor(Cell cell) throws IOException {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    if (CellUtil.matchingColumn(cell, METAFAMILY, REGION_EVENT)) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      return RegionEventDescriptor.parseFrom(CellUtil.cloneValue(cell));<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    }<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    return null;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  }<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>  /**<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * Create a compaction WALEdit<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   * @param c<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * @return A WALEdit that has &lt;code&gt;c&lt;/code&gt; serialized as its value<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   */<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  public static WALEdit createCompaction(final HRegionInfo hri, final CompactionDescriptor c) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    byte [] pbbytes = c.toByteArray();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    KeyValue kv = new KeyValue(getRowForRegion(hri), METAFAMILY, COMPACTION,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      EnvironmentEdgeManager.currentTime(), pbbytes);<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    return new WALEdit().add(kv); //replication scope null so that this won't be replicated<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
+<span class="sourceLineNo">345</span><a name="line.345"></a>
+<span class="sourceLineNo">346</span>  private static byte[] getRowForRegion(HRegionInfo hri) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    byte[] startKey = hri.getStartKey();<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    if (startKey.length == 0) {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      // empty row key is not allowed in mutations because it is both the start key and the end key<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      // we return the smallest byte[] that is bigger (in lex comparison) than byte[0].<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      return new byte[] {0};<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    }<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    return startKey;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  }<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  /**<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   * Deserialized and returns a CompactionDescriptor is the KeyValue contains one.<a name="line.357"></a>
+<span class="sourceLineNo">358</span>   * @param kv the key value<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   * @return deserialized CompactionDescriptor or null.<a name="line.359"></a>
+<span class="sourceLineNo">360</span>   */<a name="line.360"></a>
+<span class="sourceLineNo">361</span>  public static CompactionDescriptor getCompaction(Cell kv) throws IOException {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    if (CellUtil.matchingColumn(kv, METAFAMILY, COMPACTION)) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      return CompactionDescriptor.parseFrom(CellUtil.cloneValue(kv));<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    }<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    return null;<a name="line.365"></a>
+<span class="sourceLineNo">366</span>  }<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>   * Create a bulk loader WALEdit<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   *<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   * @param hri                The HRegionInfo for the region in which we are bulk loading<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   * @param bulkLoadDescriptor The descriptor for the Bulk Loader<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   * @return The WALEdit for the BulkLoad<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   */<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  public static WALEdit createBulkLoadEvent(HRegionInfo hri,<a name="line.375"></a>
+<span class="sourceLineNo">376</span>                                            WALProtos.BulkLoadDescriptor bulkLoadDescriptor) {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    KeyValue kv = new KeyValue(getRowForRegion(hri),<a name="line.377"></a>
+<span class="sourceLineNo">378</span>        METAFAMILY,<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        BULK_LOAD,<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        EnvironmentEdgeManager.currentTime(),<a name="line.380"></a>
+<span class="sourceLineNo">381</span>        bulkLoadDescriptor.toByteArray());<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    return new WALEdit().add(kv);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>  }<a name="line.383"></a>
+<span class="sourceLineNo">384</span><a name="line.384"></a>
+<span class="sourceLineNo">385</span>  /**<a name="line.385"></a>
+<span class="sourceLineNo">386</span>   * Deserialized and returns a BulkLoadDescriptor from the passed in Cell<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   * @param cell the key value<a name="line.387"></a>
+<span class="sourceLineNo">388</span>   * @return deserialized BulkLoadDescriptor or null.<a name="line.388"></a>
+<span class="sourceLineNo">389</span>   */<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  public static WALProtos.BulkLoadDescriptor getBulkLoadDescriptor(Cell cell) throws IOException {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    if (CellUtil.matchingColumn(cell, METAFAMILY, BULK_LOAD)) {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      return WALProtos.BulkLoadDescriptor.parseFrom(CellUtil.cloneValue(cell));<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    }<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>}<a name="line.396"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/rest/client/Cluster.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/rest/client/Cluster.html b/devapidocs/src-html/org/apache/hadoop/hbase/rest/client/Cluster.html
index 6842786..7f0ebee 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/rest/client/Cluster.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/rest/client/Cluster.html
@@ -55,7 +55,7 @@
 <span class="sourceLineNo">047</span>   * @param nodes a list of service locations, in 'host:port' format<a name="line.47"></a>
 <span class="sourceLineNo">048</span>   */<a name="line.48"></a>
 <span class="sourceLineNo">049</span>  public Cluster(List&lt;String&gt; nodes) {<a name="line.49"></a>
-<span class="sourceLineNo">050</span>    nodes.addAll(nodes);<a name="line.50"></a>
+<span class="sourceLineNo">050</span>    this.nodes.addAll(nodes);<a name="line.50"></a>
 <span class="sourceLineNo">051</span>  }<a name="line.51"></a>
 <span class="sourceLineNo">052</span><a name="line.52"></a>
 <span class="sourceLineNo">053</span>  /**<a name="line.53"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
index 605e9f5..c719c8a 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html
@@ -67,15 +67,15 @@
 <span class="sourceLineNo">059</span>  requiredArguments = {<a name="line.59"></a>
 <span class="sourceLineNo">060</span>    @org.jamon.annotations.Argument(name = "master", type = "HMaster")},<a name="line.60"></a>
 <span class="sourceLineNo">061</span>  optionalArguments = {<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    @org.jamon.annotations.Argument(name = "serverManager", type = "ServerManager"),<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    @org.jamon.annotations.Argument(name = "frags", type = "Map&lt;String,Integer&gt;"),<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    @org.jamon.annotations.Argument(name = "metaLocation", type = "ServerName"),<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    @org.jamon.annotations.Argument(name = "assignmentManager", type = "AssignmentManager"),<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    @org.jamon.annotations.Argument(name = "catalogJanitorEnabled", type = "boolean"),<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    @org.jamon.annotations.Argument(name = "filter", type = "String"),<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    @org.jamon.annotations.Argument(name = "deadServers", type = "Set&lt;ServerName&gt;"),<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    @org.jamon.annotations.Argument(name = "servers", type = "List&lt;ServerName&gt;")})<a name="line.70"></a>
+<span class="sourceLineNo">062</span>    @org.jamon.annotations.Argument(name = "assignmentManager", type = "AssignmentManager"),<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    @org.jamon.annotations.Argument(name = "serverManager", type = "ServerManager"),<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    @org.jamon.annotations.Argument(name = "deadServers", type = "Set&lt;ServerName&gt;"),<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    @org.jamon.annotations.Argument(name = "servers", type = "List&lt;ServerName&gt;"),<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    @org.jamon.annotations.Argument(name = "metaLocation", type = "ServerName"),<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    @org.jamon.annotations.Argument(name = "frags", type = "Map&lt;String,Integer&gt;"),<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    @org.jamon.annotations.Argument(name = "catalogJanitorEnabled", type = "boolean"),<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    @org.jamon.annotations.Argument(name = "filter", type = "String")})<a name="line.70"></a>
 <span class="sourceLineNo">071</span>public class MasterStatusTmpl<a name="line.71"></a>
 <span class="sourceLineNo">072</span>  extends org.jamon.AbstractTemplateProxy<a name="line.72"></a>
 <span class="sourceLineNo">073</span>{<a name="line.73"></a>
@@ -116,159 +116,159 @@
 <span class="sourceLineNo">108</span>      return m_master;<a name="line.108"></a>
 <span class="sourceLineNo">109</span>    }<a name="line.109"></a>
 <span class="sourceLineNo">110</span>    private HMaster m_master;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    // 28, 1<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    public void setServerManager(ServerManager serverManager)<a name="line.112"></a>
+<span class="sourceLineNo">111</span>    // 29, 1<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    public void setAssignmentManager(AssignmentManager assignmentManager)<a name="line.112"></a>
 <span class="sourceLineNo">113</span>    {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      // 28, 1<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      m_serverManager = serverManager;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      m_serverManager__IsNotDefault = true;<a name="line.116"></a>
+<span class="sourceLineNo">114</span>      // 29, 1<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      m_assignmentManager = assignmentManager;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      m_assignmentManager__IsNotDefault = true;<a name="line.116"></a>
 <span class="sourceLineNo">117</span>    }<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    public ServerManager getServerManager()<a name="line.118"></a>
+<span class="sourceLineNo">118</span>    public AssignmentManager getAssignmentManager()<a name="line.118"></a>
 <span class="sourceLineNo">119</span>    {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      return m_serverManager;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>      return m_assignmentManager;<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    private ServerManager m_serverManager;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public boolean getServerManager__IsNotDefault()<a name="line.123"></a>
+<span class="sourceLineNo">122</span>    private AssignmentManager m_assignmentManager;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    public boolean getAssignmentManager__IsNotDefault()<a name="line.123"></a>
 <span class="sourceLineNo">124</span>    {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      return m_serverManager__IsNotDefault;<a name="line.125"></a>
+<span class="sourceLineNo">125</span>      return m_assignmentManager__IsNotDefault;<a name="line.125"></a>
 <span class="sourceLineNo">126</span>    }<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    private boolean m_serverManager__IsNotDefault;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    // 21, 1<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    public void setFrags(Map&lt;String,Integer&gt; frags)<a name="line.129"></a>
+<span class="sourceLineNo">127</span>    private boolean m_assignmentManager__IsNotDefault;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    // 28, 1<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    public void setServerManager(ServerManager serverManager)<a name="line.129"></a>
 <span class="sourceLineNo">130</span>    {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      // 21, 1<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      m_frags = frags;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      m_frags__IsNotDefault = true;<a name="line.133"></a>
+<span class="sourceLineNo">131</span>      // 28, 1<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      m_serverManager = serverManager;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      m_serverManager__IsNotDefault = true;<a name="line.133"></a>
 <span class="sourceLineNo">134</span>    }<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    public Map&lt;String,Integer&gt; getFrags()<a name="line.135"></a>
+<span class="sourceLineNo">135</span>    public ServerManager getServerManager()<a name="line.135"></a>
 <span class="sourceLineNo">136</span>    {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      return m_frags;<a name="line.137"></a>
+<span class="sourceLineNo">137</span>      return m_serverManager;<a name="line.137"></a>
 <span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    private Map&lt;String,Integer&gt; m_frags;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    public boolean getFrags__IsNotDefault()<a name="line.140"></a>
+<span class="sourceLineNo">139</span>    private ServerManager m_serverManager;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    public boolean getServerManager__IsNotDefault()<a name="line.140"></a>
 <span class="sourceLineNo">141</span>    {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return m_frags__IsNotDefault;<a name="line.142"></a>
+<span class="sourceLineNo">142</span>      return m_serverManager__IsNotDefault;<a name="line.142"></a>
 <span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    private boolean m_frags__IsNotDefault;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    // 22, 1<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    public void setMetaLocation(ServerName metaLocation)<a name="line.146"></a>
+<span class="sourceLineNo">144</span>    private boolean m_serverManager__IsNotDefault;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    // 24, 1<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    public void setDeadServers(Set&lt;ServerName&gt; deadServers)<a name="line.146"></a>
 <span class="sourceLineNo">147</span>    {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      // 22, 1<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      m_metaLocation = metaLocation;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      m_metaLocation__IsNotDefault = true;<a name="line.150"></a>
+<span class="sourceLineNo">148</span>      // 24, 1<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      m_deadServers = deadServers;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      m_deadServers__IsNotDefault = true;<a name="line.150"></a>
 <span class="sourceLineNo">151</span>    }<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    public ServerName getMetaLocation()<a name="line.152"></a>
+<span class="sourceLineNo">152</span>    public Set&lt;ServerName&gt; getDeadServers()<a name="line.152"></a>
 <span class="sourceLineNo">153</span>    {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      return m_metaLocation;<a name="line.154"></a>
+<span class="sourceLineNo">154</span>      return m_deadServers;<a name="line.154"></a>
 <span class="sourceLineNo">155</span>    }<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    private ServerName m_metaLocation;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    public boolean getMetaLocation__IsNotDefault()<a name="line.157"></a>
+<span class="sourceLineNo">156</span>    private Set&lt;ServerName&gt; m_deadServers;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    public boolean getDeadServers__IsNotDefault()<a name="line.157"></a>
 <span class="sourceLineNo">158</span>    {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      return m_metaLocation__IsNotDefault;<a name="line.159"></a>
+<span class="sourceLineNo">159</span>      return m_deadServers__IsNotDefault;<a name="line.159"></a>
 <span class="sourceLineNo">160</span>    }<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    private boolean m_metaLocation__IsNotDefault;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    // 29, 1<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public void setAssignmentManager(AssignmentManager assignmentManager)<a name="line.163"></a>
+<span class="sourceLineNo">161</span>    private boolean m_deadServers__IsNotDefault;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    // 27, 1<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void setFormat(String format)<a name="line.163"></a>
 <span class="sourceLineNo">164</span>    {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      // 29, 1<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      m_assignmentManager = assignmentManager;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      m_assignmentManager__IsNotDefault = true;<a name="line.167"></a>
+<span class="sourceLineNo">165</span>      // 27, 1<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      m_format = format;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      m_format__IsNotDefault = true;<a name="line.167"></a>
 <span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    public AssignmentManager getAssignmentManager()<a name="line.169"></a>
+<span class="sourceLineNo">169</span>    public String getFormat()<a name="line.169"></a>
 <span class="sourceLineNo">170</span>    {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      return m_assignmentManager;<a name="line.171"></a>
+<span class="sourceLineNo">171</span>      return m_format;<a name="line.171"></a>
 <span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private AssignmentManager m_assignmentManager;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    public boolean getAssignmentManager__IsNotDefault()<a name="line.174"></a>
+<span class="sourceLineNo">173</span>    private String m_format;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    public boolean getFormat__IsNotDefault()<a name="line.174"></a>
 <span class="sourceLineNo">175</span>    {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      return m_assignmentManager__IsNotDefault;<a name="line.176"></a>
+<span class="sourceLineNo">176</span>      return m_format__IsNotDefault;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    private boolean m_assignmentManager__IsNotDefault;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    // 25, 1<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    public void setCatalogJanitorEnabled(boolean catalogJanitorEnabled)<a name="line.180"></a>
+<span class="sourceLineNo">178</span>    private boolean m_format__IsNotDefault;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    // 23, 1<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    public void setServers(List&lt;ServerName&gt; servers)<a name="line.180"></a>
 <span class="sourceLineNo">181</span>    {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      // 25, 1<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      m_catalogJanitorEnabled = catalogJanitorEnabled;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      m_catalogJanitorEnabled__IsNotDefault = true;<a name="line.184"></a>
+<span class="sourceLineNo">182</span>      // 23, 1<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      m_servers = servers;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      m_servers__IsNotDefault = true;<a name="line.184"></a>
 <span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    public boolean getCatalogJanitorEnabled()<a name="line.186"></a>
+<span class="sourceLineNo">186</span>    public List&lt;ServerName&gt; getServers()<a name="line.186"></a>
 <span class="sourceLineNo">187</span>    {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      return m_catalogJanitorEnabled;<a name="line.188"></a>
+<span class="sourceLineNo">188</span>      return m_servers;<a name="line.188"></a>
 <span class="sourceLineNo">189</span>    }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    private boolean m_catalogJanitorEnabled;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    public boolean getCatalogJanitorEnabled__IsNotDefault()<a name="line.191"></a>
+<span class="sourceLineNo">190</span>    private List&lt;ServerName&gt; m_servers;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    public boolean getServers__IsNotDefault()<a name="line.191"></a>
 <span class="sourceLineNo">192</span>    {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      return m_catalogJanitorEnabled__IsNotDefault;<a name="line.193"></a>
+<span class="sourceLineNo">193</span>      return m_servers__IsNotDefault;<a name="line.193"></a>
 <span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    private boolean m_catalogJanitorEnabled__IsNotDefault;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    // 27, 1<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    public void setFormat(String format)<a name="line.197"></a>
+<span class="sourceLineNo">195</span>    private boolean m_servers__IsNotDefault;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    // 22, 1<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void setMetaLocation(ServerName metaLocation)<a name="line.197"></a>
 <span class="sourceLineNo">198</span>    {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      // 27, 1<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      m_format = format;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      m_format__IsNotDefault = true;<a name="line.201"></a>
+<span class="sourceLineNo">199</span>      // 22, 1<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      m_metaLocation = metaLocation;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      m_metaLocation__IsNotDefault = true;<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    }<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    public String getFormat()<a name="line.203"></a>
+<span class="sourceLineNo">203</span>    public ServerName getMetaLocation()<a name="line.203"></a>
 <span class="sourceLineNo">204</span>    {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      return m_format;<a name="line.205"></a>
+<span class="sourceLineNo">205</span>      return m_metaLocation;<a name="line.205"></a>
 <span class="sourceLineNo">206</span>    }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private String m_format;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    public boolean getFormat__IsNotDefault()<a name="line.208"></a>
+<span class="sourceLineNo">207</span>    private ServerName m_metaLocation;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    public boolean getMetaLocation__IsNotDefault()<a name="line.208"></a>
 <span class="sourceLineNo">209</span>    {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      return m_format__IsNotDefault;<a name="line.210"></a>
+<span class="sourceLineNo">210</span>      return m_metaLocation__IsNotDefault;<a name="line.210"></a>
 <span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    private boolean m_format__IsNotDefault;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    // 26, 1<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    public void setFilter(String filter)<a name="line.214"></a>
+<span class="sourceLineNo">212</span>    private boolean m_metaLocation__IsNotDefault;<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    // 21, 1<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    public void setFrags(Map&lt;String,Integer&gt; frags)<a name="line.214"></a>
 <span class="sourceLineNo">215</span>    {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      // 26, 1<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      m_filter = filter;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      m_filter__IsNotDefault = true;<a name="line.218"></a>
+<span class="sourceLineNo">216</span>      // 21, 1<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      m_frags = frags;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      m_frags__IsNotDefault = true;<a name="line.218"></a>
 <span class="sourceLineNo">219</span>    }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    public String getFilter()<a name="line.220"></a>
+<span class="sourceLineNo">220</span>    public Map&lt;String,Integer&gt; getFrags()<a name="line.220"></a>
 <span class="sourceLineNo">221</span>    {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      return m_filter;<a name="line.222"></a>
+<span class="sourceLineNo">222</span>      return m_frags;<a name="line.222"></a>
 <span class="sourceLineNo">223</span>    }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    private String m_filter;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    public boolean getFilter__IsNotDefault()<a name="line.225"></a>
+<span class="sourceLineNo">224</span>    private Map&lt;String,Integer&gt; m_frags;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public boolean getFrags__IsNotDefault()<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return m_filter__IsNotDefault;<a name="line.227"></a>
+<span class="sourceLineNo">227</span>      return m_frags__IsNotDefault;<a name="line.227"></a>
 <span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    private boolean m_filter__IsNotDefault;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    // 24, 1<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    public void setDeadServers(Set&lt;ServerName&gt; deadServers)<a name="line.231"></a>
+<span class="sourceLineNo">229</span>    private boolean m_frags__IsNotDefault;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    // 25, 1<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    public void setCatalogJanitorEnabled(boolean catalogJanitorEnabled)<a name="line.231"></a>
 <span class="sourceLineNo">232</span>    {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      // 24, 1<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      m_deadServers = deadServers;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      m_deadServers__IsNotDefault = true;<a name="line.235"></a>
+<span class="sourceLineNo">233</span>      // 25, 1<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      m_catalogJanitorEnabled = catalogJanitorEnabled;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      m_catalogJanitorEnabled__IsNotDefault = true;<a name="line.235"></a>
 <span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    public Set&lt;ServerName&gt; getDeadServers()<a name="line.237"></a>
+<span class="sourceLineNo">237</span>    public boolean getCatalogJanitorEnabled()<a name="line.237"></a>
 <span class="sourceLineNo">238</span>    {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return m_deadServers;<a name="line.239"></a>
+<span class="sourceLineNo">239</span>      return m_catalogJanitorEnabled;<a name="line.239"></a>
 <span class="sourceLineNo">240</span>    }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    private Set&lt;ServerName&gt; m_deadServers;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    public boolean getDeadServers__IsNotDefault()<a name="line.242"></a>
+<span class="sourceLineNo">241</span>    private boolean m_catalogJanitorEnabled;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    public boolean getCatalogJanitorEnabled__IsNotDefault()<a name="line.242"></a>
 <span class="sourceLineNo">243</span>    {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      return m_deadServers__IsNotDefault;<a name="line.244"></a>
+<span class="sourceLineNo">244</span>      return m_catalogJanitorEnabled__IsNotDefault;<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    private boolean m_deadServers__IsNotDefault;<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    // 23, 1<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    public void setServers(List&lt;ServerName&gt; servers)<a name="line.248"></a>
+<span class="sourceLineNo">246</span>    private boolean m_catalogJanitorEnabled__IsNotDefault;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // 26, 1<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    public void setFilter(String filter)<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      // 23, 1<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      m_servers = servers;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      m_servers__IsNotDefault = true;<a name="line.252"></a>
+<span class="sourceLineNo">250</span>      // 26, 1<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      m_filter = filter;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      m_filter__IsNotDefault = true;<a name="line.252"></a>
 <span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    public List&lt;ServerName&gt; getServers()<a name="line.254"></a>
+<span class="sourceLineNo">254</span>    public String getFilter()<a name="line.254"></a>
 <span class="sourceLineNo">255</span>    {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      return m_servers;<a name="line.256"></a>
+<span class="sourceLineNo">256</span>      return m_filter;<a name="line.256"></a>
 <span class="sourceLineNo">257</span>    }<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    private List&lt;ServerName&gt; m_servers;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    public boolean getServers__IsNotDefault()<a name="line.259"></a>
+<span class="sourceLineNo">258</span>    private String m_filter;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    public boolean getFilter__IsNotDefault()<a name="line.259"></a>
 <span class="sourceLineNo">260</span>    {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      return m_servers__IsNotDefault;<a name="line.261"></a>
+<span class="sourceLineNo">261</span>      return m_filter__IsNotDefault;<a name="line.261"></a>
 <span class="sourceLineNo">262</span>    }<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    private boolean m_servers__IsNotDefault;<a name="line.263"></a>
+<span class="sourceLineNo">263</span>    private boolean m_filter__IsNotDefault;<a name="line.263"></a>
 <span class="sourceLineNo">264</span>  }<a name="line.264"></a>
 <span class="sourceLineNo">265</span>  @Override<a name="line.265"></a>
 <span class="sourceLineNo">266</span>  protected org.jamon.AbstractTemplateProxy.ImplData makeImplData()<a name="line.266"></a>
@@ -280,66 +280,66 @@
 <span class="sourceLineNo">272</span>    return (ImplData) super.getImplData();<a name="line.272"></a>
 <span class="sourceLineNo">273</span>  }<a name="line.273"></a>
 <span class="sourceLineNo">274</span>  <a name="line.274"></a>
-<span class="sourceLineNo">275</span>  protected ServerManager serverManager;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServerManager(ServerManager p_serverManager)<a name="line.276"></a>
+<span class="sourceLineNo">275</span>  protected AssignmentManager assignmentManager;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setAssignmentManager(AssignmentManager p_assignmentManager)<a name="line.276"></a>
 <span class="sourceLineNo">277</span>  {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    (getImplData()).setServerManager(p_serverManager);<a name="line.278"></a>
+<span class="sourceLineNo">278</span>    (getImplData()).setAssignmentManager(p_assignmentManager);<a name="line.278"></a>
 <span class="sourceLineNo">279</span>    return this;<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>  protected Map&lt;String,Integer&gt; frags;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFrags(Map&lt;String,Integer&gt; p_frags)<a name="line.283"></a>
+<span class="sourceLineNo">282</span>  protected ServerManager serverManager;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServerManager(ServerManager p_serverManager)<a name="line.283"></a>
 <span class="sourceLineNo">284</span>  {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    (getImplData()).setFrags(p_frags);<a name="line.285"></a>
+<span class="sourceLineNo">285</span>    (getImplData()).setServerManager(p_serverManager);<a name="line.285"></a>
 <span class="sourceLineNo">286</span>    return this;<a name="line.286"></a>
 <span class="sourceLineNo">287</span>  }<a name="line.287"></a>
 <span class="sourceLineNo">288</span>  <a name="line.288"></a>
-<span class="sourceLineNo">289</span>  protected ServerName metaLocation;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setMetaLocation(ServerName p_metaLocation)<a name="line.290"></a>
+<span class="sourceLineNo">289</span>  protected Set&lt;ServerName&gt; deadServers;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setDeadServers(Set&lt;ServerName&gt; p_deadServers)<a name="line.290"></a>
 <span class="sourceLineNo">291</span>  {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    (getImplData()).setMetaLocation(p_metaLocation);<a name="line.292"></a>
+<span class="sourceLineNo">292</span>    (getImplData()).setDeadServers(p_deadServers);<a name="line.292"></a>
 <span class="sourceLineNo">293</span>    return this;<a name="line.293"></a>
 <span class="sourceLineNo">294</span>  }<a name="line.294"></a>
 <span class="sourceLineNo">295</span>  <a name="line.295"></a>
-<span class="sourceLineNo">296</span>  protected AssignmentManager assignmentManager;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setAssignmentManager(AssignmentManager p_assignmentManager)<a name="line.297"></a>
+<span class="sourceLineNo">296</span>  protected String format;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFormat(String p_format)<a name="line.297"></a>
 <span class="sourceLineNo">298</span>  {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    (getImplData()).setAssignmentManager(p_assignmentManager);<a name="line.299"></a>
+<span class="sourceLineNo">299</span>    (getImplData()).setFormat(p_format);<a name="line.299"></a>
 <span class="sourceLineNo">300</span>    return this;<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>  protected boolean catalogJanitorEnabled;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setCatalogJanitorEnabled(boolean p_catalogJanitorEnabled)<a name="line.304"></a>
+<span class="sourceLineNo">303</span>  protected List&lt;ServerName&gt; servers;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServers(List&lt;ServerName&gt; p_servers)<a name="line.304"></a>
 <span class="sourceLineNo">305</span>  {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    (getImplData()).setCatalogJanitorEnabled(p_catalogJanitorEnabled);<a name="line.306"></a>
+<span class="sourceLineNo">306</span>    (getImplData()).setServers(p_servers);<a name="line.306"></a>
 <span class="sourceLineNo">307</span>    return this;<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>  protected String format;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFormat(String p_format)<a name="line.311"></a>
+<span class="sourceLineNo">310</span>  protected ServerName metaLocation;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setMetaLocation(ServerName p_metaLocation)<a name="line.311"></a>
 <span class="sourceLineNo">312</span>  {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    (getImplData()).setFormat(p_format);<a name="line.313"></a>
+<span class="sourceLineNo">313</span>    (getImplData()).setMetaLocation(p_metaLocation);<a name="line.313"></a>
 <span class="sourceLineNo">314</span>    return this;<a name="line.314"></a>
 <span class="sourceLineNo">315</span>  }<a name="line.315"></a>
 <span class="sourceLineNo">316</span>  <a name="line.316"></a>
-<span class="sourceLineNo">317</span>  protected String filter;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFilter(String p_filter)<a name="line.318"></a>
+<span class="sourceLineNo">317</span>  protected Map&lt;String,Integer&gt; frags;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFrags(Map&lt;String,Integer&gt; p_frags)<a name="line.318"></a>
 <span class="sourceLineNo">319</span>  {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    (getImplData()).setFilter(p_filter);<a name="line.320"></a>
+<span class="sourceLineNo">320</span>    (getImplData()).setFrags(p_frags);<a name="line.320"></a>
 <span class="sourceLineNo">321</span>    return this;<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>  protected Set&lt;ServerName&gt; deadServers;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setDeadServers(Set&lt;ServerName&gt; p_deadServers)<a name="line.325"></a>
+<span class="sourceLineNo">324</span>  protected boolean catalogJanitorEnabled;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setCatalogJanitorEnabled(boolean p_catalogJanitorEnabled)<a name="line.325"></a>
 <span class="sourceLineNo">326</span>  {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    (getImplData()).setDeadServers(p_deadServers);<a name="line.327"></a>
+<span class="sourceLineNo">327</span>    (getImplData()).setCatalogJanitorEnabled(p_catalogJanitorEnabled);<a name="line.327"></a>
 <span class="sourceLineNo">328</span>    return this;<a name="line.328"></a>
 <span class="sourceLineNo">329</span>  }<a name="line.329"></a>
 <span class="sourceLineNo">330</span>  <a name="line.330"></a>
-<span class="sourceLineNo">331</span>  protected List&lt;ServerName&gt; servers;<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServers(List&lt;ServerName&gt; p_servers)<a name="line.332"></a>
+<span class="sourceLineNo">331</span>  protected String filter;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFilter(String p_filter)<a name="line.332"></a>
 <span class="sourceLineNo">333</span>  {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    (getImplData()).setServers(p_servers);<a name="line.334"></a>
+<span class="sourceLineNo">334</span>    (getImplData()).setFilter(p_filter);<a name="line.334"></a>
 <span class="sourceLineNo">335</span>    return this;<a name="line.335"></a>
 <span class="sourceLineNo">336</span>  }<a name="line.336"></a>
 <span class="sourceLineNo">337</span>  <a name="line.337"></a>


[12/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html
index d3abe39..c51826f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html
@@ -615,9 +615,9 @@
 <span class="sourceLineNo">607</span>            if (this.failOnError &amp;&amp; monitor.hasError()) {<a name="line.607"></a>
 <span class="sourceLineNo">608</span>              monitorThread.interrupt();<a name="line.608"></a>
 <span class="sourceLineNo">609</span>              if (monitor.initialized) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>                System.exit(monitor.errorCode);<a name="line.610"></a>
+<span class="sourceLineNo">610</span>                return monitor.errorCode;<a name="line.610"></a>
 <span class="sourceLineNo">611</span>              } else {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.612"></a>
+<span class="sourceLineNo">612</span>                return INIT_ERROR_EXIT_CODE;<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>            currentTimeLength = System.currentTimeMillis() - startTime;<a name="line.615"></a>
@@ -626,630 +626,629 @@
 <span class="sourceLineNo">618</span>                  + ") after timeout limit:" + this.timeout<a name="line.618"></a>
 <span class="sourceLineNo">619</span>                  + " will be killed itself !!");<a name="line.619"></a>
 <span class="sourceLineNo">620</span>              if (monitor.initialized) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>                System.exit(TIMEOUT_ERROR_EXIT_CODE);<a name="line.621"></a>
+<span class="sourceLineNo">621</span>                return TIMEOUT_ERROR_EXIT_CODE;<a name="line.621"></a>
 <span class="sourceLineNo">622</span>              } else {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.623"></a>
+<span class="sourceLineNo">623</span>                return INIT_ERROR_EXIT_CODE;<a name="line.623"></a>
 <span class="sourceLineNo">624</span>              }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>              break;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>            monitorThread.interrupt();<a name="line.630"></a>
-<span class="sourceLineNo">631</span>            System.exit(monitor.errorCode);<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } finally {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          if (monitor != null) monitor.close();<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>        Thread.sleep(interval);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      } while (interval &gt; 0);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    } // try-with-resources close<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    if (choreService != null) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      choreService.shutdown();<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    return(monitor.errorCode);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>  }<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private void printUsageAndExit() {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    System.err.printf(<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        getClass().getName());<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    System.err.println(" where [opts] are:");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    System.err.println("   -help          Show this help and exit.");<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    System.err.println("      which means to enable regionserver mode");<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    System.err.println("      only works in regionserver mode.");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        " default is true");<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        + " Default is hbase:canary");<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    System.err<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * A Factory method for {@link Monitor}.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   * Can be overridden by user.<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param index a start index for monitor target<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param args args passed from user<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a Monitor instance<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   */<a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    Monitor monitor = null;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    String[] monitorTargets = null;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    if(index &gt;= 0) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int length = args.length - index;<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      monitorTargets = new String[length];<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>    if (this.regionServerMode) {<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      monitor =<a name="line.691"></a>
-<span class="sourceLineNo">692</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.693"></a>
-<span class="sourceLineNo">694</span>              this.treatFailureAsError);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    } else {<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      monitor =<a name="line.696"></a>
-<span class="sourceLineNo">697</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    return monitor;<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>  // a Monitor super-class can be extended by users<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>    protected Connection connection;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    protected Admin admin;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    protected String[] targets;<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    protected boolean useRegExp;<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    protected boolean treatFailureAsError;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    protected boolean initialized = false;<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    protected boolean done = false;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected int errorCode = 0;<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    protected Sink sink;<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    protected ExecutorService executor;<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>    public boolean isDone() {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return done;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    public boolean hasError() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return errorCode != 0;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span><a name="line.725"></a>
-<span class="sourceLineNo">726</span>    public boolean finalCheckForErrors() {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      if (errorCode != 0) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>        return true;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      return treatFailureAsError &amp;&amp;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>    @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    public void close() throws IOException {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (this.admin != null) this.admin.close();<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span><a name="line.738"></a>
-<span class="sourceLineNo">739</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      this.connection = connection;<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      this.targets = monitorTargets;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      this.useRegExp = useRegExp;<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.sink = sink;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      this.executor = executor;<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>    @Override<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    public abstract void run();<a name="line.752"></a>
-<span class="sourceLineNo">753</span><a name="line.753"></a>
-<span class="sourceLineNo">754</span>    protected boolean initAdmin() {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      if (null == this.admin) {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        try {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>          this.admin = this.connection.getAdmin();<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        } catch (Exception e) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>        }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      } else if (admin.isAborted()) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>        LOG.error("HBaseAdmin aborted");<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      }<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return !this.hasError();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
-<span class="sourceLineNo">769</span><a name="line.769"></a>
-<span class="sourceLineNo">770</span>  // a monitor for region mode<a name="line.770"></a>
-<span class="sourceLineNo">771</span>  private static class RegionMonitor extends Monitor {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    // 10 minutes<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    // 1 days<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>    private long lastCheckTime = -1;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private boolean writeSniffing;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    private TableName writeTableName;<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    private int writeDataTTL;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private float regionsLowerLimit;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    private float regionsUpperLimit;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    private int checkPeriod;<a name="line.783"></a>
-<span class="sourceLineNo">784</span><a name="line.784"></a>
-<span class="sourceLineNo">785</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        boolean treatFailureAsError) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      Configuration conf = connection.getConfiguration();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      this.writeSniffing = writeSniffing;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      this.writeTableName = writeTableName;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      this.writeDataTTL =<a name="line.792"></a>
-<span class="sourceLineNo">793</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      this.regionsLowerLimit =<a name="line.794"></a>
-<span class="sourceLineNo">795</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      this.regionsUpperLimit =<a name="line.796"></a>
-<span class="sourceLineNo">797</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      this.checkPeriod =<a name="line.798"></a>
-<span class="sourceLineNo">799</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.799"></a>
-<span class="sourceLineNo">800</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>    @Override<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    public void run() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      if (this.initAdmin()) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        try {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.809"></a>
-<span class="sourceLineNo">810</span>            this.initialized = true;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>            for (String table : tables) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.812"></a>
-<span class="sourceLineNo">813</span>            }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          } else {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>          }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>          if (writeSniffing) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>              try {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                checkWriteTableDistribution();<a name="line.821"></a>
-<span class="sourceLineNo">822</span>              } catch (IOException e) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.823"></a>
-<span class="sourceLineNo">824</span>              }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>            }<a name="line.826"></a>
-<span class="sourceLineNo">827</span>            // sniff canary table with write operation<a name="line.827"></a>
-<span class="sourceLineNo">828</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.828"></a>
-<span class="sourceLineNo">829</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>          }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            try {<a name="line.833"></a>
-<span class="sourceLineNo">834</span>              future.get();<a name="line.834"></a>
-<span class="sourceLineNo">835</span>            } catch (ExecutionException e) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>              LOG.error("Sniff region failed!", e);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>            }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          }<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        } catch (Exception e) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>          LOG.error("Run regionMonitor failed", e);<a name="line.840"></a>
-<span class="sourceLineNo">841</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      this.done = true;<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      String[] returnTables = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span><a name="line.849"></a>
-<span class="sourceLineNo">850</span>      if (this.useRegExp) {<a name="line.850"></a>
-<span class="sourceLineNo">851</span>        Pattern pattern = null;<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        HTableDescriptor[] tds = null;<a name="line.852"></a>
-<span class="sourceLineNo">853</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        try {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>          if (LOG.isDebugEnabled()) {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>            LOG.debug(String.format("reading list of tables"));<a name="line.856"></a>
-<span class="sourceLineNo">857</span>          }<a name="line.857"></a>
-<span class="sourceLineNo">858</span>          tds = this.admin.listTables(pattern);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>          if (tds == null) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>            tds = new HTableDescriptor[0];<a name="line.860"></a>
-<span class="sourceLineNo">861</span>          }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>          for (String monitorTarget : monitorTargets) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>            pattern = Pattern.compile(monitorTarget);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>            for (HTableDescriptor td : tds) {<a name="line.864"></a>
-<span class="sourceLineNo">865</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>                tmpTables.add(td.getNameAsString());<a name="line.866"></a>
-<span class="sourceLineNo">867</span>              }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>            }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>          }<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        } catch (IOException e) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          LOG.error("Communicate with admin failed", e);<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          throw e;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>        if (tmpTables.size() &gt; 0) {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>        } else {<a name="line.877"></a>
-<span class="sourceLineNo">878</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          LOG.error(msg);<a name="line.879"></a>
-<span class="sourceLineNo">880</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>          throw new TableNotFoundException(msg);<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        }<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      } else {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>        returnTables = monitorTargets;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>      return returnTables;<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    }<a name="line.888"></a>
-<span class="sourceLineNo">889</span><a name="line.889"></a>
-<span class="sourceLineNo">890</span>    /*<a name="line.890"></a>
-<span class="sourceLineNo">891</span>     * canary entry point to monitor all the tables.<a name="line.891"></a>
-<span class="sourceLineNo">892</span>     */<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType) throws Exception {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      if (LOG.isDebugEnabled()) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        LOG.debug(String.format("reading list of tables"));<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.899"></a>
-<span class="sourceLineNo">900</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        }<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      return taskFutures;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      if (!admin.tableExists(writeTableName)) {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>        int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.909"></a>
-<span class="sourceLineNo">910</span>        if (numberOfServers == 0) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>          throw new IllegalStateException("No live regionservers");<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        }<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        createWriteTable(numberOfServers);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        admin.enableTable(writeTableName);<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      }<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>      int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      List&lt;Pair&lt;HRegionInfo, ServerName&gt;&gt; pairs =<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      int numberOfRegions = pairs.size();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        admin.disableTable(writeTableName);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        admin.deleteTable(writeTableName);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        createWriteTable(numberOfServers);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;ServerName&gt;();<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      for (Pair&lt;HRegionInfo, ServerName&gt; pair : pairs) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        serverSet.add(pair.getSecond());<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      int numberOfCoveredServers = serverSet.size();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        admin.balancer();<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    }<a name="line.938"></a>
-<span class="sourceLineNo">939</span><a name="line.939"></a>
-<span class="sourceLineNo">940</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          + " and you can change it by config: "<a name="line.945"></a>
-<span class="sourceLineNo">946</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      family.setMaxVersions(1);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      family.setTimeToLive(writeDataTTL);<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      desc.addFamily(family);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      admin.createTable(desc, splits);<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    }<a name="line.955"></a>
-<span class="sourceLineNo">956</span>  }<a name="line.956"></a>
-<span class="sourceLineNo">957</span><a name="line.957"></a>
-<span class="sourceLineNo">958</span>  /**<a name="line.958"></a>
-<span class="sourceLineNo">959</span>   * Canary entry point for specified table.<a name="line.959"></a>
-<span class="sourceLineNo">960</span>   * @throws Exception<a name="line.960"></a>
-<span class="sourceLineNo">961</span>   */<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static void sniff(final Admin admin, TableName tableName)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      throws Exception {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    sniff(admin, tableName, TaskType.READ);<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>  /**<a name="line.967"></a>
-<span class="sourceLineNo">968</span>   * Canary entry point for specified table with task type(read/write)<a name="line.968"></a>
-<span class="sourceLineNo">969</span>   * @throws Exception<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   */<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  public static void sniff(final Admin admin, TableName tableName, TaskType taskType)<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      throws Exception {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    List&lt;Future&lt;Void&gt;&gt; taskFutures =<a name="line.973"></a>
-<span class="sourceLineNo">974</span>        Canary.sniff(admin, new StdOutSink(), tableName.getNameAsString(),<a name="line.974"></a>
-<span class="sourceLineNo">975</span>          new ScheduledThreadPoolExecutor(1), taskType);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    for (Future&lt;Void&gt; future : taskFutures) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      future.get();<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><a name="line.980"></a>
-<span class="sourceLineNo">981</span>  /**<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   * Canary entry point for specified table.<a name="line.982"></a>
-<span class="sourceLineNo">983</span>   * @throws Exception<a name="line.983"></a>
-<span class="sourceLineNo">984</span>   */<a name="line.984"></a>
-<span class="sourceLineNo">985</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      ExecutorService executor, TaskType taskType) throws Exception {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    if (LOG.isDebugEnabled()) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        tableName));<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        executor, taskType);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    } else {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  /*<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>   * Loops over regions that owns this table, and output some information abouts the state.<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType) throws Exception {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span><a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    if (LOG.isDebugEnabled()) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>    Table table = null;<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    try {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    } catch (TableNotFoundException e) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      return new ArrayList&lt;Future&lt;Void&gt;&gt;();<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;RegionTask&gt;();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    try {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      for (HRegionInfo region : admin.getTableRegions(tableDesc.getTableName())) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        tasks.add(new RegionTask(admin.getConnection(), region, sink, taskType));<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    } finally {<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      table.close();<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    return executor.invokeAll(tasks);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>  // a monitor for regionserver mode<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  private static class RegionServerMonitor extends Monitor {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    private boolean allRegions;<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    public RegionServerMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        ExtendedSink sink, ExecutorService executor, boolean allRegions,<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        boolean treatFailureAsError) {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      this.allRegions = allRegions;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span><a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    private ExtendedSink getSink() {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      return (ExtendedSink) this.sink;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span><a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    @Override<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    public void run() {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      if (this.initAdmin() &amp;&amp; this.checkNoTableNames()) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = this.filterRegionServerByName();<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        this.initialized = true;<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>        this.monitorRegionServers(rsAndRMap);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      this.done = true;<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>    private boolean checkNoTableNames() {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      List&lt;String&gt; foundTableNames = new ArrayList&lt;String&gt;();<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>      TableName[] tableNames = null;<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      if (LOG.isDebugEnabled()) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      try {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>        tableNames = this.admin.listTableNames();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      } catch (IOException e) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        LOG.error("Get listTableNames failed", e);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        return false;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      if (this.targets == null || this.targets.length == 0) return true;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      for (String target : this.targets) {<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        for (TableName tableName : tableNames) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          if (target.equals(tableName.getNameAsString())) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>            foundTableNames.add(target);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (foundTableNames.size() &gt; 0) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        System.err.println("Cannot pass a tablename when using the -regionserver " +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>            "option, tablenames:" + foundTableNames.toString());<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        this.errorCode = USAGE_EXIT_CODE;<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      }<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      return foundTableNames.size() == 0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    }<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span><a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    private void monitorRegionServers(Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      List&lt;RegionServerTask&gt; tasks = new ArrayList&lt;RegionServerTask&gt;();<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      Map&lt;String, AtomicLong&gt; successMap = new HashMap&lt;String, AtomicLong&gt;();<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      Random rand = new Random();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        String serverName = entry.getKey();<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        AtomicLong successes = new AtomicLong(0);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        successMap.put(serverName, successes);<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        if (this.allRegions) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>          for (HRegionInfo region : entry.getValue()) {<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            tasks.add(new RegionServerTask(this.connection,<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>                serverName,<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>                region,<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>                getSink(),<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>                successes));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>          }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        } else {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>          // random select a region if flag not set<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>          HRegionInfo region = entry.getValue().get(rand.nextInt(entry.getValue().size()));<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>          tasks.add(new RegionServerTask(this.connection,<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>              serverName,<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>              region,<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>              getSink(),<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>              successes));<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>        }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      }<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>      try {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>          try {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>            future.get();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          } catch (ExecutionException e) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.error("Sniff regionserver failed!", e);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        if (this.allRegions) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>            String serverName = entry.getKey();<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            LOG.info("Successfully read " + successMap.get(serverName) + " regions out of "<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>                    + entry.getValue().size() + " on regionserver:" + serverName);<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      } catch (InterruptedException e) {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        LOG.error("Sniff regionserver interrupted!", e);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      }<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>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; filterRegionServerByName() {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; regionServerAndRegionsMap = this.getAllRegionServerByName();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      regionServerAndRegionsMap = this.doFilterRegionServerByName(regionServerAndRegionsMap);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>      return regionServerAndRegionsMap;<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; getAllRegionServerByName() {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      Table table = null;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      RegionLocator regionLocator = null;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      try {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        if (LOG.isDebugEnabled()) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          LOG.debug(String.format("reading list of tables and locations"));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        HTableDescriptor[] tableDescs = this.admin.listTables();<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        List&lt;HRegionInfo&gt; regions = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>        for (HTableDescriptor tableDesc : tableDescs) {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>          table = this.admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>          regionLocator = this.admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>          for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>            ServerName rs = location.getServerName();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>            String rsName = rs.getHostname();<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>            HRegionInfo r = location.getRegionInfo();<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>            if (rsAndRMap.containsKey(rsName)) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>              regions = rsAndRMap.get(rsName);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            } else {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>              regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>              rsAndRMap.put(rsName, regions);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>            regions.add(r);<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>          }<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>          table.close();<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span><a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      } catch (IOException e) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        String msg = "Get HTables info failed";<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        LOG.error(msg, e);<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>      } finally {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        if (table != null) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          try {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            table.close();<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          } catch (IOException e) {<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>            LOG.warn("Close table failed", e);<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>        }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>      }<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span><a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return rsAndRMap;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; doFilterRegionServerByName(<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; fullRsAndRMap) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; filteredRsAndRMap = null;<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span><a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        filteredRsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        Pattern pattern = null;<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        Matcher matcher = null;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        boolean regExpFound = false;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (String rsName : this.targets) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (this.useRegExp) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>            regExpFound = false;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>            pattern = Pattern.compile(rsName);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : fullRsAndRMap.entrySet()) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>              matcher = pattern.matcher(entry.getKey());<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>              if (matcher.matches()) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>                filteredRsAndRMap.put(entry.getKey(), entry.getValue());<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>                regExpFound = true;<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>            if (!regExpFound) {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>              LOG.info("No RegionServerInfo found, regionServerPattern:" + rsName);<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            if (fullRsAndRMap.containsKey(rsName)) {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>              filteredRsAndRMap.put(rsName, fullRsAndRMap.get(rsName));<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>            } else {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>              LOG.info("No RegionServerInfo found, regionServerName:" + rsName);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>            }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>          }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        }<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>        filteredRsAndRMap = fullRsAndRMap;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return filteredRsAndRMap;<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><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  public static void main(String[] args) throws Exception {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    final Configuration conf = HBaseConfiguration.create();<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span><a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // loading the generic options to conf<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    new GenericOptionsParser(conf, args);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    int numThreads = conf.getInt("hbase.canary.threads.num", MAX_THREADS_NUM);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    LOG.info("Number of exection threads " + numThreads);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span><a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(numThreads);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span><a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    Class&lt;? extends Sink&gt; sinkClass =<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        conf.getClass("hbase.canary.sink.class", RegionServerStdOutSink.class, Sink.class);<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>    Sink sink = ReflectionUtils.newInstance(sinkClass);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span><a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    int exitCode = ToolRunner.run(conf, new Canary(executor, sink), args);<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    executor.shutdown();<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    System.exit(exitCode);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>}<a name="line.1244"></a>
+<span class="sourceLineNo">625</span>            }<a name="line.625"></a>
+<span class="sourceLineNo">626</span>          }<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>            monitorThread.interrupt();<a name="line.629"></a>
+<span class="sourceLineNo">630</span>            return monitor.errorCode;<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        } finally {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>          if (monitor != null) monitor.close();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        }<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>        Thread.sleep(interval);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      } while (interval &gt; 0);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    } // try-with-resources close<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    if (choreService != null) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>      choreService.shutdown();<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    return monitor.errorCode;<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>  private void printUsageAndExit() {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    System.err.printf(<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        getClass().getName());<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    System.err.println(" where [opts] are:");<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.err.println("   -help          Show this help and exit.");<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    System.err.println("      which means to enable regionserver mode");<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    System.err.println("      only works in regionserver mode.");<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        " default is true");<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.665"></a>
+<span class="sourceLineNo">666</span>        + " Default is hbase:canary");<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    System.err<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    System.exit(USAGE_EXIT_CODE);<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>   * A Factory method for {@link Monitor}.<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * Can be overridden by user.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @param index a start index for monitor target<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   * @param args args passed from user<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   * @return a Monitor instance<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   */<a name="line.678"></a>
+<span class="sourceLineNo">679</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Monitor monitor = null;<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    String[] monitorTargets = null;<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>    if(index &gt;= 0) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      int length = args.length - index;<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      monitorTargets = new String[length];<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.regionServerMode) {<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      monitor =<a name="line.690"></a>
+<span class="sourceLineNo">691</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.691"></a>
+<span class="sourceLineNo">692</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.692"></a>
+<span class="sourceLineNo">693</span>              this.treatFailureAsError);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    } else {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      monitor =<a name="line.695"></a>
+<span class="sourceLineNo">696</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.696"></a>
+<span class="sourceLineNo">697</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return monitor;<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">702</span>  // a Monitor super-class can be extended by users<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    protected Connection connection;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    protected Admin admin;<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    protected String[] targets;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    protected boolean useRegExp;<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    protected boolean treatFailureAsError;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    protected boolean initialized = false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>    protected boolean done = false;<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    protected int errorCode = 0;<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    protected Sink sink;<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    protected ExecutorService executor;<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>    public boolean isDone() {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      return done;<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>    public boolean hasError() {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      return errorCode != 0;<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">724</span><a name="line.724"></a>
+<span class="sourceLineNo">725</span>    public boolean finalCheckForErrors() {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      if (errorCode != 0) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        return true;<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      return treatFailureAsError &amp;&amp;<a name="line.729"></a>
+<span class="sourceLineNo">730</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>    @Override<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    public void close() throws IOException {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (this.admin != null) this.admin.close();<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.738"></a>
+<span class="sourceLineNo">739</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.740"></a>
+<span class="sourceLineNo">741</span><a name="line.741"></a>
+<span class="sourceLineNo">742</span>      this.connection = connection;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      this.targets = monitorTargets;<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      this.useRegExp = useRegExp;<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      this.sink = sink;<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      this.executor = executor;<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>    @Override<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    public abstract void run();<a name="line.751"></a>
+<span class="sourceLineNo">752</span><a name="line.752"></a>
+<span class="sourceLineNo">753</span>    protected boolean initAdmin() {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>      if (null == this.admin) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        try {<a name="line.755"></a>
+<span class="sourceLineNo">756</span>          this.admin = this.connection.getAdmin();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        } catch (Exception e) {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.758"></a>
+<span class="sourceLineNo">759</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
+<span class="sourceLineNo">761</span>      } else if (admin.isAborted()) {<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        LOG.error("HBaseAdmin aborted");<a name="line.762"></a>
+<span class="sourceLineNo">763</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      return !this.hasError();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
+<span class="sourceLineNo">767</span>  }<a name="line.767"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>  // a monitor for region mode<a name="line.769"></a>
+<span class="sourceLineNo">770</span>  private static class RegionMonitor extends Monitor {<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    // 10 minutes<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    // 1 days<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    private long lastCheckTime = -1;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    private boolean writeSniffing;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    private TableName writeTableName;<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private int writeDataTTL;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    private float regionsLowerLimit;<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    private float regionsUpperLimit;<a name="line.781"></a>
+<span class="sourceLineNo">782</span>    private int checkPeriod;<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.784"></a>
+<span class="sourceLineNo">785</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.785"></a>
+<span class="sourceLineNo">786</span>        boolean treatFailureAsError) {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      Configuration conf = connection.getConfiguration();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      this.writeSniffing = writeSniffing;<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      this.writeTableName = writeTableName;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      this.writeDataTTL =<a name="line.791"></a>
+<span class="sourceLineNo">792</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.792"></a>
+<span class="sourceLineNo">793</span>      this.regionsLowerLimit =<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      this.regionsUpperLimit =<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.796"></a>
+<span class="sourceLineNo">797</span>      this.checkPeriod =<a name="line.797"></a>
+<span class="sourceLineNo">798</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.798"></a>
+<span class="sourceLineNo">799</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    @Override<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    public void run() {<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      if (this.initAdmin()) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>        try {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>            this.initialized = true;<a name="line.809"></a>
+<span class="sourceLineNo">810</span>            for (String table : tables) {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.811"></a>
+<span class="sourceLineNo">812</span>            }<a name="line.812"></a>
+<span class="sourceLineNo">813</span>          } else {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.814"></a>
+<span class="sourceLineNo">815</span>          }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>          if (writeSniffing) {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>              try {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>                checkWriteTableDistribution();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>              } catch (IOException e) {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>              }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.824"></a>
+<span class="sourceLineNo">825</span>            }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>            // sniff canary table with write operation<a name="line.826"></a>
+<span class="sourceLineNo">827</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.827"></a>
+<span class="sourceLineNo">828</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.828"></a>
+<span class="sourceLineNo">829</span>          }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>            try {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>              future.get();<a name="line.833"></a>
+<span class="sourceLineNo">834</span>            } catch (ExecutionException e) {<a name="line.834"></a>
+<span class="sourceLineNo">835</span>              LOG.error("Sniff region failed!", e);<a name="line.835"></a>
+<span class="sourceLineNo">836</span>            }<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        } catch (Exception e) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>          LOG.error("Run regionMonitor failed", e);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          this.errorCode = ERROR_EXIT_CODE;<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>      this.done = true;<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>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>      String[] returnTables = null;<a name="line.847"></a>
+<span class="sourceLineNo">848</span><a name="line.848"></a>
+<span class="sourceLineNo">849</span>      if (this.useRegExp) {<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        Pattern pattern = null;<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        HTableDescriptor[] tds = null;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        try {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          if (LOG.isDebugEnabled()) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>            LOG.debug(String.format("reading list of tables"));<a name="line.855"></a>
+<span class="sourceLineNo">856</span>          }<a name="line.856"></a>
+<span class="sourceLineNo">857</span>          tds = this.admin.listTables(pattern);<a name="line.857"></a>
+<span class="sourceLineNo">858</span>          if (tds == null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            tds = new HTableDescriptor[0];<a name="line.859"></a>
+<span class="sourceLineNo">860</span>          }<a name="line.860"></a>
+<span class="sourceLineNo">861</span>          for (String monitorTarget : monitorTargets) {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>            pattern = Pattern.compile(monitorTarget);<a name="line.862"></a>
+<span class="sourceLineNo">863</span>            for (HTableDescriptor td : tds) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>                tmpTables.add(td.getNameAsString());<a name="line.865"></a>
+<span class="sourceLineNo">866</span>              }<a name="line.866"></a>
+<span class="sourceLineNo">867</span>            }<a name="line.867"></a>
+<span class="sourceLineNo">868</span>          }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        } catch (IOException e) {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>          LOG.error("Communicate with admin failed", e);<a name="line.870"></a>
+<span class="sourceLineNo">871</span>          throw e;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>        if (tmpTables.size() &gt; 0) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>        } else {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          LOG.error(msg);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          throw new TableNotFoundException(msg);<a name="line.880"></a>
+<span class="sourceLineNo">881</span>        }<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      } else {<a name="line.882"></a>
+<span class="sourceLineNo">883</sp

<TRUNCATED>

[26/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html
index 4345bcc..a682fea 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html
@@ -54,402 +54,398 @@
 <span class="sourceLineNo">046</span> * &lt;p&gt;Cluster-wide load balancing will occur only when there are no regions in<a name="line.46"></a>
 <span class="sourceLineNo">047</span> * transition and according to a fixed period of a time using {@link #balanceCluster(Map)}.<a name="line.47"></a>
 <span class="sourceLineNo">048</span> *<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * &lt;p&gt;Inline region placement with {@link #immediateAssignment} can be used when<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * the Master needs to handle closed regions that it currently does not have<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * a destination set for.  This can happen during master failover.<a name="line.51"></a>
-<span class="sourceLineNo">052</span> *<a name="line.52"></a>
-<span class="sourceLineNo">053</span> * &lt;p&gt;On cluster startup, bulk assignment can be used to determine<a name="line.53"></a>
-<span class="sourceLineNo">054</span> * locations for all Regions in a cluster.<a name="line.54"></a>
-<span class="sourceLineNo">055</span> *<a name="line.55"></a>
-<span class="sourceLineNo">056</span> * &lt;p&gt;This classes produces plans for the <a name="line.56"></a>
-<span class="sourceLineNo">057</span> * {@link org.apache.hadoop.hbase.master.AssignmentManager} to execute.<a name="line.57"></a>
-<span class="sourceLineNo">058</span> */<a name="line.58"></a>
-<span class="sourceLineNo">059</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.59"></a>
-<span class="sourceLineNo">060</span>public class SimpleLoadBalancer extends BaseLoadBalancer {<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  private static final Log LOG = LogFactory.getLog(SimpleLoadBalancer.class);<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.62"></a>
+<span class="sourceLineNo">049</span> * &lt;p&gt;On cluster startup, bulk assignment can be used to determine<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * locations for all Regions in a cluster.<a name="line.50"></a>
+<span class="sourceLineNo">051</span> *<a name="line.51"></a>
+<span class="sourceLineNo">052</span> * &lt;p&gt;This classes produces plans for the<a name="line.52"></a>
+<span class="sourceLineNo">053</span> * {@link org.apache.hadoop.hbase.master.AssignmentManager} to execute.<a name="line.53"></a>
+<span class="sourceLineNo">054</span> */<a name="line.54"></a>
+<span class="sourceLineNo">055</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.CONFIG)<a name="line.55"></a>
+<span class="sourceLineNo">056</span>public class SimpleLoadBalancer extends BaseLoadBalancer {<a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static final Log LOG = LogFactory.getLog(SimpleLoadBalancer.class);<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  private static final Random RANDOM = new Random(System.currentTimeMillis());<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>  private RegionInfoComparator riComparator = new RegionInfoComparator();<a name="line.60"></a>
+<span class="sourceLineNo">061</span>  private RegionPlan.RegionPlanComparator rpComparator = new RegionPlan.RegionPlanComparator();<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
 <span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private RegionInfoComparator riComparator = new RegionInfoComparator();<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  private RegionPlan.RegionPlanComparator rpComparator = new RegionPlan.RegionPlanComparator();<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  /**<a name="line.68"></a>
-<span class="sourceLineNo">069</span>   * Stores additional per-server information about the regions added/removed<a name="line.69"></a>
-<span class="sourceLineNo">070</span>   * during the run of the balancing algorithm.<a name="line.70"></a>
-<span class="sourceLineNo">071</span>   *<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   * For servers that shed regions, we need to track which regions we have already<a name="line.72"></a>
-<span class="sourceLineNo">073</span>   * shed. &lt;b&gt;nextRegionForUnload&lt;/b&gt; contains the index in the list of regions on<a name="line.73"></a>
-<span class="sourceLineNo">074</span>   * the server that is the next to be shed.<a name="line.74"></a>
-<span class="sourceLineNo">075</span>   */<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  static class BalanceInfo {<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>    private final int nextRegionForUnload;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    private int numRegionsAdded;<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>    public BalanceInfo(int nextRegionForUnload, int numRegionsAdded) {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>      this.nextRegionForUnload = nextRegionForUnload;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      this.numRegionsAdded = numRegionsAdded;<a name="line.83"></a>
+<span class="sourceLineNo">064</span>  /**<a name="line.64"></a>
+<span class="sourceLineNo">065</span>   * Stores additional per-server information about the regions added/removed<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * during the run of the balancing algorithm.<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   *<a name="line.67"></a>
+<span class="sourceLineNo">068</span>   * For servers that shed regions, we need to track which regions we have already<a name="line.68"></a>
+<span class="sourceLineNo">069</span>   * shed. &lt;b&gt;nextRegionForUnload&lt;/b&gt; contains the index in the list of regions on<a name="line.69"></a>
+<span class="sourceLineNo">070</span>   * the server that is the next to be shed.<a name="line.70"></a>
+<span class="sourceLineNo">071</span>   */<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  static class BalanceInfo {<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>    private final int nextRegionForUnload;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    private int numRegionsAdded;<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>    public BalanceInfo(int nextRegionForUnload, int numRegionsAdded) {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>      this.nextRegionForUnload = nextRegionForUnload;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>      this.numRegionsAdded = numRegionsAdded;<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>
+<span class="sourceLineNo">082</span>    int getNextRegionForUnload() {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>      return nextRegionForUnload;<a name="line.83"></a>
 <span class="sourceLineNo">084</span>    }<a name="line.84"></a>
 <span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>    int getNextRegionForUnload() {<a name="line.86"></a>
-<span class="sourceLineNo">087</span>      return nextRegionForUnload;<a name="line.87"></a>
+<span class="sourceLineNo">086</span>    int getNumRegionsAdded() {<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      return numRegionsAdded;<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 getNumRegionsAdded() {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>      return numRegionsAdded;<a name="line.91"></a>
+<span class="sourceLineNo">090</span>    void setNumRegionsAdded(int numAdded) {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      this.numRegionsAdded = numAdded;<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">094</span>    void setNumRegionsAdded(int numAdded) {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      this.numRegionsAdded = numAdded;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    }<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  }<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>   * Generate a global load balancing plan according to the specified map of<a name="line.100"></a>
-<span class="sourceLineNo">101</span>   * server information to the most loaded regions of each server.<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   *<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   * The load balancing invariant is that all servers are within 1 region of the<a name="line.103"></a>
-<span class="sourceLineNo">104</span>   * average number of regions per server.  If the average is an integer number,<a name="line.104"></a>
-<span class="sourceLineNo">105</span>   * all servers will be balanced to the average.  Otherwise, all servers will<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * have either floor(average) or ceiling(average) regions.<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   *<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * HBASE-3609 Modeled regionsToMove using Guava's MinMaxPriorityQueue so that<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   *   we can fetch from both ends of the queue.<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   * At the beginning, we check whether there was empty region server<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   *   just discovered by Master. If so, we alternately choose new / old<a name="line.111"></a>
-<span class="sourceLineNo">112</span>   *   regions from head / tail of regionsToMove, respectively. This alternation<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   *   avoids clustering young regions on the newly discovered region server.<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   *   Otherwise, we choose new regions from head of regionsToMove.<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   *<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   * Another improvement from HBASE-3609 is that we assign regions from<a name="line.116"></a>
-<span class="sourceLineNo">117</span>   *   regionsToMove to underloaded servers in round-robin fashion.<a name="line.117"></a>
-<span class="sourceLineNo">118</span>   *   Previously one underloaded server would be filled before we move onto<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   *   the next underloaded server, leading to clustering of young regions.<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   *<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * Finally, we randomly shuffle underloaded servers so that they receive<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   *   offloaded regions relatively evenly across calls to balanceCluster().<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   *<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   * The algorithm is currently implemented as such:<a name="line.124"></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>   * Generate a global load balancing plan according to the specified map of<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   * server information to the most loaded regions of each server.<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   *<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   * The load balancing invariant is that all servers are within 1 region of the<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   * average number of regions per server.  If the average is an integer number,<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   * all servers will be balanced to the average.  Otherwise, all servers will<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   * have either floor(average) or ceiling(average) regions.<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   *<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   * HBASE-3609 Modeled regionsToMove using Guava's MinMaxPriorityQueue so that<a name="line.104"></a>
+<span class="sourceLineNo">105</span>   *   we can fetch from both ends of the queue.<a name="line.105"></a>
+<span class="sourceLineNo">106</span>   * At the beginning, we check whether there was empty region server<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   *   just discovered by Master. If so, we alternately choose new / old<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   *   regions from head / tail of regionsToMove, respectively. This alternation<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   *   avoids clustering young regions on the newly discovered region server.<a name="line.109"></a>
+<span class="sourceLineNo">110</span>   *   Otherwise, we choose new regions from head of regionsToMove.<a name="line.110"></a>
+<span class="sourceLineNo">111</span>   *<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   * Another improvement from HBASE-3609 is that we assign regions from<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   *   regionsToMove to underloaded servers in round-robin fashion.<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   *   Previously one underloaded server would be filled before we move onto<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   *   the next underloaded server, leading to clustering of young regions.<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   *<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   * Finally, we randomly shuffle underloaded servers so that they receive<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   *   offloaded regions relatively evenly across calls to balanceCluster().<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   *<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   * The algorithm is currently implemented as such:<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   *<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   * &lt;ol&gt;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>   * &lt;li&gt;Determine the two valid numbers of regions each server should have,<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   *     &lt;b&gt;MIN&lt;/b&gt;=floor(average) and &lt;b&gt;MAX&lt;/b&gt;=ceiling(average).<a name="line.124"></a>
 <span class="sourceLineNo">125</span>   *<a name="line.125"></a>
-<span class="sourceLineNo">126</span>   * &lt;ol&gt;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>   * &lt;li&gt;Determine the two valid numbers of regions each server should have,<a name="line.127"></a>
-<span class="sourceLineNo">128</span>   *     &lt;b&gt;MIN&lt;/b&gt;=floor(average) and &lt;b&gt;MAX&lt;/b&gt;=ceiling(average).<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   *<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * &lt;li&gt;Iterate down the most loaded servers, shedding regions from each so<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   *     each server hosts exactly &lt;b&gt;MAX&lt;/b&gt; regions.  Stop once you reach a<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   *     server that already has &amp;lt;= &lt;b&gt;MAX&lt;/b&gt; regions.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   *     &lt;p&gt;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   *     Order the regions to move from most recent to least.<a name="line.134"></a>
+<span class="sourceLineNo">126</span>   * &lt;li&gt;Iterate down the most loaded servers, shedding regions from each so<a name="line.126"></a>
+<span class="sourceLineNo">127</span>   *     each server hosts exactly &lt;b&gt;MAX&lt;/b&gt; regions.  Stop once you reach a<a name="line.127"></a>
+<span class="sourceLineNo">128</span>   *     server that already has &amp;lt;= &lt;b&gt;MAX&lt;/b&gt; regions.<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   *     &lt;p&gt;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   *     Order the regions to move from most recent to least.<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   *<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * &lt;li&gt;Iterate down the least loaded servers, assigning regions so each server<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   *     has exactly &lt;b&gt;MIN&lt;/b&gt; regions.  Stop once you reach a server that<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   *     already has &amp;gt;= &lt;b&gt;MIN&lt;/b&gt; regions.<a name="line.134"></a>
 <span class="sourceLineNo">135</span>   *<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * &lt;li&gt;Iterate down the least loaded servers, assigning regions so each server<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   *     has exactly &lt;b&gt;MIN&lt;/b&gt; regions.  Stop once you reach a server that<a name="line.137"></a>
-<span class="sourceLineNo">138</span>   *     already has &amp;gt;= &lt;b&gt;MIN&lt;/b&gt; regions.<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   *<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   *     Regions being assigned to underloaded servers are those that were shed<a name="line.140"></a>
-<span class="sourceLineNo">141</span>   *     in the previous step.  It is possible that there were not enough<a name="line.141"></a>
-<span class="sourceLineNo">142</span>   *     regions shed to fill each underloaded server to &lt;b&gt;MIN&lt;/b&gt;.  If so we<a name="line.142"></a>
-<span class="sourceLineNo">143</span>   *     end up with a number of regions required to do so, &lt;b&gt;neededRegions&lt;/b&gt;.<a name="line.143"></a>
+<span class="sourceLineNo">136</span>   *     Regions being assigned to underloaded servers are those that were shed<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   *     in the previous step.  It is possible that there were not enough<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   *     regions shed to fill each underloaded server to &lt;b&gt;MIN&lt;/b&gt;.  If so we<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   *     end up with a number of regions required to do so, &lt;b&gt;neededRegions&lt;/b&gt;.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   *<a name="line.140"></a>
+<span class="sourceLineNo">141</span>   *     It is also possible that we were able to fill each underloaded but ended<a name="line.141"></a>
+<span class="sourceLineNo">142</span>   *     up with regions that were unassigned from overloaded servers but that<a name="line.142"></a>
+<span class="sourceLineNo">143</span>   *     still do not have assignment.<a name="line.143"></a>
 <span class="sourceLineNo">144</span>   *<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   *     It is also possible that we were able to fill each underloaded but ended<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   *     up with regions that were unassigned from overloaded servers but that<a name="line.146"></a>
-<span class="sourceLineNo">147</span>   *     still do not have assignment.<a name="line.147"></a>
+<span class="sourceLineNo">145</span>   *     If neither of these conditions hold (no regions needed to fill the<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   *     underloaded servers, no regions leftover from overloaded servers),<a name="line.146"></a>
+<span class="sourceLineNo">147</span>   *     we are done and return.  Otherwise we handle these cases below.<a name="line.147"></a>
 <span class="sourceLineNo">148</span>   *<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   *     If neither of these conditions hold (no regions needed to fill the<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   *     underloaded servers, no regions leftover from overloaded servers),<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   *     we are done and return.  Otherwise we handle these cases below.<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   *<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * &lt;li&gt;If &lt;b&gt;neededRegions&lt;/b&gt; is non-zero (still have underloaded servers),<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   *     we iterate the most loaded servers again, shedding a single server from<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   *     each (this brings them from having &lt;b&gt;MAX&lt;/b&gt; regions to having<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   *     &lt;b&gt;MIN&lt;/b&gt; regions).<a name="line.156"></a>
+<span class="sourceLineNo">149</span>   * &lt;li&gt;If &lt;b&gt;neededRegions&lt;/b&gt; is non-zero (still have underloaded servers),<a name="line.149"></a>
+<span class="sourceLineNo">150</span>   *     we iterate the most loaded servers again, shedding a single server from<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   *     each (this brings them from having &lt;b&gt;MAX&lt;/b&gt; regions to having<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   *     &lt;b&gt;MIN&lt;/b&gt; regions).<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   *<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * &lt;li&gt;We now definitely have more regions that need assignment, either from<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   *     the previous step or from the original shedding from overloaded servers.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   *     Iterate the least loaded servers filling each to &lt;b&gt;MIN&lt;/b&gt;.<a name="line.156"></a>
 <span class="sourceLineNo">157</span>   *<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * &lt;li&gt;We now definitely have more regions that need assignment, either from<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   *     the previous step or from the original shedding from overloaded servers.<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   *     Iterate the least loaded servers filling each to &lt;b&gt;MIN&lt;/b&gt;.<a name="line.160"></a>
+<span class="sourceLineNo">158</span>   * &lt;li&gt;If we still have more regions that need assignment, again iterate the<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   *     least loaded servers, this time giving each one (filling them to<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   *     &lt;b&gt;MAX&lt;/b&gt;) until we run out.<a name="line.160"></a>
 <span class="sourceLineNo">161</span>   *<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * &lt;li&gt;If we still have more regions that need assignment, again iterate the<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   *     least loaded servers, this time giving each one (filling them to<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   *     &lt;b&gt;MAX&lt;/b&gt;) until we run out.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   *<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * &lt;li&gt;All servers will now either host &lt;b&gt;MIN&lt;/b&gt; or &lt;b&gt;MAX&lt;/b&gt; regions.<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   *<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   *     In addition, any server hosting &amp;gt;= &lt;b&gt;MAX&lt;/b&gt; regions is guaranteed<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   *     to end up with &lt;b&gt;MAX&lt;/b&gt; regions at the end of the balancing.  This<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   *     ensures the minimal number of regions possible are moved.<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * &lt;/ol&gt;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   *<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * TODO: We can at-most reassign the number of regions away from a particular<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   *       server to be how many they report as most loaded.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   *       Should we just keep all assignment in memory?  Any objections?<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   *       Does this mean we need HeapSize on HMaster?  Or just careful monitor?<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   *       (current thinking is we will hold all assignments in memory)<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   *<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   * @param clusterMap Map of regionservers and their load/region information to<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   *                   a list of their most loaded regions<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   * @return a list of regions to be moved, including source and destination,<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   *         or null if cluster is already balanced<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   */<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  @Override<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  public List&lt;RegionPlan&gt; balanceCluster(<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    List&lt;RegionPlan&gt; regionsToReturn = balanceMasterRegions(clusterMap);<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    if (regionsToReturn != null || clusterMap == null || clusterMap.size() &lt;= 1) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      return regionsToReturn;<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    if (masterServerName != null &amp;&amp; clusterMap.containsKey(masterServerName)) {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      if (clusterMap.size() &lt;= 2) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        return null;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      clusterMap = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(clusterMap);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      clusterMap.remove(masterServerName);<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    }<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>    long startTime = System.currentTimeMillis();<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span>    // construct a Cluster object with clusterMap and rest of the<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    // argument as defaults<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    Cluster c = new Cluster(clusterMap, null, this.regionFinder, this.rackManager);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    if (!this.needsBalance(c)) return null;<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>    ClusterLoadState cs = new ClusterLoadState(clusterMap);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    int numServers = cs.getNumServers();<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    int numRegions = cs.getNumRegions();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    float average = cs.getLoadAverage();<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    int max = (int)Math.ceil(average);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    int min = (int)average;<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>    // Using to check balance result.<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    StringBuilder strBalanceParam = new StringBuilder();<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    strBalanceParam.append("Balance parameter: numRegions=").append(numRegions)<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        .append(", numServers=").append(numServers).append(", max=").append(max)<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        .append(", min=").append(min);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    LOG.debug(strBalanceParam.toString());<a name="line.219"></a>
-<span class="sourceLineNo">220</span><a name="line.220"></a>
-<span class="sourceLineNo">221</span>    // Balance the cluster<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    // TODO: Look at data block locality or a more complex load to do this<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    MinMaxPriorityQueue&lt;RegionPlan&gt; regionsToMove =<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      MinMaxPriorityQueue.orderedBy(rpComparator).create();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    regionsToReturn = new ArrayList&lt;RegionPlan&gt;();<a name="line.225"></a>
-<span class="sourceLineNo">226</span><a name="line.226"></a>
-<span class="sourceLineNo">227</span>    // Walk down most loaded, pruning each to the max<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    int serversOverloaded = 0;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    // flag used to fetch regions from head and tail of list, alternately<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    boolean fetchFromTail = false;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    Map&lt;ServerName, BalanceInfo&gt; serverBalanceInfo =<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      new TreeMap&lt;ServerName, BalanceInfo&gt;();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server:<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        serversByLoad.descendingMap().entrySet()) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      ServerAndLoad sal = server.getKey();<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      int load = sal.getLoad();<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      if (load &lt;= max) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        serverBalanceInfo.put(sal.getServerName(), new BalanceInfo(0, 0));<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        break;<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      serversOverloaded++;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      List&lt;HRegionInfo&gt; regions = server.getValue();<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      int numToOffload = Math.min(load - max, regions.size());<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      // account for the out-of-band regions which were assigned to this server<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      // after some other region server crashed<a name="line.245"></a>
-<span class="sourceLineNo">246</span>      Collections.sort(regions, riComparator);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      int numTaken = 0;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      for (int i = 0; i &lt;= numToOffload; ) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>        HRegionInfo hri = regions.get(i); // fetch from head<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        if (fetchFromTail) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          hri = regions.get(regions.size() - 1 - i);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        i++;<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        // Don't rebalance special regions.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        if (shouldBeOnMaster(hri)<a name="line.255"></a>
-<span class="sourceLineNo">256</span>            &amp;&amp; masterServerName.equals(sal.getServerName())) continue;<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        regionsToMove.add(new RegionPlan(hri, sal.getServerName(), null));<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        numTaken++;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        if (numTaken &gt;= numToOffload) break;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      serverBalanceInfo.put(sal.getServerName(),<a name="line.261"></a>
-<span class="sourceLineNo">262</span>        new BalanceInfo(numToOffload, (-1)*numTaken));<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    int totalNumMoved = regionsToMove.size();<a name="line.264"></a>
+<span class="sourceLineNo">162</span>   * &lt;li&gt;All servers will now either host &lt;b&gt;MIN&lt;/b&gt; or &lt;b&gt;MAX&lt;/b&gt; regions.<a name="line.162"></a>
+<span class="sourceLineNo">163</span>   *<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   *     In addition, any server hosting &amp;gt;= &lt;b&gt;MAX&lt;/b&gt; regions is guaranteed<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   *     to end up with &lt;b&gt;MAX&lt;/b&gt; regions at the end of the balancing.  This<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   *     ensures the minimal number of regions possible are moved.<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * &lt;/ol&gt;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   *<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * TODO: We can at-most reassign the number of regions away from a particular<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   *       server to be how many they report as most loaded.<a name="line.170"></a>
+<span class="sourceLineNo">171</span>   *       Should we just keep all assignment in memory?  Any objections?<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   *       Does this mean we need HeapSize on HMaster?  Or just careful monitor?<a name="line.172"></a>
+<span class="sourceLineNo">173</span>   *       (current thinking is we will hold all assignments in memory)<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   *<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   * @param clusterMap Map of regionservers and their load/region information to<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   *                   a list of their most loaded regions<a name="line.176"></a>
+<span class="sourceLineNo">177</span>   * @return a list of regions to be moved, including source and destination,<a name="line.177"></a>
+<span class="sourceLineNo">178</span>   *         or null if cluster is already balanced<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   */<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  @Override<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  public List&lt;RegionPlan&gt; balanceCluster(<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterMap) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    List&lt;RegionPlan&gt; regionsToReturn = balanceMasterRegions(clusterMap);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    if (regionsToReturn != null || clusterMap == null || clusterMap.size() &lt;= 1) {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      return regionsToReturn;<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    if (masterServerName != null &amp;&amp; clusterMap.containsKey(masterServerName)) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      if (clusterMap.size() &lt;= 2) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        return null;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      clusterMap = new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;(clusterMap);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      clusterMap.remove(masterServerName);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    }<a name="line.193"></a>
+<span class="sourceLineNo">194</span><a name="line.194"></a>
+<span class="sourceLineNo">195</span>    long startTime = System.currentTimeMillis();<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>    // construct a Cluster object with clusterMap and rest of the<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    // argument as defaults<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    Cluster c = new Cluster(clusterMap, null, this.regionFinder, this.rackManager);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    if (!this.needsBalance(c)) return null;<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>    ClusterLoadState cs = new ClusterLoadState(clusterMap);<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    int numServers = cs.getNumServers();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    NavigableMap&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; serversByLoad = cs.getServersByLoad();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    int numRegions = cs.getNumRegions();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    float average = cs.getLoadAverage();<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    int max = (int)Math.ceil(average);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    int min = (int)average;<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>    // Using to check balance result.<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    StringBuilder strBalanceParam = new StringBuilder();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    strBalanceParam.append("Balance parameter: numRegions=").append(numRegions)<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        .append(", numServers=").append(numServers).append(", max=").append(max)<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        .append(", min=").append(min);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    LOG.debug(strBalanceParam.toString());<a name="line.215"></a>
+<span class="sourceLineNo">216</span><a name="line.216"></a>
+<span class="sourceLineNo">217</span>    // Balance the cluster<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    // TODO: Look at data block locality or a more complex load to do this<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    MinMaxPriorityQueue&lt;RegionPlan&gt; regionsToMove =<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      MinMaxPriorityQueue.orderedBy(rpComparator).create();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    regionsToReturn = new ArrayList&lt;RegionPlan&gt;();<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    // Walk down most loaded, pruning each to the max<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    int serversOverloaded = 0;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    // flag used to fetch regions from head and tail of list, alternately<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    boolean fetchFromTail = false;<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    Map&lt;ServerName, BalanceInfo&gt; serverBalanceInfo =<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      new TreeMap&lt;ServerName, BalanceInfo&gt;();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server:<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        serversByLoad.descendingMap().entrySet()) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      ServerAndLoad sal = server.getKey();<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      int load = sal.getLoad();<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      if (load &lt;= max) {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        serverBalanceInfo.put(sal.getServerName(), new BalanceInfo(0, 0));<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        break;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      serversOverloaded++;<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      List&lt;HRegionInfo&gt; regions = server.getValue();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      int numToOffload = Math.min(load - max, regions.size());<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      // account for the out-of-band regions which were assigned to this server<a name="line.240"></a>
+<span class="sourceLineNo">241</span>      // after some other region server crashed<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      Collections.sort(regions, riComparator);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      int numTaken = 0;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      for (int i = 0; i &lt;= numToOffload; ) {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        HRegionInfo hri = regions.get(i); // fetch from head<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        if (fetchFromTail) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          hri = regions.get(regions.size() - 1 - i);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        }<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        i++;<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        // Don't rebalance special regions.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        if (shouldBeOnMaster(hri)<a name="line.251"></a>
+<span class="sourceLineNo">252</span>            &amp;&amp; masterServerName.equals(sal.getServerName())) continue;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>        regionsToMove.add(new RegionPlan(hri, sal.getServerName(), null));<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        numTaken++;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>        if (numTaken &gt;= numToOffload) break;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      }<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      serverBalanceInfo.put(sal.getServerName(),<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        new BalanceInfo(numToOffload, (-1)*numTaken));<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    }<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    int totalNumMoved = regionsToMove.size();<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>    // Walk down least loaded, filling each to the min<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    int neededRegions = 0; // number of regions needed to bring all up to min<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    fetchFromTail = false;<a name="line.264"></a>
 <span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>    // Walk down least loaded, filling each to the min<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    int neededRegions = 0; // number of regions needed to bring all up to min<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    fetchFromTail = false;<a name="line.268"></a>
-<span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>    Map&lt;ServerName, Integer&gt; underloadedServers = new HashMap&lt;ServerName, Integer&gt;();<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    int maxToTake = numRegions - min;<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server:<a name="line.272"></a>
-<span class="sourceLineNo">273</span>        serversByLoad.entrySet()) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      if (maxToTake == 0) break; // no more to take<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      int load = server.getKey().getLoad();<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      if (load &gt;= min &amp;&amp; load &gt; 0) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        continue; // look for other servers which haven't reached min<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      int regionsToPut = min - load;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      if (regionsToPut == 0)<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        regionsToPut = 1;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      }<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      maxToTake -= regionsToPut;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      underloadedServers.put(server.getKey().getServerName(), regionsToPut);<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    // number of servers that get new regions<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    int serversUnderloaded = underloadedServers.size();<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    int incr = 1;<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    List&lt;ServerName&gt; sns =<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      Arrays.asList(underloadedServers.keySet().toArray(new ServerName[serversUnderloaded]));<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    Collections.shuffle(sns, RANDOM);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    while (regionsToMove.size() &gt; 0) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      int cnt = 0;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      int i = incr &gt; 0 ? 0 : underloadedServers.size()-1;<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      for (; i &gt;= 0 &amp;&amp; i &lt; underloadedServers.size(); i += incr) {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>        if (regionsToMove.isEmpty()) break;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        ServerName si = sns.get(i);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>        int numToTake = underloadedServers.get(si);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        if (numToTake == 0) continue;<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>        addRegionPlan(regionsToMove, fetchFromTail, si, regionsToReturn);<a name="line.302"></a>
-<span class="sourceLineNo">303</span><a name="line.303"></a>
-<span class="sourceLineNo">304</span>        underloadedServers.put(si, numToTake-1);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>        cnt++;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        BalanceInfo bi = serverBalanceInfo.get(si);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        if (bi == null) {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          bi = new BalanceInfo(0, 0);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>          serverBalanceInfo.put(si, bi);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>        }<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        bi.setNumRegionsAdded(bi.getNumRegionsAdded()+1);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      }<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      if (cnt == 0) break;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      // iterates underloadedServers in the other direction<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      incr = -incr;<a name="line.315"></a>
+<span class="sourceLineNo">266</span>    Map&lt;ServerName, Integer&gt; underloadedServers = new HashMap&lt;ServerName, Integer&gt;();<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    int maxToTake = numRegions - min;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server:<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        serversByLoad.entrySet()) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      if (maxToTake == 0) break; // no more to take<a name="line.270"></a>
+<span class="sourceLineNo">271</span>      int load = server.getKey().getLoad();<a name="line.271"></a>
+<span class="sourceLineNo">272</span>      if (load &gt;= min &amp;&amp; load &gt; 0) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>        continue; // look for other servers which haven't reached min<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      }<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      int regionsToPut = min - load;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>      if (regionsToPut == 0)<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        regionsToPut = 1;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      maxToTake -= regionsToPut;<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      underloadedServers.put(server.getKey().getServerName(), regionsToPut);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    // number of servers that get new regions<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    int serversUnderloaded = underloadedServers.size();<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    int incr = 1;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    List&lt;ServerName&gt; sns =<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      Arrays.asList(underloadedServers.keySet().toArray(new ServerName[serversUnderloaded]));<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    Collections.shuffle(sns, RANDOM);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    while (regionsToMove.size() &gt; 0) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      int cnt = 0;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      int i = incr &gt; 0 ? 0 : underloadedServers.size()-1;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      for (; i &gt;= 0 &amp;&amp; i &lt; underloadedServers.size(); i += incr) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        if (regionsToMove.isEmpty()) break;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        ServerName si = sns.get(i);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        int numToTake = underloadedServers.get(si);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        if (numToTake == 0) continue;<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>        addRegionPlan(regionsToMove, fetchFromTail, si, regionsToReturn);<a name="line.298"></a>
+<span class="sourceLineNo">299</span><a name="line.299"></a>
+<span class="sourceLineNo">300</span>        underloadedServers.put(si, numToTake-1);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        cnt++;<a name="line.301"></a>
+<span class="sourceLineNo">302</span>        BalanceInfo bi = serverBalanceInfo.get(si);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        if (bi == null) {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>          bi = new BalanceInfo(0, 0);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          serverBalanceInfo.put(si, bi);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        bi.setNumRegionsAdded(bi.getNumRegionsAdded()+1);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      if (cnt == 0) break;<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      // iterates underloadedServers in the other direction<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      incr = -incr;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    for (Integer i : underloadedServers.values()) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      // If we still want to take some, increment needed<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      neededRegions += i;<a name="line.315"></a>
 <span class="sourceLineNo">316</span>    }<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    for (Integer i : underloadedServers.values()) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      // If we still want to take some, increment needed<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      neededRegions += i;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>    // If none needed to fill all to min and none left to drain all to max,<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    // we are done<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    if (neededRegions == 0 &amp;&amp; regionsToMove.isEmpty()) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      long endTime = System.currentTimeMillis();<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      LOG.info("Calculated a load balance in " + (endTime-startTime) + "ms. " +<a name="line.326"></a>
-<span class="sourceLineNo">327</span>          "Moving " + totalNumMoved + " regions off of " +<a name="line.327"></a>
-<span class="sourceLineNo">328</span>          serversOverloaded + " overloaded servers onto " +<a name="line.328"></a>
-<span class="sourceLineNo">329</span>          serversUnderloaded + " less loaded servers");<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      return regionsToReturn;<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    }<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>    // Need to do a second pass.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    // Either more regions to assign out or servers that are still underloaded<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    // If we need more to fill min, grab one from each most loaded until enough<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    if (neededRegions != 0) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      // Walk down most loaded, grabbing one from each until we get enough<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server :<a name="line.339"></a>
-<span class="sourceLineNo">340</span>        serversByLoad.descendingMap().entrySet()) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>        BalanceInfo balanceInfo =<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          serverBalanceInfo.get(server.getKey().getServerName());<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        int idx =<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          balanceInfo == null ? 0 : balanceInfo.getNextRegionForUnload();<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        if (idx &gt;= server.getValue().size()) break;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        HRegionInfo region = server.getValue().get(idx);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        if (region.isMetaRegion()) continue; // Don't move meta regions.<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        regionsToMove.add(new RegionPlan(region, server.getKey().getServerName(), null));<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        totalNumMoved++;<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        if (--neededRegions == 0) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>          // No more regions needed, done shedding<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          break;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        }<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    }<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>    // Now we have a set of regions that must be all assigned out<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    // Assign each underloaded up to the min, then if leftovers, assign to max<a name="line.358"></a>
-<span class="sourceLineNo">359</span><a name="line.359"></a>
-<span class="sourceLineNo">360</span>    // Walk down least loaded, assigning to each to fill up to min<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server :<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        serversByLoad.entrySet()) {<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      int regionCount = server.getKey().getLoad();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      if (regionCount &gt;= min) break;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      BalanceInfo balanceInfo = serverBalanceInfo.get(server.getKey().getServerName());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      if(balanceInfo != null) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        regionCount += balanceInfo.getNumRegionsAdded();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      if(regionCount &gt;= min) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        continue;<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      int numToTake = min - regionCount;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      int numTaken = 0;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      while(numTaken &lt; numToTake &amp;&amp; 0 &lt; regionsToMove.size()) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        addRegionPlan(regionsToMove, fetchFromTail,<a name="line.375"></a>
-<span class="sourceLineNo">376</span>          server.getKey().getServerName(), regionsToReturn);<a name="line.376"></a>
-<span class="sourceLineNo">377</span>        numTaken++;<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>    // If we still have regions to dish out, assign underloaded to max<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    if (0 &lt; regionsToMove.size()) {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server :<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        serversByLoad.entrySet()) {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        int regionCount = server.getKey().getLoad();<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        BalanceInfo balanceInfo = serverBalanceInfo.get(server.getKey().getServerName());<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        if(balanceInfo != null) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>          regionCount += balanceInfo.getNumRegionsAdded();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        }<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        if(regionCount &gt;= max) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          break;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        }<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        addRegionPlan(regionsToMove, fetchFromTail,<a name="line.393"></a>
-<span class="sourceLineNo">394</span>          server.getKey().getServerName(), regionsToReturn);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        if (regionsToMove.isEmpty()) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          break;<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        }<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><a name="line.400"></a>
-<span class="sourceLineNo">401</span>    long endTime = System.currentTimeMillis();<a name="line.401"></a>
-<span class="sourceLineNo">402</span><a name="line.402"></a>
-<span class="sourceLineNo">403</span>    if (!regionsToMove.isEmpty() || neededRegions != 0) {<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      // Emit data so can diagnose how balancer went astray.<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      LOG.warn("regionsToMove=" + totalNumMoved +<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        ", numServers=" + numServers + ", serversOverloaded=" + serversOverloaded +<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        ", serversUnderloaded=" + serversUnderloaded);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      StringBuilder sb = new StringBuilder();<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; e: clusterMap.entrySet()) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        sb.append(e.getKey().toString());<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        sb.append(" ");<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        sb.append(e.getValue().size());<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      }<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      LOG.warn("Input " + sb.toString());<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>    // All done!<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    LOG.info("Done. Calculated a load balance in " + (endTime-startTime) + "ms. " +<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        "Moving " + totalNumMoved + " regions off of " +<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        serversOverloaded + " overloaded servers onto " +<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        serversUnderloaded + " less loaded servers");<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>    return regionsToReturn;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  }<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  /**<a name="line.427"></a>
-<span class="sourceLineNo">428</span>   * Add a region from the head or tail to the List of regions to return.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  private void addRegionPlan(final MinMaxPriorityQueue&lt;RegionPlan&gt; regionsToMove,<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      final boolean fetchFromTail, final ServerName sn, List&lt;RegionPlan&gt; regionsToReturn) {<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    RegionPlan rp = null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    if (!fetchFromTail) rp = regionsToMove.remove();<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    else rp = regionsToMove.removeLast();<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    rp.setDestination(sn);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    regionsToReturn.add(rp);<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>
-<span class="sourceLineNo">439</span>  @Override<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  public List&lt;RegionPlan&gt; balanceCluster(TableName tableName,<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterState) throws HBaseIOException {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    return balanceCluster(clusterState);<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">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>    // If none needed to fill all to min and none left to drain all to max,<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    // we are done<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    if (neededRegions == 0 &amp;&amp; regionsToMove.isEmpty()) {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      long endTime = System.currentTimeMillis();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      LOG.info("Calculated a load balance in " + (endTime-startTime) + "ms. " +<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          "Moving " + totalNumMoved + " regions off of " +<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          serversOverloaded + " overloaded servers onto " +<a name="line.324"></a>
+<span class="sourceLineNo">325</span>          serversUnderloaded + " less loaded servers");<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      return regionsToReturn;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
+<span class="sourceLineNo">328</span><a name="line.328"></a>
+<span class="sourceLineNo">329</span>    // Need to do a second pass.<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    // Either more regions to assign out or servers that are still underloaded<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    // If we need more to fill min, grab one from each most loaded until enough<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    if (neededRegions != 0) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      // Walk down most loaded, grabbing one from each until we get enough<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server :<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        serversByLoad.descendingMap().entrySet()) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        BalanceInfo balanceInfo =<a name="line.337"></a>
+<span class="sourceLineNo">338</span>          serverBalanceInfo.get(server.getKey().getServerName());<a name="line.338"></a>
+<span class="sourceLineNo">339</span>        int idx =<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          balanceInfo == null ? 0 : balanceInfo.getNextRegionForUnload();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        if (idx &gt;= server.getValue().size()) break;<a name="line.341"></a>
+<span class="sourceLineNo">342</span>        HRegionInfo region = server.getValue().get(idx);<a name="line.342"></a>
+<span class="sourceLineNo">343</span>        if (region.isMetaRegion()) continue; // Don't move meta regions.<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        regionsToMove.add(new RegionPlan(region, server.getKey().getServerName(), null));<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        totalNumMoved++;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>        if (--neededRegions == 0) {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>          // No more regions needed, done shedding<a name="line.347"></a>
+<span class="sourceLineNo">348</span>          break;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        }<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>    // Now we have a set of regions that must be all assigned out<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    // Assign each underloaded up to the min, then if leftovers, assign to max<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>    // Walk down least loaded, assigning to each to fill up to min<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server :<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        serversByLoad.entrySet()) {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      int regionCount = server.getKey().getLoad();<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      if (regionCount &gt;= min) break;<a name="line.360"></a>
+<span class="sourceLineNo">361</span>      BalanceInfo balanceInfo = serverBalanceInfo.get(server.getKey().getServerName());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      if(balanceInfo != null) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        regionCount += balanceInfo.getNumRegionsAdded();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      }<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      if(regionCount &gt;= min) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        continue;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      int numToTake = min - regionCount;<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      int numTaken = 0;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      while(numTaken &lt; numToTake &amp;&amp; 0 &lt; regionsToMove.size()) {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        addRegionPlan(regionsToMove, fetchFromTail,<a name="line.371"></a>
+<span class="sourceLineNo">372</span>          server.getKey().getServerName(), regionsToReturn);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        numTaken++;<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      }<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>    // If we still have regions to dish out, assign underloaded to max<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    if (0 &lt; regionsToMove.size()) {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      for (Map.Entry&lt;ServerAndLoad, List&lt;HRegionInfo&gt;&gt; server :<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        serversByLoad.entrySet()) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>        int regionCount = server.getKey().getLoad();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>        BalanceInfo balanceInfo = serverBalanceInfo.get(server.getKey().getServerName());<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        if(balanceInfo != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          regionCount += balanceInfo.getNumRegionsAdded();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        }<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        if(regionCount &gt;= max) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          break;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>        addRegionPlan(regionsToMove, fetchFromTail,<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          server.getKey().getServerName(), regionsToReturn);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        if (regionsToMove.isEmpty()) {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          break;<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        }<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      }<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>    long endTime = System.currentTimeMillis();<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>    if (!regionsToMove.isEmpty() || neededRegions != 0) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      // Emit data so can diagnose how balancer went astray.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      LOG.warn("regionsToMove=" + totalNumMoved +<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        ", numServers=" + numServers + ", serversOverloaded=" + serversOverloaded +<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        ", serversUnderloaded=" + serversUnderloaded);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      StringBuilder sb = new StringBuilder();<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      for (Map.Entry&lt;ServerName, List&lt;HRegionInfo&gt;&gt; e: clusterMap.entrySet()) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        sb.append(e.getKey().toString());<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        sb.append(" ");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        sb.append(e.getValue().size());<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      LOG.warn("Input " + sb.toString());<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    // All done!<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    LOG.info("Done. Calculated a load balance in " + (endTime-startTime) + "ms. " +<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        "Moving " + totalNumMoved + " regions off of " +<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        serversOverloaded + " overloaded servers onto " +<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        serversUnderloaded + " less loaded servers");<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return regionsToReturn;<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>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * Add a region from the head or tail to the List of regions to return.<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  private void addRegionPlan(final MinMaxPriorityQueue&lt;RegionPlan&gt; regionsToMove,<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      final boolean fetchFromTail, final ServerName sn, List&lt;RegionPlan&gt; regionsToReturn) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    RegionPlan rp = null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    if (!fetchFromTail) rp = regionsToMove.remove();<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    else rp = regionsToMove.removeLast();<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    rp.setDestination(sn);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    regionsToReturn.add(rp);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  }<a name="line.433"></a>
+<span class="sourceLineNo">434</span><a name="line.434"></a>
+<span class="sourceLineNo">435</span>  @Override<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  public List&lt;RegionPlan&gt; balanceCluster(TableName tableName,<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; clusterState) throws HBaseIOException {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    return balanceCluster(clusterState);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
+<span class="sourceLineNo">440</span>}<a name="line.440"></a>
 
 
 


[38/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
index 556565c..248e48c 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html
@@ -108,7 +108,7 @@
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1027">Canary.RegionServerMonitor</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1026">Canary.RegionServerMonitor</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a></pre>
 </li>
 </ul>
@@ -240,7 +240,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>allRegions</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1029">allRegions</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1028">allRegions</a></pre>
 </li>
 </ul>
 </li>
@@ -257,7 +257,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Canary.RegionServerMonitor</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1031">Canary.RegionServerMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1030">Canary.RegionServerMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                           <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;monitorTargets,
                           boolean&nbsp;useRegExp,
                           <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.ExtendedSink</a>&nbsp;sink,
@@ -280,7 +280,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getSink</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.ExtendedSink</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1038">getSink</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.ExtendedSink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.ExtendedSink</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1037">getSink</a>()</pre>
 </li>
 </ul>
 <a name="run()">
@@ -289,7 +289,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1043">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1042">run</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true#run()" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>
@@ -304,7 +304,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkNoTableNames</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1052">checkNoTableNames</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1051">checkNoTableNames</a>()</pre>
 </li>
 </ul>
 <a name="monitorRegionServers(java.util.Map)">
@@ -313,7 +313,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>monitorRegionServers</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1085">monitorRegionServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;rsAndRMap)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1084">monitorRegionServers</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;rsAndRMap)</pre>
 </li>
 </ul>
 <a name="filterRegionServerByName()">
@@ -322,7 +322,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>filterRegionServerByName</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1133">filterRegionServerByName</a>()</pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1132">filterRegionServerByName</a>()</pre>
 </li>
 </ul>
 <a name="getAllRegionServerByName()">
@@ -331,7 +331,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getAllRegionServerByName</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1139">getAllRegionServerByName</a>()</pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1138">getAllRegionServerByName</a>()</pre>
 </li>
 </ul>
 <a name="doFilterRegionServerByName(java.util.Map)">
@@ -340,7 +340,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>doFilterRegionServerByName</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1186">doFilterRegionServerByName</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="
 http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;fullRsAndRMap)</pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.RegionServerMonitor.html#line.1185">doFilterRegionServerByName</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="
 http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;fullRsAndRMap)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/tool/Canary.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/Canary.html b/devapidocs/org/apache/hadoop/hbase/tool/Canary.html
index cb21083..28f082a 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/Canary.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/Canary.html
@@ -693,7 +693,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsageAndExit</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.647">printUsageAndExit</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.646">printUsageAndExit</a>()</pre>
 </li>
 </ul>
 <a name="newMonitor(org.apache.hadoop.hbase.client.Connection, int, java.lang.String[])">
@@ -702,7 +702,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>newMonitor</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.680">newMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool">Canary.Monitor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.679">newMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Connection.html" title="interface in org.apache.hadoop.hbase.client">Connection</a>&nbsp;connection,
                         int&nbsp;index,
                         <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</pre>
 <div class="block">A Factory method for <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Monitor.html" title="class in org.apache.hadoop.hbase.tool"><code>Canary.Monitor</code></a>.
@@ -717,7 +717,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>sniff</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.962">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.961">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
          <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
                   throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Canary entry point for specified table.</div>
@@ -731,7 +731,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>sniff</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.971">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.970">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
          <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/tool/Canary.RegionTask.TaskType.html" title="enum in org.apache.hadoop.hbase.tool">Canary.RegionTask.TaskType</a>&nbsp;taskType)
                   throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
@@ -746,7 +746,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>sniff</h4>
-<pre>private static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.985">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
+<pre>private static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.984">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
                        <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
                        <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName,
                        <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
@@ -763,7 +763,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>sniff</h4>
-<pre>private static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1003">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
+<pre>private static&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html?is-external=true" title="class or interface in java.util.concurrent">Future</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1002">sniff</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a>&nbsp;admin,
                        <a href="../../../../../org/apache/hadoop/hbase/tool/Canary.Sink.html" title="interface in org.apache.hadoop.hbase.tool">Canary.Sink</a>&nbsp;sink,
                        <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;tableDesc,
                        <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a>&nbsp;executor,
@@ -779,7 +779,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>main</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1225">main</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/tool/Canary.html#line.1224">main</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                  throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd></dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index c529262..13d300e 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -461,9 +461,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">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/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">ChecksumType</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="strong">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="strong">ChecksumType</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="strong">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/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></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="strong">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="strong">Order</span></a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index 515651f..f00a837 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -148,9 +148,9 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.Version.html" title="enum in org.apache.hadoop.hbase.wal"><span class="strong">WALKey.Version</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html" title="enum in org.apache.hadoop.hbase.wal"><span class="strong">RegionGroupingProvider.Strategies</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal"><span class="strong">WALFactory.Providers</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.Version.html" title="enum in org.apache.hadoop.hbase.wal"><span class="strong">WALKey.Version</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/client/ClusterConnection.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/ClusterConnection.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/ClusterConnection.html
index d77598a..1670cae 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/ClusterConnection.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/ClusterConnection.html
@@ -311,7 +311,12 @@
 <span class="sourceLineNo">303</span>   */<a name="line.303"></a>
 <span class="sourceLineNo">304</span>  public MetricsConnection getConnectionMetrics();<a name="line.304"></a>
 <span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>}<a name="line.306"></a>
+<span class="sourceLineNo">306</span>  /**<a name="line.306"></a>
+<span class="sourceLineNo">307</span>   * @return true when this connection uses a {@link org.apache.hadoop.hbase.codec.Codec} and so<a name="line.307"></a>
+<span class="sourceLineNo">308</span>   *         supports cell blocks.<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   */<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  boolean hasCellBlockSupport();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>}<a name="line.311"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.MasterServiceState.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.MasterServiceState.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.MasterServiceState.html
index 16f504e..00013eb 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.MasterServiceState.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.MasterServiceState.html
@@ -2263,7 +2263,12 @@
 <span class="sourceLineNo">2255</span>    return RpcRetryingCallerFactory<a name="line.2255"></a>
 <span class="sourceLineNo">2256</span>        .instantiate(conf, this.interceptor, this.getStatisticsTracker());<a name="line.2256"></a>
 <span class="sourceLineNo">2257</span>  }<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>}<a name="line.2258"></a>
+<span class="sourceLineNo">2258</span><a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>  @Override<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>  public boolean hasCellBlockSupport() {<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>    return this.rpcClient.hasCellBlockSupport();<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>  }<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>}<a name="line.2263"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.MasterServiceStubMaker.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.MasterServiceStubMaker.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.MasterServiceStubMaker.html
index 16f504e..00013eb 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.MasterServiceStubMaker.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.MasterServiceStubMaker.html
@@ -2263,7 +2263,12 @@
 <span class="sourceLineNo">2255</span>    return RpcRetryingCallerFactory<a name="line.2255"></a>
 <span class="sourceLineNo">2256</span>        .instantiate(conf, this.interceptor, this.getStatisticsTracker());<a name="line.2256"></a>
 <span class="sourceLineNo">2257</span>  }<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>}<a name="line.2258"></a>
+<span class="sourceLineNo">2258</span><a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>  @Override<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>  public boolean hasCellBlockSupport() {<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>    return this.rpcClient.hasCellBlockSupport();<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>  }<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>}<a name="line.2263"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.NoNonceGenerator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.NoNonceGenerator.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.NoNonceGenerator.html
index 16f504e..00013eb 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.NoNonceGenerator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.NoNonceGenerator.html
@@ -2263,7 +2263,12 @@
 <span class="sourceLineNo">2255</span>    return RpcRetryingCallerFactory<a name="line.2255"></a>
 <span class="sourceLineNo">2256</span>        .instantiate(conf, this.interceptor, this.getStatisticsTracker());<a name="line.2256"></a>
 <span class="sourceLineNo">2257</span>  }<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>}<a name="line.2258"></a>
+<span class="sourceLineNo">2258</span><a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>  @Override<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>  public boolean hasCellBlockSupport() {<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>    return this.rpcClient.hasCellBlockSupport();<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>  }<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>}<a name="line.2263"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.ServerErrorTracker.ServerErrors.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.ServerErrorTracker.ServerErrors.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.ServerErrorTracker.ServerErrors.html
index 16f504e..00013eb 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.ServerErrorTracker.ServerErrors.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.ServerErrorTracker.ServerErrors.html
@@ -2263,7 +2263,12 @@
 <span class="sourceLineNo">2255</span>    return RpcRetryingCallerFactory<a name="line.2255"></a>
 <span class="sourceLineNo">2256</span>        .instantiate(conf, this.interceptor, this.getStatisticsTracker());<a name="line.2256"></a>
 <span class="sourceLineNo">2257</span>  }<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>}<a name="line.2258"></a>
+<span class="sourceLineNo">2258</span><a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>  @Override<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>  public boolean hasCellBlockSupport() {<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>    return this.rpcClient.hasCellBlockSupport();<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>  }<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>}<a name="line.2263"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.ServerErrorTracker.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.ServerErrorTracker.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.ServerErrorTracker.html
index 16f504e..00013eb 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.ServerErrorTracker.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.ServerErrorTracker.html
@@ -2263,7 +2263,12 @@
 <span class="sourceLineNo">2255</span>    return RpcRetryingCallerFactory<a name="line.2255"></a>
 <span class="sourceLineNo">2256</span>        .instantiate(conf, this.interceptor, this.getStatisticsTracker());<a name="line.2256"></a>
 <span class="sourceLineNo">2257</span>  }<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>}<a name="line.2258"></a>
+<span class="sourceLineNo">2258</span><a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>  @Override<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>  public boolean hasCellBlockSupport() {<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>    return this.rpcClient.hasCellBlockSupport();<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>  }<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>}<a name="line.2263"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.StubMaker.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.StubMaker.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.StubMaker.html
index 16f504e..00013eb 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.StubMaker.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.StubMaker.html
@@ -2263,7 +2263,12 @@
 <span class="sourceLineNo">2255</span>    return RpcRetryingCallerFactory<a name="line.2255"></a>
 <span class="sourceLineNo">2256</span>        .instantiate(conf, this.interceptor, this.getStatisticsTracker());<a name="line.2256"></a>
 <span class="sourceLineNo">2257</span>  }<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>}<a name="line.2258"></a>
+<span class="sourceLineNo">2258</span><a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>  @Override<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>  public boolean hasCellBlockSupport() {<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>    return this.rpcClient.hasCellBlockSupport();<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>  }<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>}<a name="line.2263"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.html
index 16f504e..00013eb 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/ConnectionImplementation.html
@@ -2263,7 +2263,12 @@
 <span class="sourceLineNo">2255</span>    return RpcRetryingCallerFactory<a name="line.2255"></a>
 <span class="sourceLineNo">2256</span>        .instantiate(conf, this.interceptor, this.getStatisticsTracker());<a name="line.2256"></a>
 <span class="sourceLineNo">2257</span>  }<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>}<a name="line.2258"></a>
+<span class="sourceLineNo">2258</span><a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>  @Override<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>  public boolean hasCellBlockSupport() {<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>    return this.rpcClient.hasCellBlockSupport();<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>  }<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>}<a name="line.2263"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html
index 6c830ef..ef58399 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/MultiServerCallable.html
@@ -30,154 +30,150 @@
 <span class="sourceLineNo">022</span>import java.util.List;<a name="line.22"></a>
 <span class="sourceLineNo">023</span>import java.util.Map;<a name="line.23"></a>
 <span class="sourceLineNo">024</span><a name="line.24"></a>
-<span class="sourceLineNo">025</span>import org.apache.hadoop.conf.Configuration;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.CellScannable;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.HConstants;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.ServerName;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.TableName;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.ipc.PayloadCarryingRpcController;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.ipc.RpcControllerFactory;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.protobuf.RequestConverter;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.protobuf.ResponseConverter;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MultiRequest;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutationProto;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.RegionAction;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos;<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>import com.google.common.annotations.VisibleForTesting;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import com.google.protobuf.ServiceException;<a name="line.46"></a>
-<span class="sourceLineNo">047</span><a name="line.47"></a>
-<span class="sourceLineNo">048</span>/**<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * Callable that handles the &lt;code&gt;multi&lt;/code&gt; method call going against a single<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * regionserver; i.e. A {@link RegionServerCallable} for the multi call (It is not a<a name="line.50"></a>
-<span class="sourceLineNo">051</span> * {@link RegionServerCallable} that goes against multiple regions.<a name="line.51"></a>
-<span class="sourceLineNo">052</span> * @param &lt;R&gt;<a name="line.52"></a>
-<span class="sourceLineNo">053</span> */<a name="line.53"></a>
-<span class="sourceLineNo">054</span>class MultiServerCallable&lt;R&gt; extends RegionServerCallable&lt;MultiResponse&gt; implements Cancellable {<a name="line.54"></a>
-<span class="sourceLineNo">055</span>  private final MultiAction&lt;R&gt; multiAction;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private final boolean cellBlock;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>  private final PayloadCarryingRpcController controller;<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>  MultiServerCallable(final ClusterConnection connection, final TableName tableName,<a name="line.59"></a>
-<span class="sourceLineNo">060</span>      final ServerName location, RpcControllerFactory rpcFactory, final MultiAction&lt;R&gt; multi) {<a name="line.60"></a>
-<span class="sourceLineNo">061</span>    super(connection, tableName, null);<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    this.multiAction = multi;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    // RegionServerCallable has HRegionLocation field, but this is a multi-region request.<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    // Using region info from parent HRegionLocation would be a mistake for this class; so<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    // we will store the server here, and throw if someone tries to obtain location/regioninfo.<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    this.location = new HRegionLocation(null, location);<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    this.cellBlock = isCellBlock();<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    controller = rpcFactory.newController();<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  }<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>  @Override<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  protected HRegionLocation getLocation() {<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    throw new RuntimeException("Cannot get region location for multi-region request");<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  }<a name="line.74"></a>
-<span class="sourceLineNo">075</span><a name="line.75"></a>
-<span class="sourceLineNo">076</span>  @Override<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  public HRegionInfo getHRegionInfo() {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    throw new RuntimeException("Cannot get region info for multi-region request");<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>  MultiAction&lt;R&gt; getMulti() {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    return this.multiAction;<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>  @Override<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  public MultiResponse call(int callTimeout) throws IOException {<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    int countOfActions = this.multiAction.size();<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    if (countOfActions &lt;= 0) throw new DoNotRetryIOException("No Actions");<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    MultiRequest.Builder multiRequestBuilder = MultiRequest.newBuilder();<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    RegionAction.Builder regionActionBuilder = RegionAction.newBuilder();<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    ClientProtos.Action.Builder actionBuilder = ClientProtos.Action.newBuilder();<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    MutationProto.Builder mutationBuilder = MutationProto.newBuilder();<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    List&lt;CellScannable&gt; cells = null;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    // The multi object is a list of Actions by region.  Iterate by region.<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    long nonceGroup = multiAction.getNonceGroup();<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    if (nonceGroup != HConstants.NO_NONCE) {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      multiRequestBuilder.setNonceGroup(nonceGroup);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    }<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    for (Map.Entry&lt;byte[], List&lt;Action&lt;R&gt;&gt;&gt; e: this.multiAction.actions.entrySet()) {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      final byte [] regionName = e.getKey();<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      final List&lt;Action&lt;R&gt;&gt; actions = e.getValue();<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      regionActionBuilder.clear();<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      regionActionBuilder.setRegion(RequestConverter.buildRegionSpecifier(<a name="line.103"></a>
-<span class="sourceLineNo">104</span>          HBaseProtos.RegionSpecifier.RegionSpecifierType.REGION_NAME, regionName));<a name="line.104"></a>
+<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.CellScannable;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.HConstants;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.ServerName;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.TableName;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.ipc.PayloadCarryingRpcController;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.ipc.RpcControllerFactory;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.protobuf.RequestConverter;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.protobuf.ResponseConverter;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MultiRequest;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutationProto;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.RegionAction;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos;<a name="line.42"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>import com.google.common.annotations.VisibleForTesting;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import com.google.protobuf.ServiceException;<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> * Callable that handles the &lt;code&gt;multi&lt;/code&gt; method call going against a single<a name="line.48"></a>
+<span class="sourceLineNo">049</span> * regionserver; i.e. A {@link RegionServerCallable} for the multi call (It is not a<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * {@link RegionServerCallable} that goes against multiple regions.<a name="line.50"></a>
+<span class="sourceLineNo">051</span> * @param &lt;R&gt;<a name="line.51"></a>
+<span class="sourceLineNo">052</span> */<a name="line.52"></a>
+<span class="sourceLineNo">053</span>class MultiServerCallable&lt;R&gt; extends RegionServerCallable&lt;MultiResponse&gt; implements Cancellable {<a name="line.53"></a>
+<span class="sourceLineNo">054</span>  private final MultiAction&lt;R&gt; multiAction;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  private final boolean cellBlock;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>  private final PayloadCarryingRpcController controller;<a name="line.56"></a>
+<span class="sourceLineNo">057</span><a name="line.57"></a>
+<span class="sourceLineNo">058</span>  MultiServerCallable(final ClusterConnection connection, final TableName tableName,<a name="line.58"></a>
+<span class="sourceLineNo">059</span>      final ServerName location, RpcControllerFactory rpcFactory, final MultiAction&lt;R&gt; multi) {<a name="line.59"></a>
+<span class="sourceLineNo">060</span>    super(connection, tableName, null);<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    this.multiAction = multi;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>    // RegionServerCallable has HRegionLocation field, but this is a multi-region request.<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    // Using region info from parent HRegionLocation would be a mistake for this class; so<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    // we will store the server here, and throw if someone tries to obtain location/regioninfo.<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    this.location = new HRegionLocation(null, location);<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    this.cellBlock = isCellBlock();<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    controller = rpcFactory.newController();<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>  @Override<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  protected HRegionLocation getLocation() {<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    throw new RuntimeException("Cannot get region location for multi-region request");<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>  @Override<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  public HRegionInfo getHRegionInfo() {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>    throw new RuntimeException("Cannot get region info for multi-region request");<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  }<a name="line.78"></a>
+<span class="sourceLineNo">079</span><a name="line.79"></a>
+<span class="sourceLineNo">080</span>  MultiAction&lt;R&gt; getMulti() {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    return this.multiAction;<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>  @Override<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  public MultiResponse call(int callTimeout) throws IOException {<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    int countOfActions = this.multiAction.size();<a name="line.86"></a>
+<span class="sourceLineNo">087</span>    if (countOfActions &lt;= 0) throw new DoNotRetryIOException("No Actions");<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    MultiRequest.Builder multiRequestBuilder = MultiRequest.newBuilder();<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    RegionAction.Builder regionActionBuilder = RegionAction.newBuilder();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    ClientProtos.Action.Builder actionBuilder = ClientProtos.Action.newBuilder();<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    MutationProto.Builder mutationBuilder = MutationProto.newBuilder();<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    List&lt;CellScannable&gt; cells = null;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    // The multi object is a list of Actions by region.  Iterate by region.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    long nonceGroup = multiAction.getNonceGroup();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    if (nonceGroup != HConstants.NO_NONCE) {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      multiRequestBuilder.setNonceGroup(nonceGroup);<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    }<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    for (Map.Entry&lt;byte[], List&lt;Action&lt;R&gt;&gt;&gt; e: this.multiAction.actions.entrySet()) {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      final byte [] regionName = e.getKey();<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      final List&lt;Action&lt;R&gt;&gt; actions = e.getValue();<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      regionActionBuilder.clear();<a name="line.101"></a>
+<span class="sourceLineNo">102</span>      regionActionBuilder.setRegion(RequestConverter.buildRegionSpecifier(<a name="line.102"></a>
+<span class="sourceLineNo">103</span>          HBaseProtos.RegionSpecifier.RegionSpecifierType.REGION_NAME, regionName));<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
 <span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>      if (this.cellBlock) {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>        // Presize.  Presume at least a KV per Action.  There are likely more.<a name="line.108"></a>
-<span class="sourceLineNo">109</span>        if (cells == null) cells = new ArrayList&lt;CellScannable&gt;(countOfActions);<a name="line.109"></a>
-<span class="sourceLineNo">110</span>        // Send data in cellblocks. The call to buildNoDataMultiRequest will skip RowMutations.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        // They have already been handled above. Guess at count of cells<a name="line.111"></a>
-<span class="sourceLineNo">112</span>        regionActionBuilder = RequestConverter.buildNoDataRegionAction(regionName, actions, cells,<a name="line.112"></a>
-<span class="sourceLineNo">113</span>          regionActionBuilder, actionBuilder, mutationBuilder);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      } else {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>        regionActionBuilder = RequestConverter.buildRegionAction(regionName, actions,<a name="line.115"></a>
-<span class="sourceLineNo">116</span>          regionActionBuilder, actionBuilder, mutationBuilder);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      }<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      multiRequestBuilder.addRegionAction(regionActionBuilder.build());<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    }<a name="line.119"></a>
-<span class="sourceLineNo">120</span><a name="line.120"></a>
-<span class="sourceLineNo">121</span>    // Controller optionally carries cell data over the proxy/service boundary and also<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    // optionally ferries cell response data back out again.<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    if (cells != null) controller.setCellScanner(CellUtil.createCellScanner(cells));<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    controller.setPriority(getTableName());<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    controller.setCallTimeout(callTimeout);<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    ClientProtos.MultiResponse responseProto;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    ClientProtos.MultiRequest requestProto = multiRequestBuilder.build();<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    try {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      responseProto = getStub().multi(controller, requestProto);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    } catch (ServiceException e) {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      throw ProtobufUtil.getRemoteException(e);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    }<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    if (responseProto == null) return null; // Occurs on cancel<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    return ResponseConverter.getResults(requestProto, responseProto, controller.cellScanner());<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  }<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  @Override<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  public void cancel() {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    controller.startCancel();<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  }<a name="line.140"></a>
-<span class="sourceLineNo">141</span><a name="line.141"></a>
-<span class="sourceLineNo">142</span>  @Override<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public boolean isCancelled() {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    return controller.isCanceled();<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  }<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  /**<a name="line.147"></a>
-<span class="sourceLineNo">148</span>   * @return True if we should send data in cellblocks.  This is an expensive call.  Cache the<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   * result if you can rather than call each time.<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   */<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private boolean isCellBlock() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    // This is not exact -- the configuration could have changed on us after connection was set up<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    // but it will do for now.<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    HConnection connection = getConnection();<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    if (connection == null) return true; // Default is to do cellblocks.<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    Configuration configuration = connection.getConfiguration();<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    if (configuration == null) return true;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    String codec = configuration.get(HConstants.RPC_CODEC_CONF_KEY, "");<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    return codec != null &amp;&amp; codec.length() &gt; 0;<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>  @Override<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public void prepare(boolean reload) throws IOException {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    // Use the location we were given in the constructor rather than go look it up.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    setStub(getConnection().getClient(this.location.getServerName()));<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>  @VisibleForTesting<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  ServerName getServerName() {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    return location.getServerName();<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">106</span>      if (this.cellBlock) {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>        // Presize.  Presume at least a KV per Action.  There are likely more.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>        if (cells == null) cells = new ArrayList&lt;CellScannable&gt;(countOfActions);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>        // Send data in cellblocks. The call to buildNoDataMultiRequest will skip RowMutations.<a name="line.109"></a>
+<span class="sourceLineNo">110</span>        // They have already been handled above. Guess at count of cells<a name="line.110"></a>
+<span class="sourceLineNo">111</span>        regionActionBuilder = RequestConverter.buildNoDataRegionAction(regionName, actions, cells,<a name="line.111"></a>
+<span class="sourceLineNo">112</span>          regionActionBuilder, actionBuilder, mutationBuilder);<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      } else {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>        regionActionBuilder = RequestConverter.buildRegionAction(regionName, actions,<a name="line.114"></a>
+<span class="sourceLineNo">115</span>          regionActionBuilder, actionBuilder, mutationBuilder);<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      }<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      multiRequestBuilder.addRegionAction(regionActionBuilder.build());<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    }<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
+<span class="sourceLineNo">120</span>    // Controller optionally carries cell data over the proxy/service boundary and also<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    // optionally ferries cell response data back out again.<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    if (cells != null) controller.setCellScanner(CellUtil.createCellScanner(cells));<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    controller.setPriority(getTableName());<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    controller.setCallTimeout(callTimeout);<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    ClientProtos.MultiResponse responseProto;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    ClientProtos.MultiRequest requestProto = multiRequestBuilder.build();<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    try {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      responseProto = getStub().multi(controller, requestProto);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    } catch (ServiceException e) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      throw ProtobufUtil.getRemoteException(e);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    if (responseProto == null) return null; // Occurs on cancel<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    return ResponseConverter.getResults(requestProto, responseProto, controller.cellScanner());<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  @Override<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  public void cancel() {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    controller.startCancel();<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  @Override<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public boolean isCancelled() {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    return controller.isCanceled();<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
+<span class="sourceLineNo">145</span><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  /**<a name="line.146"></a>
+<span class="sourceLineNo">147</span>   * @return True if we should send data in cellblocks.  This is an expensive call.  Cache the<a name="line.147"></a>
+<span class="sourceLineNo">148</span>   * result if you can rather than call each time.<a name="line.148"></a>
+<span class="sourceLineNo">149</span>   */<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private boolean isCellBlock() {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    // This is not exact -- the configuration could have changed on us after connection was set up<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    // but it will do for now.<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    HConnection connection = getConnection();<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    if (!(connection instanceof ClusterConnection)) return true; // Default is to do cellblocks.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    return ((ClusterConnection) connection).hasCellBlockSupport();<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  }<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  @Override<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  public void prepare(boolean reload) throws IOException {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    // Use the location we were given in the constructor rather than go look it up.<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    setStub(getConnection().getClient(this.location.getServerName()));<a name="line.161"></a>
+<span class="sourceLineNo">162</span>  }<a name="line.162"></a>
+<span class="sourceLineNo">163</span><a name="line.163"></a>
+<span class="sourceLineNo">164</span>  @VisibleForTesting<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  ServerName getServerName() {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    return location.getServerName();<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  }<a name="line.167"></a>
+<span class="sourceLineNo">168</span>}<a name="line.168"></a>
 
 
 


[41/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
index 794496e..49c82a0 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
@@ -2920,7 +2920,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>FIXED_OVERHEAD</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7326">FIXED_OVERHEAD</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7338">FIXED_OVERHEAD</a></pre>
 </li>
 </ul>
 <a name="DEEP_OVERHEAD">
@@ -2929,7 +2929,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>DEEP_OVERHEAD</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7343">DEEP_OVERHEAD</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7355">DEEP_OVERHEAD</a></pre>
 </li>
 </ul>
 <a name="MOCKED_LIST">
@@ -2938,7 +2938,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MOCKED_LIST</h4>
-<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7733">MOCKED_LIST</a></pre>
+<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7745">MOCKED_LIST</a></pre>
 <div class="block">A mocked list implementation - discards all updates.</div>
 </li>
 </ul>
@@ -4463,7 +4463,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>appendCurrentNonces</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3241">appendCurrentNonces</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3253">appendCurrentNonces</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation,
                        boolean&nbsp;replay,
                        <a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALEdit</a>&nbsp;walEdit,
                        long&nbsp;now,
@@ -4480,7 +4480,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkBatchOp</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3254">checkBatchOp</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;?&gt;&nbsp;batchOp,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3266">checkBatchOp</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;?&gt;&nbsp;batchOp,
                    int&nbsp;lastIndexExclusive,
                    <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;[]&nbsp;familyMaps,
                    long&nbsp;now)
@@ -4495,7 +4495,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>removeNonExistentColumnFamilyForReplay</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3304">removeNonExistentColumnFamilyForReplay</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3316">removeNonExistentColumnFamilyForReplay</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap)</pre>
 <div class="block">During replay, there could exist column families which are removed between region server
  failure and replay</div>
 </li>
@@ -4506,7 +4506,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>getEffectiveDurability</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3327">getEffectiveDurability</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;d)</pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3339">getEffectiveDurability</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;d)</pre>
 <div class="block">Returns effective durability from the passed durability and
  the table descriptor.</div>
 </li>
@@ -4517,7 +4517,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndMutate</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3332">checkAndMutate</a>(byte[]&nbsp;row,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3344">checkAndMutate</a>(byte[]&nbsp;row,
                      byte[]&nbsp;family,
                      byte[]&nbsp;qualifier,
                      <a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter">CompareFilter.CompareOp</a>&nbsp;compareOp,
@@ -4545,7 +4545,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndRowMutate</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3342">checkAndRowMutate</a>(byte[]&nbsp;row,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3354">checkAndRowMutate</a>(byte[]&nbsp;row,
                         byte[]&nbsp;family,
                         byte[]&nbsp;qualifier,
                         <a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter">CompareFilter.CompareOp</a>&nbsp;compareOp,
@@ -4573,7 +4573,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>doCheckAndRowMutate</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3354">doCheckAndRowMutate</a>(byte[]&nbsp;row,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3366">doCheckAndRowMutate</a>(byte[]&nbsp;row,
                           byte[]&nbsp;family,
                           byte[]&nbsp;qualifier,
                           <a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter">CompareFilter.CompareOp</a>&nbsp;compareOp,
@@ -4594,7 +4594,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkMutationType</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3449">checkMutationType</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3461">checkMutationType</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation,
                      byte[]&nbsp;row)
                         throws <a href="../../../../../org/apache/hadoop/hbase/DoNotRetryIOException.html" title="class in org.apache.hadoop.hbase">DoNotRetryIOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -4607,7 +4607,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>matches</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3460">matches</a>(<a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter">CompareFilter.CompareOp</a>&nbsp;compareOp,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3472">matches</a>(<a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter">CompareFilter.CompareOp</a>&nbsp;compareOp,
               int&nbsp;compareResult)</pre>
 </li>
 </ul>
@@ -4617,7 +4617,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>doBatchMutate</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3488">doBatchMutate</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3500">doBatchMutate</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation)
                     throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -4629,7 +4629,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>addRegionToSnapshot</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3511">addRegionToSnapshot</a>(org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription&nbsp;desc,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3523">addRegionToSnapshot</a>(org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription&nbsp;desc,
                        <a href="../../../../../org/apache/hadoop/hbase/errorhandling/ForeignExceptionSnare.html" title="interface in org.apache.hadoop.hbase.errorhandling">ForeignExceptionSnare</a>&nbsp;exnSnare)
                          throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Complete taking the snapshot on the region. Writes the region info and adds references to the
@@ -4650,7 +4650,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>updateCellTimestamps</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3540">updateCellTimestamps</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;cellItr,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3552">updateCellTimestamps</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;cellItr,
                         byte[]&nbsp;now)
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#updateCellTimestamps(java.lang.Iterable,%20byte[])">Region</a></code></strong></div>
@@ -4669,7 +4669,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>rewriteCellTags</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3555">rewriteCellTags</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3567">rewriteCellTags</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
                    <a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;m)</pre>
 <div class="block">Possibly rewrite incoming cell tags.</div>
 </li>
@@ -4680,7 +4680,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkResources</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3583">checkResources</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3595">checkResources</a>()
                      throws <a href="../../../../../org/apache/hadoop/hbase/RegionTooBusyException.html" title="class in org.apache.hadoop.hbase">RegionTooBusyException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/RegionTooBusyException.html" title="class in org.apache.hadoop.hbase">RegionTooBusyException</a></code></dd></dl>
@@ -4692,7 +4692,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkReadOnly</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3603">checkReadOnly</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3615">checkReadOnly</a>()
                       throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code> - Throws exception if region is in read-only mode.</dd></dl>
@@ -4704,7 +4704,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkReadsEnabled</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3609">checkReadsEnabled</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3621">checkReadsEnabled</a>()
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -4716,7 +4716,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>setReadsEnabled</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3616">setReadsEnabled</a>(boolean&nbsp;readsEnabled)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3628">setReadsEnabled</a>(boolean&nbsp;readsEnabled)</pre>
 </li>
 </ul>
 <a name="put(byte[], byte[], java.util.List)">
@@ -4725,7 +4725,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>put</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3629">put</a>(byte[]&nbsp;row,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3641">put</a>(byte[]&nbsp;row,
        byte[]&nbsp;family,
        <a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;edits)
           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -4742,7 +4742,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>applyFamilyMapToMemstore</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3649">applyFamilyMapToMemstore</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3661">applyFamilyMapToMemstore</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
                             boolean&nbsp;replay,
                             long&nbsp;sequenceId)
                                throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -4762,7 +4762,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>applyToMemstore</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3669">applyToMemstore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&nbsp;store,
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3681">applyToMemstore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&nbsp;store,
                    <a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;cells,
                    boolean&nbsp;delta,
                    boolean&nbsp;replay,
@@ -4782,7 +4782,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>applyToMemstore</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3696">applyToMemstore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&nbsp;store,
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3708">applyToMemstore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&nbsp;store,
                    <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell,
                    long&nbsp;sequenceId)
                       throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -4797,7 +4797,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkFamilies</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3707">checkFamilies</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;byte[]&gt;&nbsp;families)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3719">checkFamilies</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;byte[]&gt;&nbsp;families)
                    throws <a href="../../../../../org/apache/hadoop/hbase/regionserver/NoSuchColumnFamilyException.html" title="class in org.apache.hadoop.hbase.regionserver">NoSuchColumnFamilyException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#checkFamilies(java.util.Collection)">Region</a></code></strong></div>
 <div class="block">Check the collection of families for validity.</div>
@@ -4814,7 +4814,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkTimestamps</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3714">checkTimestamps</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3726">checkTimestamps</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
                    long&nbsp;now)
                      throws <a href="../../../../../org/apache/hadoop/hbase/exceptions/FailedSanityCheckException.html" title="class in org.apache.hadoop.hbase.exceptions">FailedSanityCheckException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#checkTimestamps(java.util.Map,%20long)">Region</a></code></strong></div>
@@ -4833,7 +4833,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>addFamilyMapToWALEdit</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3741">addFamilyMapToWALEdit</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3753">addFamilyMapToWALEdit</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
                          <a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALEdit</a>&nbsp;walEdit)</pre>
 <div class="block">Append the given map of family->edits to a WALEdit data structure.
  This does not write to the WAL itself.</div>
@@ -4846,7 +4846,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>requestFlush</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3753">requestFlush</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3765">requestFlush</a>()</pre>
 </li>
 </ul>
 <a name="isFlushSize(long)">
@@ -4855,7 +4855,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>isFlushSize</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3774">isFlushSize</a>(long&nbsp;size)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3786">isFlushSize</a>(long&nbsp;size)</pre>
 </li>
 </ul>
 <a name="replayRecoveredEditsIfAny(org.apache.hadoop.fs.Path, java.util.Map, org.apache.hadoop.hbase.util.CancelableProgressable, org.apache.hadoop.hbase.monitoring.MonitoredTask)">
@@ -4864,7 +4864,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayRecoveredEditsIfAny</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3811">replayRecoveredEditsIfAny</a>(org.apache.hadoop.fs.Path&nbsp;regiondir,
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3823">replayRecoveredEditsIfAny</a>(org.apache.hadoop.fs.Path&nbsp;regiondir,
                              <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;maxSeqIdInStores,
                              <a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter,
                              <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
@@ -4908,7 +4908,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayRecoveredEdits</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3919">replayRecoveredEdits</a>(org.apache.hadoop.fs.Path&nbsp;edits,
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3931">replayRecoveredEdits</a>(org.apache.hadoop.fs.Path&nbsp;edits,
                         <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;maxSeqIdInStores,
                         <a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter)
                            throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -4922,7 +4922,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayWALCompactionMarker</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4112">replayWALCompactionMarker</a>(org.apache.hadoop.hbase.protobuf.generated.WALProtos.CompactionDescriptor&nbsp;compaction,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4124">replayWALCompactionMarker</a>(org.apache.hadoop.hbase.protobuf.generated.WALProtos.CompactionDescriptor&nbsp;compaction,
                              boolean&nbsp;pickCompactionFiles,
                              boolean&nbsp;removeFiles,
                              long&nbsp;replaySeqId)
@@ -4940,7 +4940,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayWALFlushMarker</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4173">replayWALFlushMarker</a>(org.apache.hadoop.hbase.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4185">replayWALFlushMarker</a>(org.apache.hadoop.hbase.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush,
                         long&nbsp;replaySeqId)
                     throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -4953,7 +4953,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayWALFlushStartMarker</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.PrepareFlushResult</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4220">replayWALFlushStartMarker</a>(org.apache.hadoop.hbase.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush)
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.PrepareFlushResult</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4232">replayWALFlushStartMarker</a>(org.apache.hadoop.hbase.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush)
                                                throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Replay the flush marker from primary region by creating a corresponding snapshot of
  the store memstores, only if the memstores do not have a higher seqId from an earlier wal
@@ -4968,7 +4968,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayWALFlushCommitMarker</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4333">replayWALFlushCommitMarker</a>(org.apache.hadoop.hbase.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush)
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4345">replayWALFlushCommitMarker</a>(org.apache.hadoop.hbase.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush)
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -4980,7 +4980,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayFlushInStores</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4458">replayFlushInStores</a>(org.apache.hadoop.hbase.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4470">replayFlushInStores</a>(org.apache.hadoop.hbase.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush,
                        <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.PrepareFlushResult</a>&nbsp;prepareFlushResult,
                        boolean&nbsp;dropMemstoreSnapshot)
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -4997,7 +4997,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>dropMemstoreContentsForSeqId</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4499">dropMemstoreContentsForSeqId</a>(long&nbsp;seqId,
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4511">dropMemstoreContentsForSeqId</a>(long&nbsp;seqId,
                                 <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&nbsp;store)
                                    throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Drops the memstore contents after replaying a flush descriptor or region open event replay
@@ -5012,7 +5012,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>doDropStoreMemstoreContentsForSeqId</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4530">doDropStoreMemstoreContentsForSeqId</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&nbsp;s,
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4542">doDropStoreMemstoreContentsForSeqId</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&nbsp;s,
                                        long&nbsp;currentSeqId)
                                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -5025,7 +5025,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayWALFlushAbortMarker</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4539">replayWALFlushAbortMarker</a>(org.apache.hadoop.hbase.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4551">replayWALFlushAbortMarker</a>(org.apache.hadoop.hbase.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush)</pre>
 </li>
 </ul>
 <a name="replayWALFlushCannotFlushMarker(org.apache.hadoop.hbase.protobuf.generated.WALProtos.FlushDescriptor, long)">
@@ -5034,7 +5034,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayWALFlushCannotFlushMarker</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4545">replayWALFlushCannotFlushMarker</a>(org.apache.hadoop.hbase.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4557">replayWALFlushCannotFlushMarker</a>(org.apache.hadoop.hbase.protobuf.generated.WALProtos.FlushDescriptor&nbsp;flush,
                                    long&nbsp;replaySeqId)</pre>
 </li>
 </ul>
@@ -5044,7 +5044,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>getPrepareFlushResult</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.PrepareFlushResult</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4565">getPrepareFlushResult</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.PrepareFlushResult</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4577">getPrepareFlushResult</a>()</pre>
 </li>
 </ul>
 <a name="replayWALRegionEventMarker(org.apache.hadoop.hbase.protobuf.generated.WALProtos.RegionEventDescriptor)">
@@ -5053,7 +5053,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayWALRegionEventMarker</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4571">replayWALRegionEventMarker</a>(org.apache.hadoop.hbase.protobuf.generated.WALProtos.RegionEventDescriptor&nbsp;regionEvent)
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4583">replayWALRegionEventMarker</a>(org.apache.hadoop.hbase.protobuf.generated.WALProtos.RegionEventDescriptor&nbsp;regionEvent)
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -5065,7 +5065,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>replayWALBulkLoadEventMarker</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4687">replayWALBulkLoadEventMarker</a>(org.apache.hadoop.hbase.protobuf.generated.WALProtos.BulkLoadDescriptor&nbsp;bulkLoadEvent)
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4699">replayWALBulkLoadEventMarker</a>(org.apache.hadoop.hbase.protobuf.generated.WALProtos.BulkLoadDescriptor&nbsp;bulkLoadEvent)
                             throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -5077,7 +5077,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>dropPrepareFlushIfPossible</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4770">dropPrepareFlushIfPossible</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4782">dropPrepareFlushIfPossible</a>()</pre>
 <div class="block">If all stores ended up dropping their snapshots, we can safely drop the prepareFlushResult</div>
 </li>
 </ul>
@@ -5087,7 +5087,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>refreshStoreFiles</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4797">refreshStoreFiles</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4809">refreshStoreFiles</a>()
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#refreshStoreFiles()">Region</a></code></strong></div>
 <div class="block">Check the region's underlying store files, open the files that have not
@@ -5106,7 +5106,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>refreshStoreFiles</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4803">refreshStoreFiles</a>(boolean&nbsp;force)
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4815">refreshStoreFiles</a>(boolean&nbsp;force)
                              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -5118,7 +5118,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>logRegionFiles</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4886">logRegionFiles</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4898">logRegionFiles</a>()</pre>
 </li>
 </ul>
 <a name="checkTargetRegion(byte[], java.lang.String, java.lang.Object)">
@@ -5127,7 +5127,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkTargetRegion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4902">checkTargetRegion</a>(byte[]&nbsp;encodedRegionName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4914">checkTargetRegion</a>(byte[]&nbsp;encodedRegionName,
                      <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;exceptionMsg,
                      <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;payload)
                         throws <a href="../../../../../org/apache/hadoop/hbase/regionserver/WrongRegionException.html" title="class in org.apache.hadoop.hbase.regionserver">WrongRegionException</a></pre>
@@ -5143,7 +5143,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreEdit</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4925">restoreEdit</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&nbsp;s,
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4937">restoreEdit</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&nbsp;s,
                   <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
 <div class="block">Used by tests</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>s</code> - Store to add edit too.</dd><dd><code>cell</code> - Cell to add.</dd>
@@ -5156,7 +5156,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>isZeroLengthThenDelete</h4>
-<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4939">isZeroLengthThenDelete</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4951">isZeroLengthThenDelete</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                              org.apache.hadoop.fs.Path&nbsp;p)
                                        throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -5169,7 +5169,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>instantiateHStore</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4948">instantiateHStore</a>(<a href="../../../../../org/apache/hadoop/hbase/HColumnDescriptor.html" title="class in org.apache.hadoop.hbase">HColumnDescriptor</a>&nbsp;family)
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4960">instantiateHStore</a>(<a href="../../../../../org/apache/hadoop/hbase/HColumnDescriptor.html" title="class in org.apache.hadoop.hbase">HColumnDescriptor</a>&nbsp;family)
                             throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -5181,7 +5181,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>getStore</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4962">getStore</a>(byte[]&nbsp;column)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4974">getStore</a>(byte[]&nbsp;column)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#getStore(byte[])">Region</a></code></strong></div>
 <div class="block">Return the Store for the given family
  <p>Use with caution.  Exposed for use of fixup utilities.</div>
@@ -5197,7 +5197,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>getStore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4970">getStore</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4982">getStore</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
 <div class="block">Return HStore instance. Does not do any copy: as the number of store is limited, we
   iterate on the list.</div>
 </li>
@@ -5208,7 +5208,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>getStores</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4983">getStores</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4995">getStores</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#getStores()">Region</a></code></strong></div>
 <div class="block">Return the list of Stores managed by this region
  <p>Use with caution.  Exposed for use of fixup utilities.</div>
@@ -5224,7 +5224,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreFileList</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.4990">getStoreFileList</a>(byte[][]&nbsp;columns)
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5002">getStoreFileList</a>(byte[][]&nbsp;columns)
                               throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/IllegalArgumentException.html?is-external=true" title="class or interface in java.lang">IllegalArgumentException</a></pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -5240,7 +5240,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkRow</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5017">checkRow</a>(byte[]&nbsp;row,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5029">checkRow</a>(byte[]&nbsp;row,
             <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;op)
         throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Make sure this is a valid row for the HRegion</div>
@@ -5254,7 +5254,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>getRowLock</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5034">getRowLock</a>(byte[]&nbsp;row)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5046">getRowLock</a>(byte[]&nbsp;row)
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Get an exclusive ( write lock ) lock on a given row.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>row</code> - Which row to lock.</dd>
@@ -5269,7 +5269,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>getRowLock</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5049">getRowLock</a>(byte[]&nbsp;row,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5061">getRowLock</a>(byte[]&nbsp;row,
                         boolean&nbsp;readLock)
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Get a row lock for the specified row. All locks are reentrant.
@@ -5293,7 +5293,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>releaseRowLocks</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5116">releaseRowLocks</a>(<a href="http://docs.oracle.com/javase/7/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/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&gt;&nbsp;rowLocks)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5128">releaseRowLocks</a>(<a href="http://docs.oracle.com/javase/7/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/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&gt;&nbsp;rowLocks)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#releaseRowLocks(java.util.List)">Region</a></code></strong></div>
 <div class="block">If the given list of row locks is not null, releases all locks.</div>
 <dl>
@@ -5308,7 +5308,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>hasMultipleColumnFamilies</h4>
-<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5222">hasMultipleColumnFamilies</a>(<a href="http://docs.oracle.com/javase/7/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/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt;&nbsp;familyPaths)</pre>
+<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5234">hasMultipleColumnFamilies</a>(<a href="http://docs.oracle.com/javase/7/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/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt;&nbsp;familyPaths)</pre>
 <div class="block">Determines whether multiple column families are present
  Precondition: familyPaths is not null</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>familyPaths</code> - List of (column family, hfilePath)</dd></dl>
@@ -5320,7 +5320,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>bulkLoadHFiles</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5238">bulkLoadHFiles</a>(<a href="http://docs.oracle.com/javase/7/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/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt;&nbsp;familyPaths,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5250">bulkLoadHFiles</a>(<a href="http://docs.oracle.com/javase/7/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/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;byte[],<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt;&nbsp;familyPaths,
                      boolean&nbsp;assignSeqId,
                      <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.BulkLoadListener.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.BulkLoadListener</a>&nbsp;bulkLoadListener)
                        throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -5343,7 +5343,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5376">equals</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;o)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5388">equals</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;o)</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -5356,7 +5356,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>hashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5382">hashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5394">hashCode</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.lang">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -5369,7 +5369,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/regionserver/HRegion.html#line.5387">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/regionserver/HRegion.html#line.5399">toString</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -5382,7 +5382,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>newHRegion</h4>
-<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6072">newHRegion</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
+<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6084">newHRegion</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
                  <a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
                  org.apache.hadoop.fs.FileSystem&nbsp;fs,
                  org.apache.hadoop.conf.Configuration&nbsp;conf,
@@ -5408,7 +5408,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>createHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6102">createHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6114">createHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
                     org.apache.hadoop.fs.Path&nbsp;rootDir,
                     org.apache.hadoop.conf.Configuration&nbsp;conf,
                     <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;hTableDescriptor,
@@ -5428,7 +5428,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>createHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6117">createHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6129">createHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
                     org.apache.hadoop.fs.Path&nbsp;rootDir,
                     org.apache.hadoop.conf.Configuration&nbsp;conf,
                     <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;hTableDescriptor,
@@ -5444,7 +5444,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6137">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6149">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
                   <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;htd,
                   <a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
                   org.apache.hadoop.conf.Configuration&nbsp;conf)
@@ -5465,7 +5465,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6159">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6171">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
                   <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;htd,
                   <a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
                   org.apache.hadoop.conf.Configuration&nbsp;conf,
@@ -5488,7 +5488,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6180">openHRegion</a>(org.apache.hadoop.fs.Path&nbsp;rootDir,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6192">openHRegion</a>(org.apache.hadoop.fs.Path&nbsp;rootDir,
                   <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
                   <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;htd,
                   <a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
@@ -5510,7 +5510,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6201">openHRegion</a>(org.apache.hadoop.fs.Path&nbsp;rootDir,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6213">openHRegion</a>(org.apache.hadoop.fs.Path&nbsp;rootDir,
                   <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
                   <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;htd,
                   <a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
@@ -5534,7 +5534,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6230">openHRegion</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6242">openHRegion</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                   org.apache.hadoop.fs.FileSystem&nbsp;fs,
                   org.apache.hadoop.fs.Path&nbsp;rootDir,
                   <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
@@ -5557,7 +5557,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6252">openHRegion</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6264">openHRegion</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                   org.apache.hadoop.fs.FileSystem&nbsp;fs,
                   org.apache.hadoop.fs.Path&nbsp;rootDir,
                   <a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
@@ -5582,7 +5582,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6276">openHRegion</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6288">openHRegion</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                   org.apache.hadoop.fs.FileSystem&nbsp;fs,
                   org.apache.hadoop.fs.Path&nbsp;rootDir,
                   org.apache.hadoop.fs.Path&nbsp;tableDir,
@@ -5608,7 +5608,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6297">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;other,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6309">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;other,
                   <a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter)
                            throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Useful when reopening a closed region (normally for unit tests)</div>
@@ -5624,7 +5624,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6305">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;other,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6317">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;other,
                  <a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter)
                           throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -5637,7 +5637,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>openHRegion</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6316">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter)
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6328">openHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter)
                        throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Open HRegion.
  Calls initialize and sets sequenceId.</div>
@@ -5652,7 +5652,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>warmupHRegion</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6337">warmupHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6349">warmupHRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;info,
                  <a href="../../../../../org/apache/hadoop/hbase/HTableDescriptor.html" title="class in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;htd,
                  <a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;wal,
                  org.apache.hadoop.conf.Configuration&nbsp;conf,
@@ -5669,7 +5669,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkCompressionCodecs</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6366">checkCompressionCodecs</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6378">checkCompressionCodecs</a>()
                              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -5681,7 +5681,7 @@ public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/r
 <ul class="blockList">
 <li class="blockList">
 <h4>checkEncryption</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6373">checkEncryption</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6385">checkEncryption</a>()
                       throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -5693,7 +5693,7 @@ pu

<TRUNCATED>

[10/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
index d3abe39..c51826f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionMonitor.html
@@ -615,9 +615,9 @@
 <span class="sourceLineNo">607</span>            if (this.failOnError &amp;&amp; monitor.hasError()) {<a name="line.607"></a>
 <span class="sourceLineNo">608</span>              monitorThread.interrupt();<a name="line.608"></a>
 <span class="sourceLineNo">609</span>              if (monitor.initialized) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>                System.exit(monitor.errorCode);<a name="line.610"></a>
+<span class="sourceLineNo">610</span>                return monitor.errorCode;<a name="line.610"></a>
 <span class="sourceLineNo">611</span>              } else {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.612"></a>
+<span class="sourceLineNo">612</span>                return INIT_ERROR_EXIT_CODE;<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>            currentTimeLength = System.currentTimeMillis() - startTime;<a name="line.615"></a>
@@ -626,630 +626,629 @@
 <span class="sourceLineNo">618</span>                  + ") after timeout limit:" + this.timeout<a name="line.618"></a>
 <span class="sourceLineNo">619</span>                  + " will be killed itself !!");<a name="line.619"></a>
 <span class="sourceLineNo">620</span>              if (monitor.initialized) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>                System.exit(TIMEOUT_ERROR_EXIT_CODE);<a name="line.621"></a>
+<span class="sourceLineNo">621</span>                return TIMEOUT_ERROR_EXIT_CODE;<a name="line.621"></a>
 <span class="sourceLineNo">622</span>              } else {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.623"></a>
+<span class="sourceLineNo">623</span>                return INIT_ERROR_EXIT_CODE;<a name="line.623"></a>
 <span class="sourceLineNo">624</span>              }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>              break;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>            monitorThread.interrupt();<a name="line.630"></a>
-<span class="sourceLineNo">631</span>            System.exit(monitor.errorCode);<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } finally {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          if (monitor != null) monitor.close();<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>        Thread.sleep(interval);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      } while (interval &gt; 0);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    } // try-with-resources close<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    if (choreService != null) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      choreService.shutdown();<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    return(monitor.errorCode);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>  }<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private void printUsageAndExit() {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    System.err.printf(<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        getClass().getName());<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    System.err.println(" where [opts] are:");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    System.err.println("   -help          Show this help and exit.");<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    System.err.println("      which means to enable regionserver mode");<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    System.err.println("      only works in regionserver mode.");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        " default is true");<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        + " Default is hbase:canary");<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    System.err<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * A Factory method for {@link Monitor}.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   * Can be overridden by user.<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param index a start index for monitor target<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param args args passed from user<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a Monitor instance<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   */<a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    Monitor monitor = null;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    String[] monitorTargets = null;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    if(index &gt;= 0) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int length = args.length - index;<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      monitorTargets = new String[length];<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>    if (this.regionServerMode) {<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      monitor =<a name="line.691"></a>
-<span class="sourceLineNo">692</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.693"></a>
-<span class="sourceLineNo">694</span>              this.treatFailureAsError);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    } else {<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      monitor =<a name="line.696"></a>
-<span class="sourceLineNo">697</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    return monitor;<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>  // a Monitor super-class can be extended by users<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>    protected Connection connection;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    protected Admin admin;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    protected String[] targets;<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    protected boolean useRegExp;<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    protected boolean treatFailureAsError;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    protected boolean initialized = false;<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    protected boolean done = false;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected int errorCode = 0;<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    protected Sink sink;<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    protected ExecutorService executor;<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>    public boolean isDone() {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return done;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    public boolean hasError() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return errorCode != 0;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span><a name="line.725"></a>
-<span class="sourceLineNo">726</span>    public boolean finalCheckForErrors() {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      if (errorCode != 0) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>        return true;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      return treatFailureAsError &amp;&amp;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>    @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    public void close() throws IOException {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (this.admin != null) this.admin.close();<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span><a name="line.738"></a>
-<span class="sourceLineNo">739</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      this.connection = connection;<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      this.targets = monitorTargets;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      this.useRegExp = useRegExp;<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.sink = sink;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      this.executor = executor;<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>    @Override<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    public abstract void run();<a name="line.752"></a>
-<span class="sourceLineNo">753</span><a name="line.753"></a>
-<span class="sourceLineNo">754</span>    protected boolean initAdmin() {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      if (null == this.admin) {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        try {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>          this.admin = this.connection.getAdmin();<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        } catch (Exception e) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>        }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      } else if (admin.isAborted()) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>        LOG.error("HBaseAdmin aborted");<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      }<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return !this.hasError();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
-<span class="sourceLineNo">769</span><a name="line.769"></a>
-<span class="sourceLineNo">770</span>  // a monitor for region mode<a name="line.770"></a>
-<span class="sourceLineNo">771</span>  private static class RegionMonitor extends Monitor {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    // 10 minutes<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    // 1 days<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>    private long lastCheckTime = -1;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private boolean writeSniffing;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    private TableName writeTableName;<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    private int writeDataTTL;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private float regionsLowerLimit;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    private float regionsUpperLimit;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    private int checkPeriod;<a name="line.783"></a>
-<span class="sourceLineNo">784</span><a name="line.784"></a>
-<span class="sourceLineNo">785</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        boolean treatFailureAsError) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      Configuration conf = connection.getConfiguration();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      this.writeSniffing = writeSniffing;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      this.writeTableName = writeTableName;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      this.writeDataTTL =<a name="line.792"></a>
-<span class="sourceLineNo">793</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      this.regionsLowerLimit =<a name="line.794"></a>
-<span class="sourceLineNo">795</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      this.regionsUpperLimit =<a name="line.796"></a>
-<span class="sourceLineNo">797</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      this.checkPeriod =<a name="line.798"></a>
-<span class="sourceLineNo">799</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.799"></a>
-<span class="sourceLineNo">800</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>    @Override<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    public void run() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      if (this.initAdmin()) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        try {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.809"></a>
-<span class="sourceLineNo">810</span>            this.initialized = true;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>            for (String table : tables) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.812"></a>
-<span class="sourceLineNo">813</span>            }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          } else {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>          }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>          if (writeSniffing) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>              try {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                checkWriteTableDistribution();<a name="line.821"></a>
-<span class="sourceLineNo">822</span>              } catch (IOException e) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.823"></a>
-<span class="sourceLineNo">824</span>              }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>            }<a name="line.826"></a>
-<span class="sourceLineNo">827</span>            // sniff canary table with write operation<a name="line.827"></a>
-<span class="sourceLineNo">828</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.828"></a>
-<span class="sourceLineNo">829</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>          }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            try {<a name="line.833"></a>
-<span class="sourceLineNo">834</span>              future.get();<a name="line.834"></a>
-<span class="sourceLineNo">835</span>            } catch (ExecutionException e) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>              LOG.error("Sniff region failed!", e);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>            }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          }<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        } catch (Exception e) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>          LOG.error("Run regionMonitor failed", e);<a name="line.840"></a>
-<span class="sourceLineNo">841</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      this.done = true;<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      String[] returnTables = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span><a name="line.849"></a>
-<span class="sourceLineNo">850</span>      if (this.useRegExp) {<a name="line.850"></a>
-<span class="sourceLineNo">851</span>        Pattern pattern = null;<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        HTableDescriptor[] tds = null;<a name="line.852"></a>
-<span class="sourceLineNo">853</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        try {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>          if (LOG.isDebugEnabled()) {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>            LOG.debug(String.format("reading list of tables"));<a name="line.856"></a>
-<span class="sourceLineNo">857</span>          }<a name="line.857"></a>
-<span class="sourceLineNo">858</span>          tds = this.admin.listTables(pattern);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>          if (tds == null) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>            tds = new HTableDescriptor[0];<a name="line.860"></a>
-<span class="sourceLineNo">861</span>          }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>          for (String monitorTarget : monitorTargets) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>            pattern = Pattern.compile(monitorTarget);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>            for (HTableDescriptor td : tds) {<a name="line.864"></a>
-<span class="sourceLineNo">865</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>                tmpTables.add(td.getNameAsString());<a name="line.866"></a>
-<span class="sourceLineNo">867</span>              }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>            }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>          }<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        } catch (IOException e) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          LOG.error("Communicate with admin failed", e);<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          throw e;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>        if (tmpTables.size() &gt; 0) {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>        } else {<a name="line.877"></a>
-<span class="sourceLineNo">878</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          LOG.error(msg);<a name="line.879"></a>
-<span class="sourceLineNo">880</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>          throw new TableNotFoundException(msg);<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        }<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      } else {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>        returnTables = monitorTargets;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>      return returnTables;<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    }<a name="line.888"></a>
-<span class="sourceLineNo">889</span><a name="line.889"></a>
-<span class="sourceLineNo">890</span>    /*<a name="line.890"></a>
-<span class="sourceLineNo">891</span>     * canary entry point to monitor all the tables.<a name="line.891"></a>
-<span class="sourceLineNo">892</span>     */<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType) throws Exception {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      if (LOG.isDebugEnabled()) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        LOG.debug(String.format("reading list of tables"));<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.899"></a>
-<span class="sourceLineNo">900</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        }<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      return taskFutures;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      if (!admin.tableExists(writeTableName)) {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>        int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.909"></a>
-<span class="sourceLineNo">910</span>        if (numberOfServers == 0) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>          throw new IllegalStateException("No live regionservers");<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        }<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        createWriteTable(numberOfServers);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        admin.enableTable(writeTableName);<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      }<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>      int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      List&lt;Pair&lt;HRegionInfo, ServerName&gt;&gt; pairs =<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      int numberOfRegions = pairs.size();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        admin.disableTable(writeTableName);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        admin.deleteTable(writeTableName);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        createWriteTable(numberOfServers);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;ServerName&gt;();<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      for (Pair&lt;HRegionInfo, ServerName&gt; pair : pairs) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        serverSet.add(pair.getSecond());<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      int numberOfCoveredServers = serverSet.size();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        admin.balancer();<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    }<a name="line.938"></a>
-<span class="sourceLineNo">939</span><a name="line.939"></a>
-<span class="sourceLineNo">940</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          + " and you can change it by config: "<a name="line.945"></a>
-<span class="sourceLineNo">946</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      family.setMaxVersions(1);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      family.setTimeToLive(writeDataTTL);<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      desc.addFamily(family);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      admin.createTable(desc, splits);<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    }<a name="line.955"></a>
-<span class="sourceLineNo">956</span>  }<a name="line.956"></a>
-<span class="sourceLineNo">957</span><a name="line.957"></a>
-<span class="sourceLineNo">958</span>  /**<a name="line.958"></a>
-<span class="sourceLineNo">959</span>   * Canary entry point for specified table.<a name="line.959"></a>
-<span class="sourceLineNo">960</span>   * @throws Exception<a name="line.960"></a>
-<span class="sourceLineNo">961</span>   */<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static void sniff(final Admin admin, TableName tableName)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      throws Exception {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    sniff(admin, tableName, TaskType.READ);<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>  /**<a name="line.967"></a>
-<span class="sourceLineNo">968</span>   * Canary entry point for specified table with task type(read/write)<a name="line.968"></a>
-<span class="sourceLineNo">969</span>   * @throws Exception<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   */<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  public static void sniff(final Admin admin, TableName tableName, TaskType taskType)<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      throws Exception {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    List&lt;Future&lt;Void&gt;&gt; taskFutures =<a name="line.973"></a>
-<span class="sourceLineNo">974</span>        Canary.sniff(admin, new StdOutSink(), tableName.getNameAsString(),<a name="line.974"></a>
-<span class="sourceLineNo">975</span>          new ScheduledThreadPoolExecutor(1), taskType);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    for (Future&lt;Void&gt; future : taskFutures) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      future.get();<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><a name="line.980"></a>
-<span class="sourceLineNo">981</span>  /**<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   * Canary entry point for specified table.<a name="line.982"></a>
-<span class="sourceLineNo">983</span>   * @throws Exception<a name="line.983"></a>
-<span class="sourceLineNo">984</span>   */<a name="line.984"></a>
-<span class="sourceLineNo">985</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      ExecutorService executor, TaskType taskType) throws Exception {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    if (LOG.isDebugEnabled()) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        tableName));<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        executor, taskType);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    } else {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  /*<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>   * Loops over regions that owns this table, and output some information abouts the state.<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType) throws Exception {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span><a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    if (LOG.isDebugEnabled()) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>    Table table = null;<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    try {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    } catch (TableNotFoundException e) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      return new ArrayList&lt;Future&lt;Void&gt;&gt;();<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;RegionTask&gt;();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    try {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      for (HRegionInfo region : admin.getTableRegions(tableDesc.getTableName())) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        tasks.add(new RegionTask(admin.getConnection(), region, sink, taskType));<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    } finally {<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      table.close();<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    return executor.invokeAll(tasks);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>  // a monitor for regionserver mode<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  private static class RegionServerMonitor extends Monitor {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    private boolean allRegions;<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    public RegionServerMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        ExtendedSink sink, ExecutorService executor, boolean allRegions,<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        boolean treatFailureAsError) {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      this.allRegions = allRegions;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span><a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    private ExtendedSink getSink() {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      return (ExtendedSink) this.sink;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span><a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    @Override<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    public void run() {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      if (this.initAdmin() &amp;&amp; this.checkNoTableNames()) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = this.filterRegionServerByName();<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        this.initialized = true;<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>        this.monitorRegionServers(rsAndRMap);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      this.done = true;<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>    private boolean checkNoTableNames() {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      List&lt;String&gt; foundTableNames = new ArrayList&lt;String&gt;();<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>      TableName[] tableNames = null;<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      if (LOG.isDebugEnabled()) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      try {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>        tableNames = this.admin.listTableNames();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      } catch (IOException e) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        LOG.error("Get listTableNames failed", e);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        return false;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      if (this.targets == null || this.targets.length == 0) return true;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      for (String target : this.targets) {<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        for (TableName tableName : tableNames) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          if (target.equals(tableName.getNameAsString())) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>            foundTableNames.add(target);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (foundTableNames.size() &gt; 0) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        System.err.println("Cannot pass a tablename when using the -regionserver " +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>            "option, tablenames:" + foundTableNames.toString());<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        this.errorCode = USAGE_EXIT_CODE;<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      }<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      return foundTableNames.size() == 0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    }<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span><a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    private void monitorRegionServers(Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      List&lt;RegionServerTask&gt; tasks = new ArrayList&lt;RegionServerTask&gt;();<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      Map&lt;String, AtomicLong&gt; successMap = new HashMap&lt;String, AtomicLong&gt;();<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      Random rand = new Random();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        String serverName = entry.getKey();<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        AtomicLong successes = new AtomicLong(0);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        successMap.put(serverName, successes);<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        if (this.allRegions) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>          for (HRegionInfo region : entry.getValue()) {<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            tasks.add(new RegionServerTask(this.connection,<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>                serverName,<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>                region,<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>                getSink(),<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>                successes));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>          }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        } else {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>          // random select a region if flag not set<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>          HRegionInfo region = entry.getValue().get(rand.nextInt(entry.getValue().size()));<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>          tasks.add(new RegionServerTask(this.connection,<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>              serverName,<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>              region,<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>              getSink(),<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>              successes));<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>        }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      }<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>      try {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>          try {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>            future.get();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          } catch (ExecutionException e) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.error("Sniff regionserver failed!", e);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        if (this.allRegions) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>            String serverName = entry.getKey();<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            LOG.info("Successfully read " + successMap.get(serverName) + " regions out of "<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>                    + entry.getValue().size() + " on regionserver:" + serverName);<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      } catch (InterruptedException e) {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        LOG.error("Sniff regionserver interrupted!", e);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      }<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>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; filterRegionServerByName() {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; regionServerAndRegionsMap = this.getAllRegionServerByName();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      regionServerAndRegionsMap = this.doFilterRegionServerByName(regionServerAndRegionsMap);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>      return regionServerAndRegionsMap;<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; getAllRegionServerByName() {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      Table table = null;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      RegionLocator regionLocator = null;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      try {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        if (LOG.isDebugEnabled()) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          LOG.debug(String.format("reading list of tables and locations"));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        HTableDescriptor[] tableDescs = this.admin.listTables();<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        List&lt;HRegionInfo&gt; regions = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>        for (HTableDescriptor tableDesc : tableDescs) {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>          table = this.admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>          regionLocator = this.admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>          for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>            ServerName rs = location.getServerName();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>            String rsName = rs.getHostname();<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>            HRegionInfo r = location.getRegionInfo();<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>            if (rsAndRMap.containsKey(rsName)) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>              regions = rsAndRMap.get(rsName);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            } else {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>              regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>              rsAndRMap.put(rsName, regions);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>            regions.add(r);<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>          }<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>          table.close();<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span><a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      } catch (IOException e) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        String msg = "Get HTables info failed";<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        LOG.error(msg, e);<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>      } finally {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        if (table != null) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          try {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            table.close();<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          } catch (IOException e) {<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>            LOG.warn("Close table failed", e);<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>        }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>      }<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span><a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return rsAndRMap;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; doFilterRegionServerByName(<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; fullRsAndRMap) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; filteredRsAndRMap = null;<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span><a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        filteredRsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        Pattern pattern = null;<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        Matcher matcher = null;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        boolean regExpFound = false;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (String rsName : this.targets) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (this.useRegExp) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>            regExpFound = false;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>            pattern = Pattern.compile(rsName);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : fullRsAndRMap.entrySet()) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>              matcher = pattern.matcher(entry.getKey());<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>              if (matcher.matches()) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>                filteredRsAndRMap.put(entry.getKey(), entry.getValue());<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>                regExpFound = true;<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>            if (!regExpFound) {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>              LOG.info("No RegionServerInfo found, regionServerPattern:" + rsName);<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            if (fullRsAndRMap.containsKey(rsName)) {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>              filteredRsAndRMap.put(rsName, fullRsAndRMap.get(rsName));<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>            } else {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>              LOG.info("No RegionServerInfo found, regionServerName:" + rsName);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>            }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>          }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        }<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>        filteredRsAndRMap = fullRsAndRMap;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return filteredRsAndRMap;<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><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  public static void main(String[] args) throws Exception {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    final Configuration conf = HBaseConfiguration.create();<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span><a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // loading the generic options to conf<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    new GenericOptionsParser(conf, args);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    int numThreads = conf.getInt("hbase.canary.threads.num", MAX_THREADS_NUM);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    LOG.info("Number of exection threads " + numThreads);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span><a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(numThreads);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span><a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    Class&lt;? extends Sink&gt; sinkClass =<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        conf.getClass("hbase.canary.sink.class", RegionServerStdOutSink.class, Sink.class);<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>    Sink sink = ReflectionUtils.newInstance(sinkClass);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span><a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    int exitCode = ToolRunner.run(conf, new Canary(executor, sink), args);<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    executor.shutdown();<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    System.exit(exitCode);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>}<a name="line.1244"></a>
+<span class="sourceLineNo">625</span>            }<a name="line.625"></a>
+<span class="sourceLineNo">626</span>          }<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>            monitorThread.interrupt();<a name="line.629"></a>
+<span class="sourceLineNo">630</span>            return monitor.errorCode;<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        } finally {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>          if (monitor != null) monitor.close();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        }<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>        Thread.sleep(interval);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      } while (interval &gt; 0);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    } // try-with-resources close<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    if (choreService != null) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>      choreService.shutdown();<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    return monitor.errorCode;<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>  private void printUsageAndExit() {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    System.err.printf(<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        getClass().getName());<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    System.err.println(" where [opts] are:");<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.err.println("   -help          Show this help and exit.");<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    System.err.println("      which means to enable regionserver mode");<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    System.err.println("      only works in regionserver mode.");<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        " default is true");<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.665"></a>
+<span class="sourceLineNo">666</span>        + " Default is hbase:canary");<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    System.err<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    System.exit(USAGE_EXIT_CODE);<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>   * A Factory method for {@link Monitor}.<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * Can be overridden by user.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @param index a start index for monitor target<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   * @param args args passed from user<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   * @return a Monitor instance<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   */<a name="line.678"></a>
+<span class="sourceLineNo">679</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Monitor monitor = null;<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    String[] monitorTargets = null;<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>    if(index &gt;= 0) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      int length = args.length - index;<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      monitorTargets = new String[length];<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.regionServerMode) {<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      monitor =<a name="line.690"></a>
+<span class="sourceLineNo">691</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.691"></a>
+<span class="sourceLineNo">692</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.692"></a>
+<span class="sourceLineNo">693</span>              this.treatFailureAsError);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    } else {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      monitor =<a name="line.695"></a>
+<span class="sourceLineNo">696</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.696"></a>
+<span class="sourceLineNo">697</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return monitor;<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">702</span>  // a Monitor super-class can be extended by users<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    protected Connection connection;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    protected Admin admin;<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    protected String[] targets;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    protected boolean useRegExp;<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    protected boolean treatFailureAsError;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    protected boolean initialized = false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>    protected boolean done = false;<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    protected int errorCode = 0;<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    protected Sink sink;<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    protected ExecutorService executor;<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>    public boolean isDone() {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      return done;<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>    public boolean hasError() {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      return errorCode != 0;<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">724</span><a name="line.724"></a>
+<span class="sourceLineNo">725</span>    public boolean finalCheckForErrors() {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      if (errorCode != 0) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        return true;<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      return treatFailureAsError &amp;&amp;<a name="line.729"></a>
+<span class="sourceLineNo">730</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>    @Override<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    public void close() throws IOException {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (this.admin != null) this.admin.close();<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.738"></a>
+<span class="sourceLineNo">739</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.740"></a>
+<span class="sourceLineNo">741</span><a name="line.741"></a>
+<span class="sourceLineNo">742</span>      this.connection = connection;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      this.targets = monitorTargets;<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      this.useRegExp = useRegExp;<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      this.sink = sink;<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      this.executor = executor;<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>    @Override<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    public abstract void run();<a name="line.751"></a>
+<span class="sourceLineNo">752</span><a name="line.752"></a>
+<span class="sourceLineNo">753</span>    protected boolean initAdmin() {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>      if (null == this.admin) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        try {<a name="line.755"></a>
+<span class="sourceLineNo">756</span>          this.admin = this.connection.getAdmin();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        } catch (Exception e) {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.758"></a>
+<span class="sourceLineNo">759</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
+<span class="sourceLineNo">761</span>      } else if (admin.isAborted()) {<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        LOG.error("HBaseAdmin aborted");<a name="line.762"></a>
+<span class="sourceLineNo">763</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      return !this.hasError();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
+<span class="sourceLineNo">767</span>  }<a name="line.767"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>  // a monitor for region mode<a name="line.769"></a>
+<span class="sourceLineNo">770</span>  private static class RegionMonitor extends Monitor {<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    // 10 minutes<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    // 1 days<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    private long lastCheckTime = -1;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    private boolean writeSniffing;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    private TableName writeTableName;<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private int writeDataTTL;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    private float regionsLowerLimit;<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    private float regionsUpperLimit;<a name="line.781"></a>
+<span class="sourceLineNo">782</span>    private int checkPeriod;<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.784"></a>
+<span class="sourceLineNo">785</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.785"></a>
+<span class="sourceLineNo">786</span>        boolean treatFailureAsError) {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      Configuration conf = connection.getConfiguration();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      this.writeSniffing = writeSniffing;<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      this.writeTableName = writeTableName;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      this.writeDataTTL =<a name="line.791"></a>
+<span class="sourceLineNo">792</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.792"></a>
+<span class="sourceLineNo">793</span>      this.regionsLowerLimit =<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      this.regionsUpperLimit =<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.796"></a>
+<span class="sourceLineNo">797</span>      this.checkPeriod =<a name="line.797"></a>
+<span class="sourceLineNo">798</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.798"></a>
+<span class="sourceLineNo">799</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    @Override<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    public void run() {<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      if (this.initAdmin()) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>        try {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>            this.initialized = true;<a name="line.809"></a>
+<span class="sourceLineNo">810</span>            for (String table : tables) {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.811"></a>
+<span class="sourceLineNo">812</span>            }<a name="line.812"></a>
+<span class="sourceLineNo">813</span>          } else {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.814"></a>
+<span class="sourceLineNo">815</span>          }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>          if (writeSniffing) {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>              try {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>                checkWriteTableDistribution();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>              } catch (IOException e) {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>              }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.824"></a>
+<span class="sourceLineNo">825</span>            }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>            // sniff canary table with write operation<a name="line.826"></a>
+<span class="sourceLineNo">827</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.827"></a>
+<span class="sourceLineNo">828</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.828"></a>
+<span class="sourceLineNo">829</span>          }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>            try {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>              future.get();<a name="line.833"></a>
+<span class="sourceLineNo">834</span>            } catch (ExecutionException e) {<a name="line.834"></a>
+<span class="sourceLineNo">835</span>              LOG.error("Sniff region failed!", e);<a name="line.835"></a>
+<span class="sourceLineNo">836</span>            }<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        } catch (Exception e) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>          LOG.error("Run regionMonitor failed", e);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          this.errorCode = ERROR_EXIT_CODE;<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>      this.done = true;<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>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>      String[] returnTables = null;<a name="line.847"></a>
+<span class="sourceLineNo">848</span><a name="line.848"></a>
+<span class="sourceLineNo">849</span>      if (this.useRegExp) {<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        Pattern pattern = null;<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        HTableDescriptor[] tds = null;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        try {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          if (LOG.isDebugEnabled()) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>            LOG.debug(String.format("reading list of tables"));<a name="line.855"></a>
+<span class="sourceLineNo">856</span>          }<a name="line.856"></a>
+<span class="sourceLineNo">857</span>          tds = this.admin.listTables(pattern);<a name="line.857"></a>
+<span class="sourceLineNo">858</span>          if (tds == null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            tds = new HTableDescriptor[0];<a name="line.859"></a>
+<span class="sourceLineNo">860</span>          }<a name="line.860"></a>
+<span class="sourceLineNo">861</span>          for (String monitorTarget : monitorTargets) {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>            pattern = Pattern.compile(monitorTarget);<a name="line.862"></a>
+<span class="sourceLineNo">863</span>            for (HTableDescriptor td : tds) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>                tmpTables.add(td.getNameAsString());<a name="line.865"></a>
+<span class="sourceLineNo">866</span>              }<a name="line.866"></a>
+<span class="sourceLineNo">867</span>            }<a name="line.867"></a>
+<span class="sourceLineNo">868</span>          }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        } catch (IOException e) {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>          LOG.error("Communicate with admin failed", e);<a name="line.870"></a>
+<span class="sourceLineNo">871</span>          throw e;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>        if (tmpTables.size() &gt; 0) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>        } else {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          LOG.error(msg);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          throw new TableNotFoundException(msg);<a name="line.880"></a>
+<span class="sourceLineNo">881</span>        }<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      } else {<a name="line.882"></a>
+<span class="sourceLineNo">88

<TRUNCATED>

[33/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html
index ccccc8d..d2f53d2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.AssignRegionAction.html
@@ -89,16 +89,16 @@
 <span class="sourceLineNo">081</span>      return UNKNOWN_RACK;<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">084</span><a name="line.84"></a>
 <span class="sourceLineNo">085</span>  /**<a name="line.85"></a>
 <span class="sourceLineNo">086</span>   * The constructor that uses the basic MetricsBalancer<a name="line.86"></a>
 <span class="sourceLineNo">087</span>   */<a name="line.87"></a>
 <span class="sourceLineNo">088</span>  protected BaseLoadBalancer() {<a name="line.88"></a>
 <span class="sourceLineNo">089</span>    metricsBalancer = new MetricsBalancer();<a name="line.89"></a>
 <span class="sourceLineNo">090</span>  }<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  <a name="line.91"></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>   * This Constructor accepts an instance of MetricsBalancer, <a name="line.93"></a>
+<span class="sourceLineNo">093</span>   * This Constructor accepts an instance of MetricsBalancer,<a name="line.93"></a>
 <span class="sourceLineNo">094</span>   * which will be used instead of creating a new one<a name="line.94"></a>
 <span class="sourceLineNo">095</span>   */<a name="line.95"></a>
 <span class="sourceLineNo">096</span>  protected BaseLoadBalancer(MetricsBalancer metricsBalancer) {<a name="line.96"></a>
@@ -1287,284 +1287,251 @@
 <span class="sourceLineNo">1279</span>  }<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>   * Generates an immediate assignment plan to be used by a new master for<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   * regions in transition that do not have an already known destination.<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>   *<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>   * Takes a list of regions that need immediate assignment and a list of all<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>   * available servers. Returns a map of regions to the server they should be<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * assigned to.<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   *<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   * This method will return quickly and does not do any intelligent balancing.<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>   * The goal is to make a fast decision not the best decision possible.<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>   *<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>   * Currently this is random.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>   *<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>   * @param regions<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>   * @param servers<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>   * @return map of regions to the server it should be assigned to<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>  public Map&lt;HRegionInfo, ServerName&gt; immediateAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      List&lt;ServerName&gt; servers) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    metricsBalancer.incrMiscInvocations();<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    if (servers == null || servers.isEmpty()) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      LOG.warn("Wanted to do random assignment but no servers to assign to");<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      return null;<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>    Map&lt;HRegionInfo, ServerName&gt; assignments = new TreeMap&lt;HRegionInfo, ServerName&gt;();<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    for (HRegionInfo region : regions) {<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>      assignments.put(region, randomAssignment(region, servers));<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    }<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    return assignments;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>  }<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span><a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>  /**<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>   * Used to assign a single region to a random server.<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>   */<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>  @Override<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>  public ServerName randomAssignment(HRegionInfo regionInfo, List&lt;ServerName&gt; servers) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    metricsBalancer.incrMiscInvocations();<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>        return masterServerName;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      }<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      // Guarantee not to put other regions on master<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      servers.remove(masterServerName);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    }<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span><a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>    if (numServers == 0) {<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      return null;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>    }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      return servers.get(0);<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>    List&lt;HRegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    return randomAssignment(cluster, regionInfo, servers);<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>  }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span><a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  /**<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>   * available/online servers available for assignment.<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>   * &lt;p&gt;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   * completely balanced.<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>   * &lt;p&gt;<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * assigned randomly to available servers.<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   *<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * @param regions regions and existing assignment from meta<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * @param servers available servers<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * @return map of servers and regions to be assigned to them<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   */<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>  @Override<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; retainAssignment(Map&lt;HRegionInfo, ServerName&gt; regions,<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      List&lt;ServerName&gt; servers) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    // Update metrics<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    metricsBalancer.incrMiscInvocations();<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      = assignMasterRegions(regions.keySet(), servers);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      // Guarantee not to put other regions on master<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      servers.remove(masterServerName);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      if (!masterRegions.isEmpty()) {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>        regions = new HashMap&lt;HRegionInfo, ServerName&gt;(regions);<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        for (HRegionInfo region: masterRegions) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>          regions.remove(region);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    if (regions == null || regions.isEmpty()) {<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      return assignments;<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
+<span class="sourceLineNo">1282</span>   * Used to assign a single region to a random server.<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>   */<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>  @Override<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>  public ServerName randomAssignment(HRegionInfo regionInfo, List&lt;ServerName&gt; servers) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>    metricsBalancer.incrMiscInvocations();<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        return masterServerName;<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      // Guarantee not to put other regions on master<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      servers.remove(masterServerName);<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span><a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>    if (numServers == 0) {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      return null;<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      return servers.get(0);<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>    List&lt;HRegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    return randomAssignment(cluster, regionInfo, servers);<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>  }<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span><a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  /**<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>   * available/online servers available for assignment.<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>   * &lt;p&gt;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>   * completely balanced.<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>   * &lt;p&gt;<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>   * assigned randomly to available servers.<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>   *<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>   * @param regions regions and existing assignment from meta<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>   * @param servers available servers<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>   * @return map of servers and regions to be assigned to them<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   */<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>  @Override<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; retainAssignment(Map&lt;HRegionInfo, ServerName&gt; regions,<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      List&lt;ServerName&gt; servers) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>    // Update metrics<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    metricsBalancer.incrMiscInvocations();<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      = assignMasterRegions(regions.keySet(), servers);<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      // Guarantee not to put other regions on master<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      servers.remove(masterServerName);<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      if (!masterRegions.isEmpty()) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        regions = new HashMap&lt;HRegionInfo, ServerName&gt;(regions);<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        for (HRegionInfo region: masterRegions) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          regions.remove(region);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    if (regions == null || regions.isEmpty()) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>      return assignments;<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    }<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    if (numServers == 0) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>      return null;<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      ServerName server = servers.get(0);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions.keySet()));<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>      return assignments;<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    }<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span><a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    // Group all of the old assignments by their hostname.<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    // We can't group directly by ServerName since the servers all have<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    // new start-codes.<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>    // servers on the same host on different ports.<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    for (ServerName server : servers) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>      serversByHostname.put(server.getHostname(), server);<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>    // Collection of the hostnames that used to have regions<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    // assigned, but for which we no longer have any RS running<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>    // after the cluster restart.<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span><a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    int numRandomAssignments = 0;<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    int numRetainedAssigments = 0;<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span><a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1381"></a>
 <span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    if (numServers == 0) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      return null;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    }<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      ServerName server = servers.get(0);<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions.keySet()));<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return assignments;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span><a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    // Group all of the old assignments by their hostname.<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    // We can't group directly by ServerName since the servers all have<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>    // new start-codes.<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span><a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    // servers on the same host on different ports.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    for (ServerName server : servers) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      serversByHostname.put(server.getHostname(), server);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    // Collection of the hostnames that used to have regions<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    // assigned, but for which we no longer have any RS running<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    // after the cluster restart.<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    int numRandomAssignments = 0;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    int numRetainedAssigments = 0;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span><a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    for (Map.Entry&lt;HRegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      HRegionInfo region = entry.getKey();<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>      ServerName oldServerName = entry.getValue();<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;ServerName&gt;();<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      if (oldServerName != null) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        localServers = serversByHostname.get(oldServerName.getHostname());<a name="line.1421"></a>
+<span class="sourceLineNo">1383</span>    for (Map.Entry&lt;HRegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      HRegionInfo region = entry.getKey();<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      ServerName oldServerName = entry.getValue();<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;ServerName&gt;();<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      if (oldServerName != null) {<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        localServers = serversByHostname.get(oldServerName.getHostname());<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      }<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      if (localServers.isEmpty()) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>        // No servers on the new cluster match up with this hostname,<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>        // assign randomly.<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>        ServerName randomServer = randomAssignment(cluster, region, servers);<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>        assignments.get(randomServer).add(region);<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        numRandomAssignments++;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        if (oldServerName != null) oldHostsNoLongerPresent.add(oldServerName.getHostname());<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      } else if (localServers.size() == 1) {<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>        // the usual case - one new server on same host<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>        ServerName target = localServers.get(0);<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>        assignments.get(target).add(region);<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>        cluster.doAssignRegion(region, target);<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>        numRetainedAssigments++;<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      } else {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>        // multiple new servers in the cluster on this same host<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        if (localServers.contains(oldServerName)) {<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>          assignments.get(oldServerName).add(region);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>          cluster.doAssignRegion(region, oldServerName);<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        } else {<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>          ServerName target = null;<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>          for (ServerName tmp: localServers) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>              target = tmp;<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>              break;<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>            }<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>          }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>          if (target == null) {<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>            target = randomAssignment(cluster, region, localServers);<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>          }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>          assignments.get(target).add(region);<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>        }<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>        numRetainedAssigments++;<a name="line.1421"></a>
 <span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      if (localServers.isEmpty()) {<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        // No servers on the new cluster match up with this hostname,<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>        // assign randomly.<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>        ServerName randomServer = randomAssignment(cluster, region, servers);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        assignments.get(randomServer).add(region);<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>        numRandomAssignments++;<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>        if (oldServerName != null) oldHostsNoLongerPresent.add(oldServerName.getHostname());<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      } else if (localServers.size() == 1) {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        // the usual case - one new server on same host<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>        ServerName target = localServers.get(0);<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        assignments.get(target).add(region);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>        cluster.doAssignRegion(region, target);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>        numRetainedAssigments++;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      } else {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        // multiple new servers in the cluster on this same host<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        if (localServers.contains(oldServerName)) {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>          assignments.get(oldServerName).add(region);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>          cluster.doAssignRegion(region, oldServerName);<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        } else {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>          ServerName target = null;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>          for (ServerName tmp: localServers) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>              target = tmp;<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>              break;<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>            }<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          }<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          if (target == null) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            target = randomAssignment(cluster, region, localServers);<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>          }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>          assignments.get(target).add(region);<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>        }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>        numRetainedAssigments++;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    }<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span><a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    String randomAssignMsg = "";<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>    if (numRandomAssignments &gt; 0) {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      randomAssignMsg =<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>          numRandomAssignments + " regions were assigned "<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<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>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    return assignments;<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  }<a name="line.1470"></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>    String randomAssignMsg = "";<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>    if (numRandomAssignments &gt; 0) {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      randomAssignMsg =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>          numRandomAssignments + " regions were assigned "<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    }<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    return assignments;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>  }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span><a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>  @Override<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>  public void initialize() throws HBaseIOException{<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>  }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span><a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>  @Override<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>  public void regionOnline(HRegionInfo regionInfo, ServerName sn) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>  }<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span><a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>  @Override<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>  public void regionOffline(HRegionInfo regionInfo) {<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>  @Override<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>  public boolean isStopped() {<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    return stopped;<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>  }<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span><a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>  @Override<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>  public void stop(String why) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    stopped = true;<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>  }<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span><a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>  /**<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>   * Used to assign a single region to a random server.<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>   */<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>  private ServerName randomAssignment(Cluster cluster, HRegionInfo regionInfo,<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>      List&lt;ServerName&gt; servers) {<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    ServerName sn = null;<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    final int maxIterations = numServers * 4;<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    int iterations = 0;<a name="line.1470"></a>
 <span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  @Override<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  public void initialize() throws HBaseIOException{<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>  }<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span><a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>  @Override<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>  public void regionOnline(HRegionInfo regionInfo, ServerName sn) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>  }<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>  @Override<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>  public void regionOffline(HRegionInfo regionInfo) {<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>  public boolean isStopped() {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>    return stopped;<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>  @Override<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  public void stop(String why) {<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>    stopped = true;<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>  }<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span><a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>  /**<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>   * Used to assign a single region to a random server.<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>   */<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>  private ServerName randomAssignment(Cluster cluster, HRegionInfo regionInfo,<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>      List&lt;ServerName&gt; servers) {<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>    ServerName sn = null;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>    final int maxIterations = numServers * 4;<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    int iterations = 0;<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    do {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>      int i = RANDOM.nextInt(numServers);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      sn = servers.get(i);<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    return sn;<a name="line.1511"></a>
+<span class="sourceLineNo">1472</span>    do {<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      int i = RANDOM.nextInt(numServers);<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      sn = servers.get(i);<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>    return sn;<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>  /**<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>   * Round robin a list of regions to a list of servers<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>   */<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>  private void roundRobinAssignment(Cluster cluster, List&lt;HRegionInfo&gt; regions,<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      List&lt;HRegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments) {<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>    int numServers = servers.size();<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    int numRegions = regions.size();<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>    int serverIdx = 0;<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    if (numServers &gt; 1) {<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    }<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    int regionIdx = 0;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      List&lt;HRegionInfo&gt; serverRegions = new ArrayList&lt;HRegionInfo&gt;(max);<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>        HRegionInfo region = regions.get(i % numRegions);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>          unassignedRegions.add(region);<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>        } else {<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>          serverRegions.add(region);<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>          cluster.doAssignRegion(region, server);<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>      assignments.put(server, serverRegions);<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      regionIdx++;<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    }<a name="line.1511"></a>
 <span class="sourceLineNo">1512</span>  }<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>
-<span class="sourceLineNo">1515</span>   * Round robin a list of regions to a list of servers<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>   */<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>  private void roundRobinAssignment(Cluster cluster, List&lt;HRegionInfo&gt; regions,<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>      List&lt;HRegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments) {<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span><a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    int numServers = servers.size();<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    int numRegions = regions.size();<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    int serverIdx = 0;<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    if (numServers &gt; 1) {<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    }<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>    int regionIdx = 0;<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span><a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>      List&lt;HRegionInfo&gt; serverRegions = new ArrayList&lt;HRegionInfo&gt;(max);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>        HRegionInfo region = regions.get(i % numRegions);<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>          unassignedRegions.add(region);<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>        } else {<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>          serverRegions.add(region);<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>          cluster.doAssignRegion(region, server);<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>        }<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      }<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      assignments.put(server, serverRegions);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>      regionIdx++;<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    }<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>  }<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span><a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>    Collection&lt;HRegionInfo&gt; regions) {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    } else {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      return new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    }<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>  }<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span><a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>  @Override<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>  }<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>}<a name="line.1559"></a>
+<span class="sourceLineNo">1514</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>    Collection&lt;HRegionInfo&gt; regions) {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    } else {<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>      return new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    }<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>  }<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span><a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>  @Override<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>  }<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>}<a name="line.1526"></a>
 
 
 


[36/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html
index 5cb57d5..ab01266 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html
@@ -309,52 +309,63 @@
 <span class="sourceLineNo">301</span>    StringBuilder sb = new StringBuilder();<a name="line.301"></a>
 <span class="sourceLineNo">302</span>    sb.append("HBase table split(");<a name="line.302"></a>
 <span class="sourceLineNo">303</span>    sb.append("table name: ").append(tableName);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    sb.append(", scan: ").append(scan);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    sb.append(", start row: ").append(Bytes.toStringBinary(startRow));<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    sb.append(", end row: ").append(Bytes.toStringBinary(endRow));<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    sb.append(", region location: ").append(regionLocation);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    sb.append(")");<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    return sb.toString();<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>  /**<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * Compares this split against the given one.<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   *<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   * @param split  The split to compare to.<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * @return The result of the comparison.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   * @see java.lang.Comparable#compareTo(java.lang.Object)<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   */<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  @Override<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  public int compareTo(TableSplit split) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    // If The table name of the two splits is the same then compare start row<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    // otherwise compare based on table names<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    int tableNameComparison =<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        getTable().compareTo(split.getTable());<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    return tableNameComparison != 0 ? tableNameComparison : Bytes.compareTo(<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        getStartRow(), split.getStartRow());<a name="line.326"></a>
-<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>  @Override<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  public boolean equals(Object o) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    if (o == null || !(o instanceof TableSplit)) {<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>    return tableName.equals(((TableSplit)o).tableName) &amp;&amp;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      Bytes.equals(startRow, ((TableSplit)o).startRow) &amp;&amp;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      Bytes.equals(endRow, ((TableSplit)o).endRow) &amp;&amp;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      regionLocation.equals(((TableSplit)o).regionLocation);<a name="line.337"></a>
+<span class="sourceLineNo">304</span>    // null scan input is represented by ""<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    String printScan = "";<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (!scan.equals("")) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      try {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        // get the real scan here in toString, not the Base64 string<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        printScan = TableMapReduceUtil.convertStringToScan(scan).toString();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      catch (IOException e) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        printScan = "";<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      }<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    }<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    sb.append(", scan: ").append(printScan);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    sb.append(", start row: ").append(Bytes.toStringBinary(startRow));<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    sb.append(", end row: ").append(Bytes.toStringBinary(endRow));<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    sb.append(", region location: ").append(regionLocation);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    sb.append(")");<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    return sb.toString();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  }<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>   * Compares this split against the given one.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   *<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * @param split  The split to compare to.<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * @return The result of the comparison.<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * @see java.lang.Comparable#compareTo(java.lang.Object)<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   */<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  @Override<a name="line.330"></a>
+<span class="sourceLineNo">331</span>  public int compareTo(TableSplit split) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    // If The table name of the two splits is the same then compare start row<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    // otherwise compare based on table names<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    int tableNameComparison =<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        getTable().compareTo(split.getTable());<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    return tableNameComparison != 0 ? tableNameComparison : Bytes.compareTo(<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        getStartRow(), split.getStartRow());<a name="line.337"></a>
 <span class="sourceLineNo">338</span>  }<a name="line.338"></a>
 <span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>    @Override<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    public int hashCode() {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        int result = tableName != null ? tableName.hashCode() : 0;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        result = 31 * result + (scan != null ? scan.hashCode() : 0);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>        result = 31 * result + (startRow != null ? Arrays.hashCode(startRow) : 0);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        result = 31 * result + (endRow != null ? Arrays.hashCode(endRow) : 0);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        result = 31 * result + (regionLocation != null ? regionLocation.hashCode() : 0);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        return result;<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>}<a name="line.349"></a>
+<span class="sourceLineNo">340</span>  @Override<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  public boolean equals(Object o) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (o == null || !(o instanceof TableSplit)) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      return false;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    return tableName.equals(((TableSplit)o).tableName) &amp;&amp;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      Bytes.equals(startRow, ((TableSplit)o).startRow) &amp;&amp;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      Bytes.equals(endRow, ((TableSplit)o).endRow) &amp;&amp;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      regionLocation.equals(((TableSplit)o).regionLocation);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    @Override<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    public int hashCode() {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        int result = tableName != null ? tableName.hashCode() : 0;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        result = 31 * result + (scan != null ? scan.hashCode() : 0);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        result = 31 * result + (startRow != null ? Arrays.hashCode(startRow) : 0);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        result = 31 * result + (endRow != null ? Arrays.hashCode(endRow) : 0);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        result = 31 * result + (regionLocation != null ? regionLocation.hashCode() : 0);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        return result;<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html
index 5cb57d5..ab01266 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/mapreduce/TableSplit.html
@@ -309,52 +309,63 @@
 <span class="sourceLineNo">301</span>    StringBuilder sb = new StringBuilder();<a name="line.301"></a>
 <span class="sourceLineNo">302</span>    sb.append("HBase table split(");<a name="line.302"></a>
 <span class="sourceLineNo">303</span>    sb.append("table name: ").append(tableName);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    sb.append(", scan: ").append(scan);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    sb.append(", start row: ").append(Bytes.toStringBinary(startRow));<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    sb.append(", end row: ").append(Bytes.toStringBinary(endRow));<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    sb.append(", region location: ").append(regionLocation);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    sb.append(")");<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    return sb.toString();<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>  /**<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * Compares this split against the given one.<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   *<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   * @param split  The split to compare to.<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * @return The result of the comparison.<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   * @see java.lang.Comparable#compareTo(java.lang.Object)<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   */<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  @Override<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  public int compareTo(TableSplit split) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    // If The table name of the two splits is the same then compare start row<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    // otherwise compare based on table names<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    int tableNameComparison =<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        getTable().compareTo(split.getTable());<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    return tableNameComparison != 0 ? tableNameComparison : Bytes.compareTo(<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        getStartRow(), split.getStartRow());<a name="line.326"></a>
-<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>  @Override<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  public boolean equals(Object o) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    if (o == null || !(o instanceof TableSplit)) {<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>    return tableName.equals(((TableSplit)o).tableName) &amp;&amp;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      Bytes.equals(startRow, ((TableSplit)o).startRow) &amp;&amp;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      Bytes.equals(endRow, ((TableSplit)o).endRow) &amp;&amp;<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      regionLocation.equals(((TableSplit)o).regionLocation);<a name="line.337"></a>
+<span class="sourceLineNo">304</span>    // null scan input is represented by ""<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    String printScan = "";<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (!scan.equals("")) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      try {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        // get the real scan here in toString, not the Base64 string<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        printScan = TableMapReduceUtil.convertStringToScan(scan).toString();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      catch (IOException e) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        printScan = "";<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      }<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    }<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    sb.append(", scan: ").append(printScan);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    sb.append(", start row: ").append(Bytes.toStringBinary(startRow));<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    sb.append(", end row: ").append(Bytes.toStringBinary(endRow));<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    sb.append(", region location: ").append(regionLocation);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    sb.append(")");<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    return sb.toString();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  }<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>   * Compares this split against the given one.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   *<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * @param split  The split to compare to.<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * @return The result of the comparison.<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * @see java.lang.Comparable#compareTo(java.lang.Object)<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   */<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  @Override<a name="line.330"></a>
+<span class="sourceLineNo">331</span>  public int compareTo(TableSplit split) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    // If The table name of the two splits is the same then compare start row<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    // otherwise compare based on table names<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    int tableNameComparison =<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        getTable().compareTo(split.getTable());<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    return tableNameComparison != 0 ? tableNameComparison : Bytes.compareTo(<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        getStartRow(), split.getStartRow());<a name="line.337"></a>
 <span class="sourceLineNo">338</span>  }<a name="line.338"></a>
 <span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>    @Override<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    public int hashCode() {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        int result = tableName != null ? tableName.hashCode() : 0;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        result = 31 * result + (scan != null ? scan.hashCode() : 0);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>        result = 31 * result + (startRow != null ? Arrays.hashCode(startRow) : 0);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>        result = 31 * result + (endRow != null ? Arrays.hashCode(endRow) : 0);<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        result = 31 * result + (regionLocation != null ? regionLocation.hashCode() : 0);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        return result;<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    }<a name="line.348"></a>
-<span class="sourceLineNo">349</span>}<a name="line.349"></a>
+<span class="sourceLineNo">340</span>  @Override<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  public boolean equals(Object o) {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (o == null || !(o instanceof TableSplit)) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      return false;<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    return tableName.equals(((TableSplit)o).tableName) &amp;&amp;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      Bytes.equals(startRow, ((TableSplit)o).startRow) &amp;&amp;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      Bytes.equals(endRow, ((TableSplit)o).endRow) &amp;&amp;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      regionLocation.equals(((TableSplit)o).regionLocation);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  }<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    @Override<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    public int hashCode() {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        int result = tableName != null ? tableName.hashCode() : 0;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        result = 31 * result + (scan != null ? scan.hashCode() : 0);<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        result = 31 * result + (startRow != null ? Arrays.hashCode(startRow) : 0);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>        result = 31 * result + (endRow != null ? Arrays.hashCode(endRow) : 0);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        result = 31 * result + (regionLocation != null ? regionLocation.hashCode() : 0);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>        return result;<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/master/LoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/LoadBalancer.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/LoadBalancer.html
index 8a3d540..4c19c1c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/LoadBalancer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/LoadBalancer.html
@@ -48,117 +48,102 @@
 <span class="sourceLineNo">040</span> * &lt;p&gt;Cluster-wide load balancing will occur only when there are no regions in<a name="line.40"></a>
 <span class="sourceLineNo">041</span> * transition and according to a fixed period of a time using {@link #balanceCluster(Map)}.<a name="line.41"></a>
 <span class="sourceLineNo">042</span> *<a name="line.42"></a>
-<span class="sourceLineNo">043</span> * &lt;p&gt;Inline region placement with {@link #immediateAssignment} can be used when<a name="line.43"></a>
-<span class="sourceLineNo">044</span> * the Master needs to handle closed regions that it currently does not have<a name="line.44"></a>
-<span class="sourceLineNo">045</span> * a destination set for.  This can happen during master failover.<a name="line.45"></a>
-<span class="sourceLineNo">046</span> *<a name="line.46"></a>
-<span class="sourceLineNo">047</span> * &lt;p&gt;On cluster startup, bulk assignment can be used to determine<a name="line.47"></a>
-<span class="sourceLineNo">048</span> * locations for all Regions in a cluster.<a name="line.48"></a>
-<span class="sourceLineNo">049</span> *<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * &lt;p&gt;This classes produces plans for the {@link AssignmentManager} to execute.<a name="line.50"></a>
-<span class="sourceLineNo">051</span> */<a name="line.51"></a>
-<span class="sourceLineNo">052</span>@InterfaceAudience.Private<a name="line.52"></a>
-<span class="sourceLineNo">053</span>public interface LoadBalancer extends Configurable, Stoppable, ConfigurationObserver {<a name="line.53"></a>
-<span class="sourceLineNo">054</span><a name="line.54"></a>
-<span class="sourceLineNo">055</span>  /**<a name="line.55"></a>
-<span class="sourceLineNo">056</span>   * Set the current cluster status.  This allows a LoadBalancer to map host name to a server<a name="line.56"></a>
-<span class="sourceLineNo">057</span>   * @param st<a name="line.57"></a>
-<span class="sourceLineNo">058</span>   */<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  void setClusterStatus(ClusterStatus st);<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>  /**<a name="line.62"></a>
-<span class="sourceLineNo">063</span>   * Set the master service.<a name="line.63"></a>
-<span class="sourceLineNo">064</span>   * @param masterServices<a name="line.64"></a>
-<span class="sourceLineNo">065</span>   */<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  void setMasterServices(MasterServices masterServices);<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  /**<a name="line.68"></a>
-<span class="sourceLineNo">069</span>   * Perform the major balance operation<a name="line.69"></a>
-<span class="sourceLineNo">070</span>   * @param tableName<a name="line.70"></a>
-<span class="sourceLineNo">071</span>   * @param clusterState<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   * @return List of plans<a name="line.72"></a>
-<span class="sourceLineNo">073</span>   */<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  List&lt;RegionPlan&gt; balanceCluster(TableName tableName, Map&lt;ServerName,<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      List&lt;HRegionInfo&gt;&gt; clusterState) throws HBaseIOException;<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>   * Perform the major balance operation<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   * @param clusterState<a name="line.79"></a>
-<span class="sourceLineNo">080</span>   * @return List of plans<a name="line.80"></a>
-<span class="sourceLineNo">081</span>   */<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  List&lt;RegionPlan&gt; balanceCluster(Map&lt;ServerName,<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      List&lt;HRegionInfo&gt;&gt; clusterState) throws HBaseIOException;<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span>  /**<a name="line.85"></a>
-<span class="sourceLineNo">086</span>   * Perform a Round Robin assignment of regions.<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   * @param regions<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * @param servers<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * @return Map of servername to regioninfos<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; roundRobinAssignment(<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    List&lt;HRegionInfo&gt; regions,<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    List&lt;ServerName&gt; servers<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  ) throws HBaseIOException;<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>   * Assign regions to the previously hosting region server<a name="line.97"></a>
-<span class="sourceLineNo">098</span>   * @param regions<a name="line.98"></a>
-<span class="sourceLineNo">099</span>   * @param servers<a name="line.99"></a>
-<span class="sourceLineNo">100</span>   * @return List of plans<a name="line.100"></a>
-<span class="sourceLineNo">101</span>   */<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  @Nullable<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; retainAssignment(<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    Map&lt;HRegionInfo, ServerName&gt; regions,<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    List&lt;ServerName&gt; servers<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  ) throws HBaseIOException;<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  /**<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   * Sync assign a region<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   * @param regions<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   * @param servers<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    * @return Map regioninfos to servernames<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   */<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  Map&lt;HRegionInfo, ServerName&gt; immediateAssignment(<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    List&lt;HRegionInfo&gt; regions,<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    List&lt;ServerName&gt; servers<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  ) throws HBaseIOException;<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  /**<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * Get a random region server from the list<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * @param regionInfo Region for which this selection is being done.<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   * @param servers<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   * @return Servername<a name="line.123"></a>
+<span class="sourceLineNo">043</span> * &lt;p&gt;On cluster startup, bulk assignment can be used to determine<a name="line.43"></a>
+<span class="sourceLineNo">044</span> * locations for all Regions in a cluster.<a name="line.44"></a>
+<span class="sourceLineNo">045</span> *<a name="line.45"></a>
+<span class="sourceLineNo">046</span> * &lt;p&gt;This classes produces plans for the {@link AssignmentManager} to execute.<a name="line.46"></a>
+<span class="sourceLineNo">047</span> */<a name="line.47"></a>
+<span class="sourceLineNo">048</span>@InterfaceAudience.Private<a name="line.48"></a>
+<span class="sourceLineNo">049</span>public interface LoadBalancer extends Configurable, Stoppable, ConfigurationObserver {<a name="line.49"></a>
+<span class="sourceLineNo">050</span><a name="line.50"></a>
+<span class="sourceLineNo">051</span>  /**<a name="line.51"></a>
+<span class="sourceLineNo">052</span>   * Set the current cluster status.  This allows a LoadBalancer to map host name to a server<a name="line.52"></a>
+<span class="sourceLineNo">053</span>   * @param st<a name="line.53"></a>
+<span class="sourceLineNo">054</span>   */<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  void setClusterStatus(ClusterStatus st);<a name="line.55"></a>
+<span class="sourceLineNo">056</span><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>   * Set the master service.<a name="line.59"></a>
+<span class="sourceLineNo">060</span>   * @param masterServices<a name="line.60"></a>
+<span class="sourceLineNo">061</span>   */<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  void setMasterServices(MasterServices masterServices);<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>   * Perform the major balance operation<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * @param tableName<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   * @param clusterState<a name="line.67"></a>
+<span class="sourceLineNo">068</span>   * @return List of plans<a name="line.68"></a>
+<span class="sourceLineNo">069</span>   */<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  List&lt;RegionPlan&gt; balanceCluster(TableName tableName, Map&lt;ServerName,<a name="line.70"></a>
+<span class="sourceLineNo">071</span>      List&lt;HRegionInfo&gt;&gt; clusterState) throws HBaseIOException;<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>   * Perform the major balance operation<a name="line.74"></a>
+<span class="sourceLineNo">075</span>   * @param clusterState<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * @return List of plans<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   */<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  List&lt;RegionPlan&gt; balanceCluster(Map&lt;ServerName,<a name="line.78"></a>
+<span class="sourceLineNo">079</span>      List&lt;HRegionInfo&gt;&gt; clusterState) throws HBaseIOException;<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>
+<span class="sourceLineNo">082</span>   * Perform a Round Robin assignment of regions.<a name="line.82"></a>
+<span class="sourceLineNo">083</span>   * @param regions<a name="line.83"></a>
+<span class="sourceLineNo">084</span>   * @param servers<a name="line.84"></a>
+<span class="sourceLineNo">085</span>   * @return Map of servername to regioninfos<a name="line.85"></a>
+<span class="sourceLineNo">086</span>   */<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; roundRobinAssignment(<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    List&lt;HRegionInfo&gt; regions,<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    List&lt;ServerName&gt; servers<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  ) throws HBaseIOException;<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>   * Assign regions to the previously hosting region server<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   * @param regions<a name="line.94"></a>
+<span class="sourceLineNo">095</span>   * @param servers<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   * @return List of plans<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   */<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  @Nullable<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; retainAssignment(<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    Map&lt;HRegionInfo, ServerName&gt; regions,<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    List&lt;ServerName&gt; servers<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  ) throws HBaseIOException;<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>  /**<a name="line.104"></a>
+<span class="sourceLineNo">105</span>   * Get a random region server from the list<a name="line.105"></a>
+<span class="sourceLineNo">106</span>   * @param regionInfo Region for which this selection is being done.<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * @param servers<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   * @return Servername<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   */<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  ServerName randomAssignment(<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    HRegionInfo regionInfo, List&lt;ServerName&gt; servers<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  ) throws HBaseIOException;<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  /**<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * Initialize the load balancer. Must be called after setters.<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   * @throws HBaseIOException<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   */<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  void initialize() throws HBaseIOException;<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
+<span class="sourceLineNo">120</span>  /**<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   * Marks the region as online at balancer.<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   * @param regionInfo<a name="line.122"></a>
+<span class="sourceLineNo">123</span>   * @param sn<a name="line.123"></a>
 <span class="sourceLineNo">124</span>   */<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  ServerName randomAssignment(<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    HRegionInfo regionInfo, List&lt;ServerName&gt; servers<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  ) throws HBaseIOException;<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  /**<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * Initialize the load balancer. Must be called after setters.<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * @throws HBaseIOException<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   */<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  void initialize() throws HBaseIOException;<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>  /**<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * Marks the region as online at balancer.<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   * @param regionInfo<a name="line.137"></a>
-<span class="sourceLineNo">138</span>   * @param sn<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   */<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  void regionOnline(HRegionInfo regionInfo, ServerName sn);<a name="line.140"></a>
-<span class="sourceLineNo">141</span><a name="line.141"></a>
-<span class="sourceLineNo">142</span>  /**<a name="line.142"></a>
-<span class="sourceLineNo">143</span>   * Marks the region as offline at balancer.<a name="line.143"></a>
-<span class="sourceLineNo">144</span>   * @param regionInfo<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   */<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  void regionOffline(HRegionInfo regionInfo);<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  /*<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   * Notification that config has changed<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * @param conf<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   */<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  void onConfigurationChange(Configuration conf);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>}<a name="line.153"></a>
+<span class="sourceLineNo">125</span>  void regionOnline(HRegionInfo regionInfo, ServerName sn);<a name="line.125"></a>
+<span class="sourceLineNo">126</span><a name="line.126"></a>
+<span class="sourceLineNo">127</span>  /**<a name="line.127"></a>
+<span class="sourceLineNo">128</span>   * Marks the region as offline at balancer.<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   * @param regionInfo<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   */<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  void regionOffline(HRegionInfo regionInfo);<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>
+<span class="sourceLineNo">134</span>   * Notification that config has changed<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   * @param conf<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   */<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  void onConfigurationChange(Configuration conf);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>}<a name="line.138"></a>
 
 
 


[32/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html
index ccccc8d..d2f53d2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.MoveRegionAction.html
@@ -89,16 +89,16 @@
 <span class="sourceLineNo">081</span>      return UNKNOWN_RACK;<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">084</span><a name="line.84"></a>
 <span class="sourceLineNo">085</span>  /**<a name="line.85"></a>
 <span class="sourceLineNo">086</span>   * The constructor that uses the basic MetricsBalancer<a name="line.86"></a>
 <span class="sourceLineNo">087</span>   */<a name="line.87"></a>
 <span class="sourceLineNo">088</span>  protected BaseLoadBalancer() {<a name="line.88"></a>
 <span class="sourceLineNo">089</span>    metricsBalancer = new MetricsBalancer();<a name="line.89"></a>
 <span class="sourceLineNo">090</span>  }<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  <a name="line.91"></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>   * This Constructor accepts an instance of MetricsBalancer, <a name="line.93"></a>
+<span class="sourceLineNo">093</span>   * This Constructor accepts an instance of MetricsBalancer,<a name="line.93"></a>
 <span class="sourceLineNo">094</span>   * which will be used instead of creating a new one<a name="line.94"></a>
 <span class="sourceLineNo">095</span>   */<a name="line.95"></a>
 <span class="sourceLineNo">096</span>  protected BaseLoadBalancer(MetricsBalancer metricsBalancer) {<a name="line.96"></a>
@@ -1287,284 +1287,251 @@
 <span class="sourceLineNo">1279</span>  }<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>   * Generates an immediate assignment plan to be used by a new master for<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   * regions in transition that do not have an already known destination.<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>   *<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>   * Takes a list of regions that need immediate assignment and a list of all<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>   * available servers. Returns a map of regions to the server they should be<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * assigned to.<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   *<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   * This method will return quickly and does not do any intelligent balancing.<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>   * The goal is to make a fast decision not the best decision possible.<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>   *<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>   * Currently this is random.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>   *<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>   * @param regions<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>   * @param servers<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>   * @return map of regions to the server it should be assigned to<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>  public Map&lt;HRegionInfo, ServerName&gt; immediateAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      List&lt;ServerName&gt; servers) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    metricsBalancer.incrMiscInvocations();<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    if (servers == null || servers.isEmpty()) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      LOG.warn("Wanted to do random assignment but no servers to assign to");<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      return null;<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>    Map&lt;HRegionInfo, ServerName&gt; assignments = new TreeMap&lt;HRegionInfo, ServerName&gt;();<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    for (HRegionInfo region : regions) {<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>      assignments.put(region, randomAssignment(region, servers));<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    }<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    return assignments;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>  }<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span><a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>  /**<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>   * Used to assign a single region to a random server.<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>   */<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>  @Override<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>  public ServerName randomAssignment(HRegionInfo regionInfo, List&lt;ServerName&gt; servers) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    metricsBalancer.incrMiscInvocations();<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>        return masterServerName;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      }<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      // Guarantee not to put other regions on master<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      servers.remove(masterServerName);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    }<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span><a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>    if (numServers == 0) {<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      return null;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>    }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      return servers.get(0);<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>    List&lt;HRegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    return randomAssignment(cluster, regionInfo, servers);<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>  }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span><a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  /**<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>   * available/online servers available for assignment.<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>   * &lt;p&gt;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   * completely balanced.<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>   * &lt;p&gt;<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * assigned randomly to available servers.<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   *<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * @param regions regions and existing assignment from meta<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * @param servers available servers<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * @return map of servers and regions to be assigned to them<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   */<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>  @Override<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; retainAssignment(Map&lt;HRegionInfo, ServerName&gt; regions,<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      List&lt;ServerName&gt; servers) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    // Update metrics<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    metricsBalancer.incrMiscInvocations();<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      = assignMasterRegions(regions.keySet(), servers);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      // Guarantee not to put other regions on master<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      servers.remove(masterServerName);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      if (!masterRegions.isEmpty()) {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>        regions = new HashMap&lt;HRegionInfo, ServerName&gt;(regions);<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        for (HRegionInfo region: masterRegions) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>          regions.remove(region);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    if (regions == null || regions.isEmpty()) {<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      return assignments;<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
+<span class="sourceLineNo">1282</span>   * Used to assign a single region to a random server.<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>   */<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>  @Override<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>  public ServerName randomAssignment(HRegionInfo regionInfo, List&lt;ServerName&gt; servers) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>    metricsBalancer.incrMiscInvocations();<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        return masterServerName;<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      // Guarantee not to put other regions on master<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      servers.remove(masterServerName);<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span><a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>    if (numServers == 0) {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      return null;<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      return servers.get(0);<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>    List&lt;HRegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    return randomAssignment(cluster, regionInfo, servers);<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>  }<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span><a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  /**<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>   * available/online servers available for assignment.<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>   * &lt;p&gt;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>   * completely balanced.<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>   * &lt;p&gt;<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>   * assigned randomly to available servers.<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>   *<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>   * @param regions regions and existing assignment from meta<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>   * @param servers available servers<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>   * @return map of servers and regions to be assigned to them<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   */<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>  @Override<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; retainAssignment(Map&lt;HRegionInfo, ServerName&gt; regions,<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      List&lt;ServerName&gt; servers) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>    // Update metrics<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    metricsBalancer.incrMiscInvocations();<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      = assignMasterRegions(regions.keySet(), servers);<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      // Guarantee not to put other regions on master<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      servers.remove(masterServerName);<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      if (!masterRegions.isEmpty()) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        regions = new HashMap&lt;HRegionInfo, ServerName&gt;(regions);<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        for (HRegionInfo region: masterRegions) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          regions.remove(region);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    if (regions == null || regions.isEmpty()) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>      return assignments;<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    }<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    if (numServers == 0) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>      return null;<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      ServerName server = servers.get(0);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions.keySet()));<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>      return assignments;<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    }<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span><a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    // Group all of the old assignments by their hostname.<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    // We can't group directly by ServerName since the servers all have<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    // new start-codes.<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>    // servers on the same host on different ports.<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    for (ServerName server : servers) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>      serversByHostname.put(server.getHostname(), server);<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>    // Collection of the hostnames that used to have regions<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    // assigned, but for which we no longer have any RS running<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>    // after the cluster restart.<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span><a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    int numRandomAssignments = 0;<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    int numRetainedAssigments = 0;<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span><a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1381"></a>
 <span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    if (numServers == 0) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      return null;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    }<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      ServerName server = servers.get(0);<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions.keySet()));<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return assignments;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span><a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    // Group all of the old assignments by their hostname.<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    // We can't group directly by ServerName since the servers all have<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>    // new start-codes.<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span><a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    // servers on the same host on different ports.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    for (ServerName server : servers) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      serversByHostname.put(server.getHostname(), server);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    // Collection of the hostnames that used to have regions<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    // assigned, but for which we no longer have any RS running<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    // after the cluster restart.<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    int numRandomAssignments = 0;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    int numRetainedAssigments = 0;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span><a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    for (Map.Entry&lt;HRegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      HRegionInfo region = entry.getKey();<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>      ServerName oldServerName = entry.getValue();<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;ServerName&gt;();<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      if (oldServerName != null) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        localServers = serversByHostname.get(oldServerName.getHostname());<a name="line.1421"></a>
+<span class="sourceLineNo">1383</span>    for (Map.Entry&lt;HRegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      HRegionInfo region = entry.getKey();<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      ServerName oldServerName = entry.getValue();<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;ServerName&gt;();<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      if (oldServerName != null) {<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        localServers = serversByHostname.get(oldServerName.getHostname());<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      }<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      if (localServers.isEmpty()) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>        // No servers on the new cluster match up with this hostname,<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>        // assign randomly.<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>        ServerName randomServer = randomAssignment(cluster, region, servers);<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>        assignments.get(randomServer).add(region);<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        numRandomAssignments++;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        if (oldServerName != null) oldHostsNoLongerPresent.add(oldServerName.getHostname());<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      } else if (localServers.size() == 1) {<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>        // the usual case - one new server on same host<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>        ServerName target = localServers.get(0);<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>        assignments.get(target).add(region);<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>        cluster.doAssignRegion(region, target);<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>        numRetainedAssigments++;<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      } else {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>        // multiple new servers in the cluster on this same host<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        if (localServers.contains(oldServerName)) {<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>          assignments.get(oldServerName).add(region);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>          cluster.doAssignRegion(region, oldServerName);<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        } else {<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>          ServerName target = null;<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>          for (ServerName tmp: localServers) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>              target = tmp;<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>              break;<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>            }<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>          }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>          if (target == null) {<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>            target = randomAssignment(cluster, region, localServers);<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>          }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>          assignments.get(target).add(region);<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>        }<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>        numRetainedAssigments++;<a name="line.1421"></a>
 <span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      if (localServers.isEmpty()) {<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        // No servers on the new cluster match up with this hostname,<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>        // assign randomly.<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>        ServerName randomServer = randomAssignment(cluster, region, servers);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        assignments.get(randomServer).add(region);<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>        numRandomAssignments++;<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>        if (oldServerName != null) oldHostsNoLongerPresent.add(oldServerName.getHostname());<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      } else if (localServers.size() == 1) {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        // the usual case - one new server on same host<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>        ServerName target = localServers.get(0);<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        assignments.get(target).add(region);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>        cluster.doAssignRegion(region, target);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>        numRetainedAssigments++;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      } else {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        // multiple new servers in the cluster on this same host<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        if (localServers.contains(oldServerName)) {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>          assignments.get(oldServerName).add(region);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>          cluster.doAssignRegion(region, oldServerName);<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        } else {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>          ServerName target = null;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>          for (ServerName tmp: localServers) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>              target = tmp;<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>              break;<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>            }<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          }<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          if (target == null) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            target = randomAssignment(cluster, region, localServers);<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>          }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>          assignments.get(target).add(region);<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>        }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>        numRetainedAssigments++;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    }<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span><a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    String randomAssignMsg = "";<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>    if (numRandomAssignments &gt; 0) {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      randomAssignMsg =<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>          numRandomAssignments + " regions were assigned "<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<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>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    return assignments;<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  }<a name="line.1470"></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>    String randomAssignMsg = "";<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>    if (numRandomAssignments &gt; 0) {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      randomAssignMsg =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>          numRandomAssignments + " regions were assigned "<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    }<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    return assignments;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>  }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span><a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>  @Override<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>  public void initialize() throws HBaseIOException{<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>  }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span><a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>  @Override<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>  public void regionOnline(HRegionInfo regionInfo, ServerName sn) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>  }<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span><a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>  @Override<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>  public void regionOffline(HRegionInfo regionInfo) {<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>  @Override<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>  public boolean isStopped() {<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    return stopped;<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>  }<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span><a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>  @Override<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>  public void stop(String why) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    stopped = true;<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>  }<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span><a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>  /**<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>   * Used to assign a single region to a random server.<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>   */<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>  private ServerName randomAssignment(Cluster cluster, HRegionInfo regionInfo,<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>      List&lt;ServerName&gt; servers) {<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    ServerName sn = null;<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    final int maxIterations = numServers * 4;<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    int iterations = 0;<a name="line.1470"></a>
 <span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  @Override<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  public void initialize() throws HBaseIOException{<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>  }<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span><a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>  @Override<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>  public void regionOnline(HRegionInfo regionInfo, ServerName sn) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>  }<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>  @Override<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>  public void regionOffline(HRegionInfo regionInfo) {<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>  public boolean isStopped() {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>    return stopped;<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>  @Override<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  public void stop(String why) {<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>    stopped = true;<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>  }<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span><a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>  /**<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>   * Used to assign a single region to a random server.<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>   */<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>  private ServerName randomAssignment(Cluster cluster, HRegionInfo regionInfo,<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>      List&lt;ServerName&gt; servers) {<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>    ServerName sn = null;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>    final int maxIterations = numServers * 4;<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    int iterations = 0;<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    do {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>      int i = RANDOM.nextInt(numServers);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      sn = servers.get(i);<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    return sn;<a name="line.1511"></a>
+<span class="sourceLineNo">1472</span>    do {<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      int i = RANDOM.nextInt(numServers);<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      sn = servers.get(i);<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>    return sn;<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>  /**<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>   * Round robin a list of regions to a list of servers<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>   */<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>  private void roundRobinAssignment(Cluster cluster, List&lt;HRegionInfo&gt; regions,<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      List&lt;HRegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments) {<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>    int numServers = servers.size();<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    int numRegions = regions.size();<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>    int serverIdx = 0;<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    if (numServers &gt; 1) {<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    }<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    int regionIdx = 0;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      List&lt;HRegionInfo&gt; serverRegions = new ArrayList&lt;HRegionInfo&gt;(max);<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>        HRegionInfo region = regions.get(i % numRegions);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>          unassignedRegions.add(region);<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>        } else {<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>          serverRegions.add(region);<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>          cluster.doAssignRegion(region, server);<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>      assignments.put(server, serverRegions);<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      regionIdx++;<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    }<a name="line.1511"></a>
 <span class="sourceLineNo">1512</span>  }<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>
-<span class="sourceLineNo">1515</span>   * Round robin a list of regions to a list of servers<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>   */<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>  private void roundRobinAssignment(Cluster cluster, List&lt;HRegionInfo&gt; regions,<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>      List&lt;HRegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments) {<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span><a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    int numServers = servers.size();<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    int numRegions = regions.size();<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    int serverIdx = 0;<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    if (numServers &gt; 1) {<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    }<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>    int regionIdx = 0;<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span><a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>      List&lt;HRegionInfo&gt; serverRegions = new ArrayList&lt;HRegionInfo&gt;(max);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>        HRegionInfo region = regions.get(i % numRegions);<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>          unassignedRegions.add(region);<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>        } else {<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>          serverRegions.add(region);<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>          cluster.doAssignRegion(region, server);<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>        }<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      }<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      assignments.put(server, serverRegions);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>      regionIdx++;<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    }<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>  }<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span><a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>    Collection&lt;HRegionInfo&gt; regions) {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    } else {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      return new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    }<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>  }<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span><a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>  @Override<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>  }<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>}<a name="line.1559"></a>
+<span class="sourceLineNo">1514</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>    Collection&lt;HRegionInfo&gt; regions) {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    } else {<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>      return new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    }<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>  }<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span><a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>  @Override<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>  }<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>}<a name="line.1526"></a>
 
 
 


[43/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html
index a01f79a..f40d2fc 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html
@@ -105,7 +105,7 @@
 <hr>
 <br>
 <pre><a href="../../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.LimitedPrivate.html" title="annotation in org.apache.hadoop.hbase.classification">@InterfaceAudience.LimitedPrivate</a>(<a href="../../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.LimitedPrivate.html#value()">value</a>="Configuration")
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html#line.60">SimpleLoadBalancer</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html#line.56">SimpleLoadBalancer</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">Makes decisions about the placement and movement of Regions across
  RegionServers.
@@ -113,14 +113,10 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
  <p>Cluster-wide load balancing will occur only when there are no regions in
  transition and according to a fixed period of a time using <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html#balanceCluster(java.util.Map)"><code>balanceCluster(Map)</code></a>.
 
- <p>Inline region placement with <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)"><code>BaseLoadBalancer.immediateAssignment(java.util.List&lt;org.apache.hadoop.hbase.HRegionInfo&gt;, java.util.List&lt;org.apache.hadoop.hbase.ServerName&gt;)</code></a> can be used when
- the Master needs to handle closed regions that it currently does not have
- a destination set for.  This can happen during master failover.
-
  <p>On cluster startup, bulk assignment can be used to determine
  locations for all Regions in a cluster.
 
- <p>This classes produces plans for the 
+ <p>This classes produces plans for the
  <a href="../../../../../../org/apache/hadoop/hbase/master/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master"><code>AssignmentManager</code></a> to execute.</div>
 </li>
 </ul>
@@ -253,7 +249,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <!--   -->
 </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#areSomeRegionReplicasColocated(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster)">areSomeRegionReplicasColocated</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#assignMasterRegions(java.util.Collection,%20java.util.List)">assignMasterRegions</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,%20java.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)">getRegionAssignmentsBySe
 rver</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getTablesOnMaster(org.apache.hadoop.conf.Configuration)">getTablesOnMaster</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)">immediateAssignment</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#needsBalance(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster)">needsBalance</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#onConfigurationChange(org.apache.hadoop.conf.Configuration)">onConfigurationChange</a>, <a href="../../../../../../org/apache/hadoop/hbas
 e/master/balancer/BaseLoadBalancer.html#randomAssignment(org.apache.hadoop.hbase.HRegionInfo,%20java.util.List)">randomAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOffline(org.apache.hadoop.hbase.HRegionInfo)">regionOffline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOnline(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.ServerName)">regionOnline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment(java.util.List,%20java.util.List)">roundRobinAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setClusterStatus(org.apache.hadoop.hbase.ClusterStatus)">setClusterStatus</a>, <a hr
 ef="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setConf(org.apache.hadoop.conf.Configuration)">setConf</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#setSlop(org.apache.hadoop.conf.Configuration)">setSlop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#shouldBeOnMaster(org.apache.hadoop.hbase.HRegionInfo)">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/B
 aseLoadBalancer.html#tablesOnMaster(org.apache.hadoop.conf.Configuration)">tablesOnMaster</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#areSomeRegionReplicasColocated(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster)">areSomeRegionReplicasColocated</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#assignMasterRegions(java.util.Collection,%20java.util.List)">assignMasterRegions</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,%20java.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)">getRegionAssignmentsBySe
 rver</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#getTablesOnMaster(org.apache.hadoop.conf.Configuration)">getTablesOnMaster</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#needsBalance(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster)">needsBalance</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#onConfigurationChange(org.apache.hadoop.conf.Configuration)">onConfigurationChange</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#randomAssignment(org.apache.hadoop.hbase.HRegionInfo,%20java.util.List)">randomAssignment</a>, <a href="../../../../../../org/apa
 che/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOffline(org.apache.hadoop.hbase.HRegionInfo)">regionOffline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOnline(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.ServerName)">regionOnline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment(java.util.List,%20java.util.List)">roundRobinAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setClusterStatus(org.apache.hadoop.hbase.ClusterStatus)">setClusterStatus</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#setConf(org.apache.hadoop.conf.Configuration)">setConf</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#setSlop(org.apache.hadoop.conf.Configuration)">setSlop</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#shouldBeOnMaster(org.apache.hadoop.hbase.HRegionInfo)">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#tablesOnMaster(org.apache.hadoop.conf.Configuration)">tablesOnMaster</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
@@ -282,7 +278,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html#line.61">LOG</a></pre>
+<pre>private static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html#line.57">LOG</a></pre>
 </li>
 </ul>
 <a name="RANDOM">
@@ -291,7 +287,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <ul class="blockList">
 <li class="blockList">
 <h4>RANDOM</h4>
-<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/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/SimpleLoadBalancer.html#line.62">RANDOM</a></pre>
+<pre>private static final&nbsp;<a href="http://docs.oracle.com/javase/7/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/SimpleLoadBalancer.html#line.58">RANDOM</a></pre>
 </li>
 </ul>
 <a name="riComparator">
@@ -300,7 +296,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <ul class="blockList">
 <li class="blockList">
 <h4>riComparator</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/RegionInfoComparator.html" title="class in org.apache.hadoop.hbase.master.balancer">RegionInfoComparator</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html#line.64">riComparator</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/RegionInfoComparator.html" title="class in org.apache.hadoop.hbase.master.balancer">RegionInfoComparator</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html#line.60">riComparator</a></pre>
 </li>
 </ul>
 <a name="rpComparator">
@@ -309,7 +305,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <ul class="blockListLast">
 <li class="blockList">
 <h4>rpComparator</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.RegionPlanComparator.html" title="class in org.apache.hadoop.hbase.master">RegionPlan.RegionPlanComparator</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html#line.65">rpComparator</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.RegionPlanComparator.html" title="class in org.apache.hadoop.hbase.master">RegionPlan.RegionPlanComparator</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html#line.61">rpComparator</a></pre>
 </li>
 </ul>
 </li>
@@ -326,7 +322,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SimpleLoadBalancer</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html#line.60">SimpleLoadBalancer</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html#line.56">SimpleLoadBalancer</a>()</pre>
 </li>
 </ul>
 </li>
@@ -343,7 +339,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <ul class="blockList">
 <li class="blockList">
 <h4>balanceCluster</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/SimpleLoadBalancer.html#line.185">balanceCluster</a>(<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;clusterMap)</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/SimpleLoadBalancer.html#line.181">balanceCluster</a>(<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;clusterMap)</pre>
 <div class="block">Generate a global load balancing plan according to the specified map of
  server information to the most loaded regions of each server.
 
@@ -434,7 +430,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <ul class="blockList">
 <li class="blockList">
 <h4>addRegionPlan</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html#line.430">addRegionPlan</a>(com.google.common.collect.MinMaxPriorityQueue&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;regionsToMove,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.html#line.426">addRegionPlan</a>(com.google.common.collect.MinMaxPriorityQueue&lt;<a href="../../../../../../org/apache/hadoop/hbase/master/RegionPlan.html" title="class in org.apache.hadoop.hbase.master">RegionPlan</a>&gt;&nbsp;regionsToMove,
                  boolean&nbsp;fetchFromTail,
                  <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn,
                  <a href="http://docs.oracle.com/javase/7/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;regionsToReturn)</pre>
@@ -447,7 +443,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <ul class="blockListLast">
 <li class="blockList">
 <h4>balanceCluster</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/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/SimpleLoadBalancer.html#line.440">balanceCluster</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="http://docs.oracle.com/javase/7/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/SimpleLoadBalancer.html#line.436">balanceCluster</a>(<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                               <a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&gt;&gt;&nbsp;clusterState)
                                 throws <a href="../../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html#balanceCluster(org.apache.hadoop.hbase.TableName,%20java.util.Map)">LoadBalancer</a></code></strong></div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
index 856770b..d4f5213 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.html
@@ -553,7 +553,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseL
 <!--   -->
 </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#assignMasterRegions(java.util.Collection,%20java.util.List)">assignMasterRegions</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,%20java.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#getTablesOnMaster(org.apache.hadoop.conf.Configuration)">getTablesOnMaster</a>, <a href="../../../../../../org/apache/hadoop
 /hbase/master/balancer/BaseLoadBalancer.html#immediateAssignment(java.util.List,%20java.util.List)">immediateAssignment</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#needsBalance(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster)">needsBalance</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#randomAssignment(org.apache.hadoop.hbase.HRegionInfo,%20java.util.List)">randomAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOffline(org.apache.hadoop.hbase.HRegionInfo)">regionOffline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOnline(org
 .apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.ServerName)">regionOnline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment(java.util.List,%20java.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.HRegionInfo)">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#tablesOnMaster(org.apache.
 hadoop.conf.Configuration)">tablesOnMaster</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#assignMasterRegions(java.util.Collection,%20java.util.List)">assignMasterRegions</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,%20java.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#getTablesOnMaster(org.apache.hadoop.conf.Configuration)">getTablesOnMaster</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#needsBalance(org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.Cluster)">needsBalance</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#randomAssignment(org.apache.hadoop.hbase.HRegionInfo,%20java.util.List)">randomAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOffline(org.apache.hadoop.hbase.HRegionInfo)">regionOffline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#regionOnline(org.apache.hadoop.hbase.HRegionInfo,%20org.apache.hadoop.hbase.ServerName)">regionOnline</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBal
 ancer.html#retainAssignment(java.util.Map,%20java.util.List)">retainAssignment</a>, <a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#roundRobinAssignment(java.util.List,%20java.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.HRegionInfo)">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#tablesOnMaster(org.apache.hadoop.conf.Configuration)">tablesOnMaster</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/master/balancer/class-use/MetricsBalancer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/class-use/MetricsBalancer.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/class-use/MetricsBalancer.html
index d6d75ae..e34d51b 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/class-use/MetricsBalancer.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/class-use/MetricsBalancer.html
@@ -124,7 +124,7 @@
 <tbody>
 <tr class="altColor">
 <td class="colLast"><code><strong><a href="../../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.html#BaseLoadBalancer(org.apache.hadoop.hbase.master.balancer.MetricsBalancer)">BaseLoadBalancer</a></strong>(<a href="../../../../../../../org/apache/hadoop/hbase/master/balancer/MetricsBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">MetricsBalancer</a>&nbsp;metricsBalancer)</code>
-<div class="block">This Constructor accepts an instance of MetricsBalancer, 
+<div class="block">This Constructor accepts an instance of MetricsBalancer,
  which will be used instead of creating a new one</div>
 </td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
index 7c5790f..0d67717 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -318,11 +318,11 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="strong">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="strong">RegionState.State</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="strong">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="strong">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="strong">SplitLogManager.TerminationStatus</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="strong">MetricsMasterSourceFactoryImpl.FactoryStorage</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="strong">RegionState.State</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index 4fdb5f6..9a1d271 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -352,8 +352,8 @@
 </ul>
 <h2 title="Annotation Type Hierarchy">Annotation Type Hierarchy</h2>
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/VersionAnnotation.html" title="annotation in org.apache.hadoop.hbase"><span class="strong">VersionAnnotation</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaMutationAnnotation.html" title="annotation in org.apache.hadoop.hbase"><span class="strong">MetaMutationAnnotation</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/VersionAnnotation.html" title="annotation in org.apache.hadoop.hbase"><span class="strong">VersionAnnotation</span></a> (implements java.lang.annotation.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Annotation.html?is-external=true" title="class or interface in java.lang.annotation">Annotation</a>)</li>
 </ul>
 <h2 title="Enum Hierarchy">Enum Hierarchy</h2>
 <ul>
@@ -362,13 +362,13 @@
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="strong">CompatibilitySingletonFactory.SingletonStorage</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="strong">HealthChecker.HealthCheckerExitStatus</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="strong">KeepDeletedCells</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="strong">MetaTableAccessor.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="strong">KeyValue.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.Modify.html" title="enum in org.apache.hadoop.hbase"><span class="strong">HConstants.Modify</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="strong">Coprocessor.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="strong">MetaTableAccessor.QueryType</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="strong">HealthChecker.HealthCheckerExitStatus</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="strong">HConstants.OperationStatusCode</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="strong">KeyValue.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="strong">KeepDeletedCells</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
index 3b324d7..427fb12 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -172,11 +172,11 @@
 <ul>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="strong">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="http://docs.oracle.com/javase/7/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="http://docs.oracle.com/javase/7/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/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="strong">QuotaType</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="strong">OperationQuota.OperationType</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="strong">ThrottleType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="strong">ThrottlingException.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="strong">QuotaScope</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="strong">QuotaType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="strong">ThrottlingException.Type</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
index 3b2de32..cdde127 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
@@ -107,7 +107,7 @@
 </dl>
 <hr>
 <br>
-<pre> class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5394">HRegion.RegionScannerImpl</a>
+<pre> class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5406">HRegion.RegionScannerImpl</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallback.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallback</a></pre>
 <div class="block">RegionScannerImpl is used to combine scanners from multiple Stores (aka column families).</div>
@@ -411,7 +411,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>storeHeap</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5396">storeHeap</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5408">storeHeap</a></pre>
 </li>
 </ul>
 <a name="joinedHeap">
@@ -420,7 +420,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>joinedHeap</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5399">joinedHeap</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5411">joinedHeap</a></pre>
 <div class="block">Heap of key-values that are not essential for the provided filters and are thus read
  on demand, if on-demand column family loading is enabled.</div>
 </li>
@@ -431,7 +431,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>joinedContinuationRow</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5403">joinedContinuationRow</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5415">joinedContinuationRow</a></pre>
 <div class="block">If the joined heap data gathering is interrupted due to scan limits, this will
  contain the row for which we are populating the values.</div>
 </li>
@@ -442,7 +442,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>filterClosed</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5404">filterClosed</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5416">filterClosed</a></pre>
 </li>
 </ul>
 <a name="isScan">
@@ -451,7 +451,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>isScan</h4>
-<pre>protected final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5406">isScan</a></pre>
+<pre>protected final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5418">isScan</a></pre>
 </li>
 </ul>
 <a name="stopRow">
@@ -460,7 +460,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>stopRow</h4>
-<pre>protected final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5407">stopRow</a></pre>
+<pre>protected final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5419">stopRow</a></pre>
 </li>
 </ul>
 <a name="region">
@@ -469,7 +469,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5408">region</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5420">region</a></pre>
 </li>
 </ul>
 <a name="comparator">
@@ -478,7 +478,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>comparator</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5409">comparator</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5421">comparator</a></pre>
 </li>
 </ul>
 <a name="copyCellsFromSharedMem">
@@ -487,7 +487,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>copyCellsFromSharedMem</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5410">copyCellsFromSharedMem</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5422">copyCellsFromSharedMem</a></pre>
 </li>
 </ul>
 <a name="readPt">
@@ -496,7 +496,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>readPt</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5412">readPt</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5424">readPt</a></pre>
 </li>
 </ul>
 <a name="maxResultSize">
@@ -505,7 +505,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>maxResultSize</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5413">maxResultSize</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5425">maxResultSize</a></pre>
 </li>
 </ul>
 <a name="defaultScannerContext">
@@ -514,7 +514,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>defaultScannerContext</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5414">defaultScannerContext</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5426">defaultScannerContext</a></pre>
 </li>
 </ul>
 <a name="filter">
@@ -523,7 +523,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockListLast">
 <li class="blockList">
 <h4>filter</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.html" title="class in org.apache.hadoop.hbase.filter">FilterWrapper</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5415">filter</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.html" title="class in org.apache.hadoop.hbase.filter">FilterWrapper</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5427">filter</a></pre>
 </li>
 </ul>
 </li>
@@ -540,7 +540,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HRegion.RegionScannerImpl</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5426">HRegion.RegionScannerImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5438">HRegion.RegionScannerImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                          <a href="http://docs.oracle.com/javase/7/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/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;additionalScanners,
                          <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                          boolean&nbsp;copyCellsFromSharedMem)
@@ -563,7 +563,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionInfo</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5418">getRegionInfo</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HRegionInfo.html" title="class in org.apache.hadoop.hbase">HRegionInfo</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5430">getRegionInfo</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#getRegionInfo()">getRegionInfo</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a></code></dd>
@@ -576,7 +576,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>setCopyCellsFromSharedMem</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5422">setCopyCellsFromSharedMem</a>(boolean&nbsp;copyCells)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5434">setCopyCellsFromSharedMem</a>(boolean&nbsp;copyCells)</pre>
 </li>
 </ul>
 <a name="initializeKVHeap(java.util.List, java.util.List, org.apache.hadoop.hbase.regionserver.HRegion)">
@@ -585,7 +585,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>initializeKVHeap</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5490">initializeKVHeap</a>(<a href="http://docs.oracle.com/javase/7/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/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;scanners,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5502">initializeKVHeap</a>(<a href="http://docs.oracle.com/javase/7/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/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;scanners,
                     <a href="http://docs.oracle.com/javase/7/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/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;joinedScanners,
                     <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region)
                          throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -599,7 +599,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxResultSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5500">getMaxResultSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5512">getMaxResultSize</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#getMaxResultSize()">getMaxResultSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a></code></dd>
@@ -613,7 +613,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getMvccReadPoint</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5505">getMvccReadPoint</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5517">getMvccReadPoint</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#getMvccReadPoint()">getMvccReadPoint</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a></code></dd>
@@ -626,7 +626,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getBatch</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5510">getBatch</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5522">getBatch</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#getBatch()">getBatch</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a></code></dd>
@@ -640,7 +640,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>resetFilters</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5519">resetFilters</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5531">resetFilters</a>()
                      throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Reset both the filter and the old filter.</div>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -653,7 +653,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>next</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5526">next</a>(<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5538">next</a>(<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults)
              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html#next(java.util.List)">InternalScanner</a></code></strong></div>
 <div class="block">Grab the next row's worth of values.</div>
@@ -672,7 +672,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>next</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5533">next</a>(<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5545">next</a>(<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults,
            <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)
              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html#next(java.util.List,%20org.apache.hadoop.hbase.regionserver.ScannerContext)">InternalScanner</a></code></strong></div>
@@ -692,7 +692,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>nextRaw</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5550">nextRaw</a>(<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5562">nextRaw</a>(<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults)
                 throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#nextRaw(java.util.List)">RegionScanner</a></code></strong></div>
 <div class="block">Grab the next row's worth of values. This is a special internal method to be called from
@@ -714,7 +714,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>nextRaw</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5556">nextRaw</a>(<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5568">nextRaw</a>(<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults,
               <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)
                 throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#nextRaw(java.util.List,%20org.apache.hadoop.hbase.regionserver.ScannerContext)">RegionScanner</a></code></strong></div>
@@ -756,7 +756,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>populateFromJoinedHeap</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5611">populateFromJoinedHeap</a>(<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5623">populateFromJoinedHeap</a>(<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
                              <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)
                                 throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>true if more cells exist after this batch, false if scanner is done</dd>
@@ -770,7 +770,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>populateResult</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5635">populateResult</a>(<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5647">populateResult</a>(<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
                      <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a>&nbsp;heap,
                      <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext,
                      <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)
@@ -789,7 +789,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>moreCellsInRow</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5680">moreCellsInRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;nextKv,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5692">moreCellsInRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;nextKv,
                      <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)</pre>
 <div class="block">Based on the nextKv in the heap, and the current row, decide whether or not there are more
  cells to be read in the heap. If the row of the nextKv in the heap matches the current row
@@ -804,7 +804,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>isFilterDone</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5688">isFilterDone</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5700">isFilterDone</a>()
                      throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -820,7 +820,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>isFilterDoneInternal</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5692">isFilterDoneInternal</a>()
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5704">isFilterDoneInternal</a>()
                               throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -832,7 +832,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>nextInternal</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5696">nextInternal</a>(<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5708">nextInternal</a>(<a href="http://docs.oracle.com/javase/7/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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
                    <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)
                       throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -845,7 +845,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>incrementCountOfRowsFilteredMetric</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5895">incrementCountOfRowsFilteredMetric</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5907">incrementCountOfRowsFilteredMetric</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)</pre>
 </li>
 </ul>
 <a name="incrementCountOfRowsScannedMetric(org.apache.hadoop.hbase.regionserver.ScannerContext)">
@@ -854,7 +854,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>incrementCountOfRowsScannedMetric</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5903">incrementCountOfRowsScannedMetric</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5915">incrementCountOfRowsScannedMetric</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)</pre>
 </li>
 </ul>
 <a name="joinedHeapMayHaveData(org.apache.hadoop.hbase.Cell)">
@@ -863,7 +863,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>joinedHeapMayHaveData</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5914">joinedHeapMayHaveData</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5926">joinedHeapMayHaveData</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)
                                throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>currentRowCell</code> - </dd>
 <dt><span class="strong">Returns:</span></dt><dd>true when the joined heap may have data for the current row</dd>
@@ -877,7 +877,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>filterRow</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5941">filterRow</a>()
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5953">filterRow</a>()
                    throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">This function is to maintain backward compatibility for 0.94 filters. HBASE-6429 combines
  both filterRow & filterRow(<code>List&lt;KeyValue&gt; kvs</code>) functions. While 0.94 code or older,
@@ -894,7 +894,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>filterRowKey</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5948">filterRowKey</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;current)
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5960">filterRowKey</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;current)
                       throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -906,7 +906,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>nextRow</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5952">nextRow</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext,
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5964">nextRow</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext,
               <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;curRowCell)
                    throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -919,7 +919,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>isStopRow</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5967">isStopRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5979">isStopRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)</pre>
 </li>
 </ul>
 <a name="close()">
@@ -928,7 +928,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5973">close</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5985">close</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html#close()">InternalScanner</a></code></strong></div>
 <div class="block">Closes the scanner and releases any resources it has allocated</div>
 <dl>
@@ -947,7 +947,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreHeapForTesting</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5987">getStoreHeapForTesting</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5999">getStoreHeapForTesting</a>()</pre>
 </li>
 </ul>
 <a name="reseek(byte[])">
@@ -956,7 +956,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>reseek</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.5992">reseek</a>(byte[]&nbsp;row)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6004">reseek</a>(byte[]&nbsp;row)
                throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#reseek(byte[])">RegionScanner</a></code></strong></div>
 <div class="block">Do a reseek to the required row. Should not be used to seek to a key which
@@ -975,7 +975,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>handleFileNotFound</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6013">handleFileNotFound</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/FileNotFoundException.html?is-external=true" title="class or interface in java.io">FileNotFoundException</a>&nbsp;fnfe)
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6025">handleFileNotFound</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/io/FileNotFoundException.html?is-external=true" title="class or interface in java.io">FileNotFoundException</a>&nbsp;fnfe)
                                 throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -987,7 +987,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>abortRegionServer</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6028">abortRegionServer</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;msg)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6040">abortRegionServer</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;msg)
                         throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd></dl>
@@ -999,7 +999,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>shipped</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6036">shipped</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6048">shipped</a>()
              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.html#shipped()">Shipper</a></code></strong></div>
 <div class="block">Called after a batch of rows scanned and set to be returned to client. Any in between cleanup
@@ -1017,7 +1017,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6046">run</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6058">run</a>()
          throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallback.html#run()">RpcCallback</a></code></strong></div>
 <div class="block">Called at the end of an Rpc Call <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html" title="interface in org.apache.hadoop.hbase.ipc"><code>RpcCallContext</code></a></div>


[13/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
index c2ab698..75a1f7f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html
@@ -33,10 +33,10 @@
 <span class="sourceLineNo">025</span>  requiredArguments = {<a name="line.25"></a>
 <span class="sourceLineNo">026</span>    @org.jamon.annotations.Argument(name = "regionServer", type = "HRegionServer")},<a name="line.26"></a>
 <span class="sourceLineNo">027</span>  optionalArguments = {<a name="line.27"></a>
-<span class="sourceLineNo">028</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.28"></a>
-<span class="sourceLineNo">029</span>    @org.jamon.annotations.Argument(name = "bcn", type = "String"),<a name="line.29"></a>
-<span class="sourceLineNo">030</span>    @org.jamon.annotations.Argument(name = "bcv", type = "String"),<a name="line.30"></a>
-<span class="sourceLineNo">031</span>    @org.jamon.annotations.Argument(name = "filter", type = "String")})<a name="line.31"></a>
+<span class="sourceLineNo">028</span>    @org.jamon.annotations.Argument(name = "filter", type = "String"),<a name="line.28"></a>
+<span class="sourceLineNo">029</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.29"></a>
+<span class="sourceLineNo">030</span>    @org.jamon.annotations.Argument(name = "bcn", type = "String"),<a name="line.30"></a>
+<span class="sourceLineNo">031</span>    @org.jamon.annotations.Argument(name = "bcv", type = "String")})<a name="line.31"></a>
 <span class="sourceLineNo">032</span>public class RSStatusTmpl<a name="line.32"></a>
 <span class="sourceLineNo">033</span>  extends org.jamon.AbstractTemplateProxy<a name="line.33"></a>
 <span class="sourceLineNo">034</span>{<a name="line.34"></a>
@@ -77,74 +77,74 @@
 <span class="sourceLineNo">069</span>      return m_regionServer;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>    }<a name="line.70"></a>
 <span class="sourceLineNo">071</span>    private HRegionServer m_regionServer;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    // 22, 1<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    public void setFormat(String format)<a name="line.73"></a>
+<span class="sourceLineNo">072</span>    // 21, 1<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    public void setFilter(String filter)<a name="line.73"></a>
 <span class="sourceLineNo">074</span>    {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      // 22, 1<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      m_format = format;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      m_format__IsNotDefault = true;<a name="line.77"></a>
+<span class="sourceLineNo">075</span>      // 21, 1<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      m_filter = filter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      m_filter__IsNotDefault = true;<a name="line.77"></a>
 <span class="sourceLineNo">078</span>    }<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public String getFormat()<a name="line.79"></a>
+<span class="sourceLineNo">079</span>    public String getFilter()<a name="line.79"></a>
 <span class="sourceLineNo">080</span>    {<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      return m_format;<a name="line.81"></a>
+<span class="sourceLineNo">081</span>      return m_filter;<a name="line.81"></a>
 <span class="sourceLineNo">082</span>    }<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    private String m_format;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    public boolean getFormat__IsNotDefault()<a name="line.84"></a>
+<span class="sourceLineNo">083</span>    private String m_filter;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    public boolean getFilter__IsNotDefault()<a name="line.84"></a>
 <span class="sourceLineNo">085</span>    {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      return m_format__IsNotDefault;<a name="line.86"></a>
+<span class="sourceLineNo">086</span>      return m_filter__IsNotDefault;<a name="line.86"></a>
 <span class="sourceLineNo">087</span>    }<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    private boolean m_format__IsNotDefault;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    // 23, 1<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    public void setBcn(String bcn)<a name="line.90"></a>
+<span class="sourceLineNo">088</span>    private boolean m_filter__IsNotDefault;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    // 22, 1<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    public void setFormat(String format)<a name="line.90"></a>
 <span class="sourceLineNo">091</span>    {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      // 23, 1<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      m_bcn = bcn;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>      m_bcn__IsNotDefault = true;<a name="line.94"></a>
+<span class="sourceLineNo">092</span>      // 22, 1<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      m_format = format;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      m_format__IsNotDefault = true;<a name="line.94"></a>
 <span class="sourceLineNo">095</span>    }<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public String getBcn()<a name="line.96"></a>
+<span class="sourceLineNo">096</span>    public String getFormat()<a name="line.96"></a>
 <span class="sourceLineNo">097</span>    {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      return m_bcn;<a name="line.98"></a>
+<span class="sourceLineNo">098</span>      return m_format;<a name="line.98"></a>
 <span class="sourceLineNo">099</span>    }<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    private String m_bcn;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    public boolean getBcn__IsNotDefault()<a name="line.101"></a>
+<span class="sourceLineNo">100</span>    private String m_format;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    public boolean getFormat__IsNotDefault()<a name="line.101"></a>
 <span class="sourceLineNo">102</span>    {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      return m_bcn__IsNotDefault;<a name="line.103"></a>
+<span class="sourceLineNo">103</span>      return m_format__IsNotDefault;<a name="line.103"></a>
 <span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    private boolean m_bcn__IsNotDefault;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    // 24, 1<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void setBcv(String bcv)<a name="line.107"></a>
+<span class="sourceLineNo">105</span>    private boolean m_format__IsNotDefault;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    // 23, 1<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    public void setBcn(String bcn)<a name="line.107"></a>
 <span class="sourceLineNo">108</span>    {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      // 24, 1<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      m_bcv = bcv;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>      m_bcv__IsNotDefault = true;<a name="line.111"></a>
+<span class="sourceLineNo">109</span>      // 23, 1<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      m_bcn = bcn;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      m_bcn__IsNotDefault = true;<a name="line.111"></a>
 <span class="sourceLineNo">112</span>    }<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public String getBcv()<a name="line.113"></a>
+<span class="sourceLineNo">113</span>    public String getBcn()<a name="line.113"></a>
 <span class="sourceLineNo">114</span>    {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      return m_bcv;<a name="line.115"></a>
+<span class="sourceLineNo">115</span>      return m_bcn;<a name="line.115"></a>
 <span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    private String m_bcv;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    public boolean getBcv__IsNotDefault()<a name="line.118"></a>
+<span class="sourceLineNo">117</span>    private String m_bcn;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    public boolean getBcn__IsNotDefault()<a name="line.118"></a>
 <span class="sourceLineNo">119</span>    {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      return m_bcv__IsNotDefault;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>      return m_bcn__IsNotDefault;<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    private boolean m_bcv__IsNotDefault;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    // 21, 1<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void setFilter(String filter)<a name="line.124"></a>
+<span class="sourceLineNo">122</span>    private boolean m_bcn__IsNotDefault;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    // 24, 1<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    public void setBcv(String bcv)<a name="line.124"></a>
 <span class="sourceLineNo">125</span>    {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      // 21, 1<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      m_filter = filter;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      m_filter__IsNotDefault = true;<a name="line.128"></a>
+<span class="sourceLineNo">126</span>      // 24, 1<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      m_bcv = bcv;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      m_bcv__IsNotDefault = true;<a name="line.128"></a>
 <span class="sourceLineNo">129</span>    }<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    public String getFilter()<a name="line.130"></a>
+<span class="sourceLineNo">130</span>    public String getBcv()<a name="line.130"></a>
 <span class="sourceLineNo">131</span>    {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      return m_filter;<a name="line.132"></a>
+<span class="sourceLineNo">132</span>      return m_bcv;<a name="line.132"></a>
 <span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private String m_filter;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    public boolean getFilter__IsNotDefault()<a name="line.135"></a>
+<span class="sourceLineNo">134</span>    private String m_bcv;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    public boolean getBcv__IsNotDefault()<a name="line.135"></a>
 <span class="sourceLineNo">136</span>    {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      return m_filter__IsNotDefault;<a name="line.137"></a>
+<span class="sourceLineNo">137</span>      return m_bcv__IsNotDefault;<a name="line.137"></a>
 <span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    private boolean m_filter__IsNotDefault;<a name="line.139"></a>
+<span class="sourceLineNo">139</span>    private boolean m_bcv__IsNotDefault;<a name="line.139"></a>
 <span class="sourceLineNo">140</span>  }<a name="line.140"></a>
 <span class="sourceLineNo">141</span>  @Override<a name="line.141"></a>
 <span class="sourceLineNo">142</span>  protected org.jamon.AbstractTemplateProxy.ImplData makeImplData()<a name="line.142"></a>
@@ -156,31 +156,31 @@
 <span class="sourceLineNo">148</span>    return (ImplData) super.getImplData();<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>  protected String format;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFormat(String p_format)<a name="line.152"></a>
+<span class="sourceLineNo">151</span>  protected String filter;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFilter(String p_filter)<a name="line.152"></a>
 <span class="sourceLineNo">153</span>  {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    (getImplData()).setFormat(p_format);<a name="line.154"></a>
+<span class="sourceLineNo">154</span>    (getImplData()).setFilter(p_filter);<a name="line.154"></a>
 <span class="sourceLineNo">155</span>    return this;<a name="line.155"></a>
 <span class="sourceLineNo">156</span>  }<a name="line.156"></a>
 <span class="sourceLineNo">157</span>  <a name="line.157"></a>
-<span class="sourceLineNo">158</span>  protected String bcn;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcn(String p_bcn)<a name="line.159"></a>
+<span class="sourceLineNo">158</span>  protected String format;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFormat(String p_format)<a name="line.159"></a>
 <span class="sourceLineNo">160</span>  {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    (getImplData()).setBcn(p_bcn);<a name="line.161"></a>
+<span class="sourceLineNo">161</span>    (getImplData()).setFormat(p_format);<a name="line.161"></a>
 <span class="sourceLineNo">162</span>    return this;<a name="line.162"></a>
 <span class="sourceLineNo">163</span>  }<a name="line.163"></a>
 <span class="sourceLineNo">164</span>  <a name="line.164"></a>
-<span class="sourceLineNo">165</span>  protected String bcv;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcv(String p_bcv)<a name="line.166"></a>
+<span class="sourceLineNo">165</span>  protected String bcn;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcn(String p_bcn)<a name="line.166"></a>
 <span class="sourceLineNo">167</span>  {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    (getImplData()).setBcv(p_bcv);<a name="line.168"></a>
+<span class="sourceLineNo">168</span>    (getImplData()).setBcn(p_bcn);<a name="line.168"></a>
 <span class="sourceLineNo">169</span>    return this;<a name="line.169"></a>
 <span class="sourceLineNo">170</span>  }<a name="line.170"></a>
 <span class="sourceLineNo">171</span>  <a name="line.171"></a>
-<span class="sourceLineNo">172</span>  protected String filter;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFilter(String p_filter)<a name="line.173"></a>
+<span class="sourceLineNo">172</span>  protected String bcv;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcv(String p_bcv)<a name="line.173"></a>
 <span class="sourceLineNo">174</span>  {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    (getImplData()).setFilter(p_filter);<a name="line.175"></a>
+<span class="sourceLineNo">175</span>    (getImplData()).setBcv(p_bcv);<a name="line.175"></a>
 <span class="sourceLineNo">176</span>    return this;<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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.Intf.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.Intf.html b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.Intf.html
index c2ab698..75a1f7f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.Intf.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.Intf.html
@@ -33,10 +33,10 @@
 <span class="sourceLineNo">025</span>  requiredArguments = {<a name="line.25"></a>
 <span class="sourceLineNo">026</span>    @org.jamon.annotations.Argument(name = "regionServer", type = "HRegionServer")},<a name="line.26"></a>
 <span class="sourceLineNo">027</span>  optionalArguments = {<a name="line.27"></a>
-<span class="sourceLineNo">028</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.28"></a>
-<span class="sourceLineNo">029</span>    @org.jamon.annotations.Argument(name = "bcn", type = "String"),<a name="line.29"></a>
-<span class="sourceLineNo">030</span>    @org.jamon.annotations.Argument(name = "bcv", type = "String"),<a name="line.30"></a>
-<span class="sourceLineNo">031</span>    @org.jamon.annotations.Argument(name = "filter", type = "String")})<a name="line.31"></a>
+<span class="sourceLineNo">028</span>    @org.jamon.annotations.Argument(name = "filter", type = "String"),<a name="line.28"></a>
+<span class="sourceLineNo">029</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.29"></a>
+<span class="sourceLineNo">030</span>    @org.jamon.annotations.Argument(name = "bcn", type = "String"),<a name="line.30"></a>
+<span class="sourceLineNo">031</span>    @org.jamon.annotations.Argument(name = "bcv", type = "String")})<a name="line.31"></a>
 <span class="sourceLineNo">032</span>public class RSStatusTmpl<a name="line.32"></a>
 <span class="sourceLineNo">033</span>  extends org.jamon.AbstractTemplateProxy<a name="line.33"></a>
 <span class="sourceLineNo">034</span>{<a name="line.34"></a>
@@ -77,74 +77,74 @@
 <span class="sourceLineNo">069</span>      return m_regionServer;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>    }<a name="line.70"></a>
 <span class="sourceLineNo">071</span>    private HRegionServer m_regionServer;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    // 22, 1<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    public void setFormat(String format)<a name="line.73"></a>
+<span class="sourceLineNo">072</span>    // 21, 1<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    public void setFilter(String filter)<a name="line.73"></a>
 <span class="sourceLineNo">074</span>    {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      // 22, 1<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      m_format = format;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      m_format__IsNotDefault = true;<a name="line.77"></a>
+<span class="sourceLineNo">075</span>      // 21, 1<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      m_filter = filter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      m_filter__IsNotDefault = true;<a name="line.77"></a>
 <span class="sourceLineNo">078</span>    }<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public String getFormat()<a name="line.79"></a>
+<span class="sourceLineNo">079</span>    public String getFilter()<a name="line.79"></a>
 <span class="sourceLineNo">080</span>    {<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      return m_format;<a name="line.81"></a>
+<span class="sourceLineNo">081</span>      return m_filter;<a name="line.81"></a>
 <span class="sourceLineNo">082</span>    }<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    private String m_format;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    public boolean getFormat__IsNotDefault()<a name="line.84"></a>
+<span class="sourceLineNo">083</span>    private String m_filter;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    public boolean getFilter__IsNotDefault()<a name="line.84"></a>
 <span class="sourceLineNo">085</span>    {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      return m_format__IsNotDefault;<a name="line.86"></a>
+<span class="sourceLineNo">086</span>      return m_filter__IsNotDefault;<a name="line.86"></a>
 <span class="sourceLineNo">087</span>    }<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    private boolean m_format__IsNotDefault;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    // 23, 1<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    public void setBcn(String bcn)<a name="line.90"></a>
+<span class="sourceLineNo">088</span>    private boolean m_filter__IsNotDefault;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    // 22, 1<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    public void setFormat(String format)<a name="line.90"></a>
 <span class="sourceLineNo">091</span>    {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      // 23, 1<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      m_bcn = bcn;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>      m_bcn__IsNotDefault = true;<a name="line.94"></a>
+<span class="sourceLineNo">092</span>      // 22, 1<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      m_format = format;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      m_format__IsNotDefault = true;<a name="line.94"></a>
 <span class="sourceLineNo">095</span>    }<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public String getBcn()<a name="line.96"></a>
+<span class="sourceLineNo">096</span>    public String getFormat()<a name="line.96"></a>
 <span class="sourceLineNo">097</span>    {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      return m_bcn;<a name="line.98"></a>
+<span class="sourceLineNo">098</span>      return m_format;<a name="line.98"></a>
 <span class="sourceLineNo">099</span>    }<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    private String m_bcn;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    public boolean getBcn__IsNotDefault()<a name="line.101"></a>
+<span class="sourceLineNo">100</span>    private String m_format;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    public boolean getFormat__IsNotDefault()<a name="line.101"></a>
 <span class="sourceLineNo">102</span>    {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      return m_bcn__IsNotDefault;<a name="line.103"></a>
+<span class="sourceLineNo">103</span>      return m_format__IsNotDefault;<a name="line.103"></a>
 <span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    private boolean m_bcn__IsNotDefault;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    // 24, 1<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void setBcv(String bcv)<a name="line.107"></a>
+<span class="sourceLineNo">105</span>    private boolean m_format__IsNotDefault;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    // 23, 1<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    public void setBcn(String bcn)<a name="line.107"></a>
 <span class="sourceLineNo">108</span>    {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      // 24, 1<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      m_bcv = bcv;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>      m_bcv__IsNotDefault = true;<a name="line.111"></a>
+<span class="sourceLineNo">109</span>      // 23, 1<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      m_bcn = bcn;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      m_bcn__IsNotDefault = true;<a name="line.111"></a>
 <span class="sourceLineNo">112</span>    }<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public String getBcv()<a name="line.113"></a>
+<span class="sourceLineNo">113</span>    public String getBcn()<a name="line.113"></a>
 <span class="sourceLineNo">114</span>    {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      return m_bcv;<a name="line.115"></a>
+<span class="sourceLineNo">115</span>      return m_bcn;<a name="line.115"></a>
 <span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    private String m_bcv;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    public boolean getBcv__IsNotDefault()<a name="line.118"></a>
+<span class="sourceLineNo">117</span>    private String m_bcn;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    public boolean getBcn__IsNotDefault()<a name="line.118"></a>
 <span class="sourceLineNo">119</span>    {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      return m_bcv__IsNotDefault;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>      return m_bcn__IsNotDefault;<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    private boolean m_bcv__IsNotDefault;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    // 21, 1<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void setFilter(String filter)<a name="line.124"></a>
+<span class="sourceLineNo">122</span>    private boolean m_bcn__IsNotDefault;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    // 24, 1<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    public void setBcv(String bcv)<a name="line.124"></a>
 <span class="sourceLineNo">125</span>    {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      // 21, 1<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      m_filter = filter;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      m_filter__IsNotDefault = true;<a name="line.128"></a>
+<span class="sourceLineNo">126</span>      // 24, 1<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      m_bcv = bcv;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      m_bcv__IsNotDefault = true;<a name="line.128"></a>
 <span class="sourceLineNo">129</span>    }<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    public String getFilter()<a name="line.130"></a>
+<span class="sourceLineNo">130</span>    public String getBcv()<a name="line.130"></a>
 <span class="sourceLineNo">131</span>    {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      return m_filter;<a name="line.132"></a>
+<span class="sourceLineNo">132</span>      return m_bcv;<a name="line.132"></a>
 <span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private String m_filter;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    public boolean getFilter__IsNotDefault()<a name="line.135"></a>
+<span class="sourceLineNo">134</span>    private String m_bcv;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    public boolean getBcv__IsNotDefault()<a name="line.135"></a>
 <span class="sourceLineNo">136</span>    {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      return m_filter__IsNotDefault;<a name="line.137"></a>
+<span class="sourceLineNo">137</span>      return m_bcv__IsNotDefault;<a name="line.137"></a>
 <span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    private boolean m_filter__IsNotDefault;<a name="line.139"></a>
+<span class="sourceLineNo">139</span>    private boolean m_bcv__IsNotDefault;<a name="line.139"></a>
 <span class="sourceLineNo">140</span>  }<a name="line.140"></a>
 <span class="sourceLineNo">141</span>  @Override<a name="line.141"></a>
 <span class="sourceLineNo">142</span>  protected org.jamon.AbstractTemplateProxy.ImplData makeImplData()<a name="line.142"></a>
@@ -156,31 +156,31 @@
 <span class="sourceLineNo">148</span>    return (ImplData) super.getImplData();<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>  protected String format;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFormat(String p_format)<a name="line.152"></a>
+<span class="sourceLineNo">151</span>  protected String filter;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFilter(String p_filter)<a name="line.152"></a>
 <span class="sourceLineNo">153</span>  {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    (getImplData()).setFormat(p_format);<a name="line.154"></a>
+<span class="sourceLineNo">154</span>    (getImplData()).setFilter(p_filter);<a name="line.154"></a>
 <span class="sourceLineNo">155</span>    return this;<a name="line.155"></a>
 <span class="sourceLineNo">156</span>  }<a name="line.156"></a>
 <span class="sourceLineNo">157</span>  <a name="line.157"></a>
-<span class="sourceLineNo">158</span>  protected String bcn;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcn(String p_bcn)<a name="line.159"></a>
+<span class="sourceLineNo">158</span>  protected String format;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFormat(String p_format)<a name="line.159"></a>
 <span class="sourceLineNo">160</span>  {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    (getImplData()).setBcn(p_bcn);<a name="line.161"></a>
+<span class="sourceLineNo">161</span>    (getImplData()).setFormat(p_format);<a name="line.161"></a>
 <span class="sourceLineNo">162</span>    return this;<a name="line.162"></a>
 <span class="sourceLineNo">163</span>  }<a name="line.163"></a>
 <span class="sourceLineNo">164</span>  <a name="line.164"></a>
-<span class="sourceLineNo">165</span>  protected String bcv;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcv(String p_bcv)<a name="line.166"></a>
+<span class="sourceLineNo">165</span>  protected String bcn;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcn(String p_bcn)<a name="line.166"></a>
 <span class="sourceLineNo">167</span>  {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    (getImplData()).setBcv(p_bcv);<a name="line.168"></a>
+<span class="sourceLineNo">168</span>    (getImplData()).setBcn(p_bcn);<a name="line.168"></a>
 <span class="sourceLineNo">169</span>    return this;<a name="line.169"></a>
 <span class="sourceLineNo">170</span>  }<a name="line.170"></a>
 <span class="sourceLineNo">171</span>  <a name="line.171"></a>
-<span class="sourceLineNo">172</span>  protected String filter;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFilter(String p_filter)<a name="line.173"></a>
+<span class="sourceLineNo">172</span>  protected String bcv;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcv(String p_bcv)<a name="line.173"></a>
 <span class="sourceLineNo">174</span>  {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    (getImplData()).setFilter(p_filter);<a name="line.175"></a>
+<span class="sourceLineNo">175</span>    (getImplData()).setBcv(p_bcv);<a name="line.175"></a>
 <span class="sourceLineNo">176</span>    return this;<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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
index c2ab698..75a1f7f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.html
@@ -33,10 +33,10 @@
 <span class="sourceLineNo">025</span>  requiredArguments = {<a name="line.25"></a>
 <span class="sourceLineNo">026</span>    @org.jamon.annotations.Argument(name = "regionServer", type = "HRegionServer")},<a name="line.26"></a>
 <span class="sourceLineNo">027</span>  optionalArguments = {<a name="line.27"></a>
-<span class="sourceLineNo">028</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.28"></a>
-<span class="sourceLineNo">029</span>    @org.jamon.annotations.Argument(name = "bcn", type = "String"),<a name="line.29"></a>
-<span class="sourceLineNo">030</span>    @org.jamon.annotations.Argument(name = "bcv", type = "String"),<a name="line.30"></a>
-<span class="sourceLineNo">031</span>    @org.jamon.annotations.Argument(name = "filter", type = "String")})<a name="line.31"></a>
+<span class="sourceLineNo">028</span>    @org.jamon.annotations.Argument(name = "filter", type = "String"),<a name="line.28"></a>
+<span class="sourceLineNo">029</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<a name="line.29"></a>
+<span class="sourceLineNo">030</span>    @org.jamon.annotations.Argument(name = "bcn", type = "String"),<a name="line.30"></a>
+<span class="sourceLineNo">031</span>    @org.jamon.annotations.Argument(name = "bcv", type = "String")})<a name="line.31"></a>
 <span class="sourceLineNo">032</span>public class RSStatusTmpl<a name="line.32"></a>
 <span class="sourceLineNo">033</span>  extends org.jamon.AbstractTemplateProxy<a name="line.33"></a>
 <span class="sourceLineNo">034</span>{<a name="line.34"></a>
@@ -77,74 +77,74 @@
 <span class="sourceLineNo">069</span>      return m_regionServer;<a name="line.69"></a>
 <span class="sourceLineNo">070</span>    }<a name="line.70"></a>
 <span class="sourceLineNo">071</span>    private HRegionServer m_regionServer;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    // 22, 1<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    public void setFormat(String format)<a name="line.73"></a>
+<span class="sourceLineNo">072</span>    // 21, 1<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    public void setFilter(String filter)<a name="line.73"></a>
 <span class="sourceLineNo">074</span>    {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      // 22, 1<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      m_format = format;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      m_format__IsNotDefault = true;<a name="line.77"></a>
+<span class="sourceLineNo">075</span>      // 21, 1<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      m_filter = filter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      m_filter__IsNotDefault = true;<a name="line.77"></a>
 <span class="sourceLineNo">078</span>    }<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public String getFormat()<a name="line.79"></a>
+<span class="sourceLineNo">079</span>    public String getFilter()<a name="line.79"></a>
 <span class="sourceLineNo">080</span>    {<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      return m_format;<a name="line.81"></a>
+<span class="sourceLineNo">081</span>      return m_filter;<a name="line.81"></a>
 <span class="sourceLineNo">082</span>    }<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    private String m_format;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    public boolean getFormat__IsNotDefault()<a name="line.84"></a>
+<span class="sourceLineNo">083</span>    private String m_filter;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    public boolean getFilter__IsNotDefault()<a name="line.84"></a>
 <span class="sourceLineNo">085</span>    {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      return m_format__IsNotDefault;<a name="line.86"></a>
+<span class="sourceLineNo">086</span>      return m_filter__IsNotDefault;<a name="line.86"></a>
 <span class="sourceLineNo">087</span>    }<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    private boolean m_format__IsNotDefault;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    // 23, 1<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    public void setBcn(String bcn)<a name="line.90"></a>
+<span class="sourceLineNo">088</span>    private boolean m_filter__IsNotDefault;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    // 22, 1<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    public void setFormat(String format)<a name="line.90"></a>
 <span class="sourceLineNo">091</span>    {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      // 23, 1<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      m_bcn = bcn;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>      m_bcn__IsNotDefault = true;<a name="line.94"></a>
+<span class="sourceLineNo">092</span>      // 22, 1<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      m_format = format;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      m_format__IsNotDefault = true;<a name="line.94"></a>
 <span class="sourceLineNo">095</span>    }<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    public String getBcn()<a name="line.96"></a>
+<span class="sourceLineNo">096</span>    public String getFormat()<a name="line.96"></a>
 <span class="sourceLineNo">097</span>    {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>      return m_bcn;<a name="line.98"></a>
+<span class="sourceLineNo">098</span>      return m_format;<a name="line.98"></a>
 <span class="sourceLineNo">099</span>    }<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    private String m_bcn;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    public boolean getBcn__IsNotDefault()<a name="line.101"></a>
+<span class="sourceLineNo">100</span>    private String m_format;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    public boolean getFormat__IsNotDefault()<a name="line.101"></a>
 <span class="sourceLineNo">102</span>    {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      return m_bcn__IsNotDefault;<a name="line.103"></a>
+<span class="sourceLineNo">103</span>      return m_format__IsNotDefault;<a name="line.103"></a>
 <span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    private boolean m_bcn__IsNotDefault;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    // 24, 1<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void setBcv(String bcv)<a name="line.107"></a>
+<span class="sourceLineNo">105</span>    private boolean m_format__IsNotDefault;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    // 23, 1<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    public void setBcn(String bcn)<a name="line.107"></a>
 <span class="sourceLineNo">108</span>    {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      // 24, 1<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      m_bcv = bcv;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>      m_bcv__IsNotDefault = true;<a name="line.111"></a>
+<span class="sourceLineNo">109</span>      // 23, 1<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      m_bcn = bcn;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      m_bcn__IsNotDefault = true;<a name="line.111"></a>
 <span class="sourceLineNo">112</span>    }<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public String getBcv()<a name="line.113"></a>
+<span class="sourceLineNo">113</span>    public String getBcn()<a name="line.113"></a>
 <span class="sourceLineNo">114</span>    {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      return m_bcv;<a name="line.115"></a>
+<span class="sourceLineNo">115</span>      return m_bcn;<a name="line.115"></a>
 <span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    private String m_bcv;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    public boolean getBcv__IsNotDefault()<a name="line.118"></a>
+<span class="sourceLineNo">117</span>    private String m_bcn;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    public boolean getBcn__IsNotDefault()<a name="line.118"></a>
 <span class="sourceLineNo">119</span>    {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      return m_bcv__IsNotDefault;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>      return m_bcn__IsNotDefault;<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    private boolean m_bcv__IsNotDefault;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    // 21, 1<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    public void setFilter(String filter)<a name="line.124"></a>
+<span class="sourceLineNo">122</span>    private boolean m_bcn__IsNotDefault;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    // 24, 1<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    public void setBcv(String bcv)<a name="line.124"></a>
 <span class="sourceLineNo">125</span>    {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      // 21, 1<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      m_filter = filter;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      m_filter__IsNotDefault = true;<a name="line.128"></a>
+<span class="sourceLineNo">126</span>      // 24, 1<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      m_bcv = bcv;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      m_bcv__IsNotDefault = true;<a name="line.128"></a>
 <span class="sourceLineNo">129</span>    }<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    public String getFilter()<a name="line.130"></a>
+<span class="sourceLineNo">130</span>    public String getBcv()<a name="line.130"></a>
 <span class="sourceLineNo">131</span>    {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      return m_filter;<a name="line.132"></a>
+<span class="sourceLineNo">132</span>      return m_bcv;<a name="line.132"></a>
 <span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    private String m_filter;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    public boolean getFilter__IsNotDefault()<a name="line.135"></a>
+<span class="sourceLineNo">134</span>    private String m_bcv;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    public boolean getBcv__IsNotDefault()<a name="line.135"></a>
 <span class="sourceLineNo">136</span>    {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      return m_filter__IsNotDefault;<a name="line.137"></a>
+<span class="sourceLineNo">137</span>      return m_bcv__IsNotDefault;<a name="line.137"></a>
 <span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    private boolean m_filter__IsNotDefault;<a name="line.139"></a>
+<span class="sourceLineNo">139</span>    private boolean m_bcv__IsNotDefault;<a name="line.139"></a>
 <span class="sourceLineNo">140</span>  }<a name="line.140"></a>
 <span class="sourceLineNo">141</span>  @Override<a name="line.141"></a>
 <span class="sourceLineNo">142</span>  protected org.jamon.AbstractTemplateProxy.ImplData makeImplData()<a name="line.142"></a>
@@ -156,31 +156,31 @@
 <span class="sourceLineNo">148</span>    return (ImplData) super.getImplData();<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>  protected String format;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFormat(String p_format)<a name="line.152"></a>
+<span class="sourceLineNo">151</span>  protected String filter;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFilter(String p_filter)<a name="line.152"></a>
 <span class="sourceLineNo">153</span>  {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    (getImplData()).setFormat(p_format);<a name="line.154"></a>
+<span class="sourceLineNo">154</span>    (getImplData()).setFilter(p_filter);<a name="line.154"></a>
 <span class="sourceLineNo">155</span>    return this;<a name="line.155"></a>
 <span class="sourceLineNo">156</span>  }<a name="line.156"></a>
 <span class="sourceLineNo">157</span>  <a name="line.157"></a>
-<span class="sourceLineNo">158</span>  protected String bcn;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcn(String p_bcn)<a name="line.159"></a>
+<span class="sourceLineNo">158</span>  protected String format;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFormat(String p_format)<a name="line.159"></a>
 <span class="sourceLineNo">160</span>  {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    (getImplData()).setBcn(p_bcn);<a name="line.161"></a>
+<span class="sourceLineNo">161</span>    (getImplData()).setFormat(p_format);<a name="line.161"></a>
 <span class="sourceLineNo">162</span>    return this;<a name="line.162"></a>
 <span class="sourceLineNo">163</span>  }<a name="line.163"></a>
 <span class="sourceLineNo">164</span>  <a name="line.164"></a>
-<span class="sourceLineNo">165</span>  protected String bcv;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcv(String p_bcv)<a name="line.166"></a>
+<span class="sourceLineNo">165</span>  protected String bcn;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcn(String p_bcn)<a name="line.166"></a>
 <span class="sourceLineNo">167</span>  {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    (getImplData()).setBcv(p_bcv);<a name="line.168"></a>
+<span class="sourceLineNo">168</span>    (getImplData()).setBcn(p_bcn);<a name="line.168"></a>
 <span class="sourceLineNo">169</span>    return this;<a name="line.169"></a>
 <span class="sourceLineNo">170</span>  }<a name="line.170"></a>
 <span class="sourceLineNo">171</span>  <a name="line.171"></a>
-<span class="sourceLineNo">172</span>  protected String filter;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFilter(String p_filter)<a name="line.173"></a>
+<span class="sourceLineNo">172</span>  protected String bcv;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcv(String p_bcv)<a name="line.173"></a>
 <span class="sourceLineNo">174</span>  {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    (getImplData()).setFilter(p_filter);<a name="line.175"></a>
+<span class="sourceLineNo">175</span>    (getImplData()).setBcv(p_bcv);<a name="line.175"></a>
 <span class="sourceLineNo">176</span>    return this;<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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
index 6384217..31e8717 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmplImpl.html
@@ -34,27 +34,27 @@
 <span class="sourceLineNo">026</span><a name="line.26"></a>
 <span class="sourceLineNo">027</span>{<a name="line.27"></a>
 <span class="sourceLineNo">028</span>  private final HRegionServer regionServer;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>  private final String format;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>  private final String bcn;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>  private final String bcv;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>  private final String filter;<a name="line.32"></a>
+<span class="sourceLineNo">029</span>  private final String filter;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>  private final String format;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>  private final String bcn;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>  private final String bcv;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>  protected static org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl.ImplData __jamon_setOptionalArguments(org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl.ImplData p_implData)<a name="line.33"></a>
 <span class="sourceLineNo">034</span>  {<a name="line.34"></a>
-<span class="sourceLineNo">035</span>    if(! p_implData.getFormat__IsNotDefault())<a name="line.35"></a>
+<span class="sourceLineNo">035</span>    if(! p_implData.getFilter__IsNotDefault())<a name="line.35"></a>
 <span class="sourceLineNo">036</span>    {<a name="line.36"></a>
-<span class="sourceLineNo">037</span>      p_implData.setFormat("html");<a name="line.37"></a>
+<span class="sourceLineNo">037</span>      p_implData.setFilter("general");<a name="line.37"></a>
 <span class="sourceLineNo">038</span>    }<a name="line.38"></a>
-<span class="sourceLineNo">039</span>    if(! p_implData.getBcn__IsNotDefault())<a name="line.39"></a>
+<span class="sourceLineNo">039</span>    if(! p_implData.getFormat__IsNotDefault())<a name="line.39"></a>
 <span class="sourceLineNo">040</span>    {<a name="line.40"></a>
-<span class="sourceLineNo">041</span>      p_implData.setBcn("");<a name="line.41"></a>
+<span class="sourceLineNo">041</span>      p_implData.setFormat("html");<a name="line.41"></a>
 <span class="sourceLineNo">042</span>    }<a name="line.42"></a>
-<span class="sourceLineNo">043</span>    if(! p_implData.getBcv__IsNotDefault())<a name="line.43"></a>
+<span class="sourceLineNo">043</span>    if(! p_implData.getBcn__IsNotDefault())<a name="line.43"></a>
 <span class="sourceLineNo">044</span>    {<a name="line.44"></a>
-<span class="sourceLineNo">045</span>      p_implData.setBcv("");<a name="line.45"></a>
+<span class="sourceLineNo">045</span>      p_implData.setBcn("");<a name="line.45"></a>
 <span class="sourceLineNo">046</span>    }<a name="line.46"></a>
-<span class="sourceLineNo">047</span>    if(! p_implData.getFilter__IsNotDefault())<a name="line.47"></a>
+<span class="sourceLineNo">047</span>    if(! p_implData.getBcv__IsNotDefault())<a name="line.47"></a>
 <span class="sourceLineNo">048</span>    {<a name="line.48"></a>
-<span class="sourceLineNo">049</span>      p_implData.setFilter("general");<a name="line.49"></a>
+<span class="sourceLineNo">049</span>      p_implData.setBcv("");<a name="line.49"></a>
 <span class="sourceLineNo">050</span>    }<a name="line.50"></a>
 <span class="sourceLineNo">051</span>    return p_implData;<a name="line.51"></a>
 <span class="sourceLineNo">052</span>  }<a name="line.52"></a>
@@ -62,10 +62,10 @@
 <span class="sourceLineNo">054</span>  {<a name="line.54"></a>
 <span class="sourceLineNo">055</span>    super(p_templateManager, __jamon_setOptionalArguments(p_implData));<a name="line.55"></a>
 <span class="sourceLineNo">056</span>    regionServer = p_implData.getRegionServer();<a name="line.56"></a>
-<span class="sourceLineNo">057</span>    format = p_implData.getFormat();<a name="line.57"></a>
-<span class="sourceLineNo">058</span>    bcn = p_implData.getBcn();<a name="line.58"></a>
-<span class="sourceLineNo">059</span>    bcv = p_implData.getBcv();<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    filter = p_implData.getFilter();<a name="line.60"></a>
+<span class="sourceLineNo">057</span>    filter = p_implData.getFilter();<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    format = p_implData.getFormat();<a name="line.58"></a>
+<span class="sourceLineNo">059</span>    bcn = p_implData.getBcn();<a name="line.59"></a>
+<span class="sourceLineNo">060</span>    bcv = p_implData.getBcv();<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>  @Override public void renderNoFlush(final java.io.Writer jamonWriter)<a name="line.63"></a>
@@ -94,8 +94,8 @@
 <span class="sourceLineNo">086</span>      // 41, 3<a name="line.86"></a>
 <span class="sourceLineNo">087</span>      {<a name="line.87"></a>
 <span class="sourceLineNo">088</span>        org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl __jamon__var_1 = new org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl(this.getTemplateManager());<a name="line.88"></a>
-<span class="sourceLineNo">089</span>        __jamon__var_1.setFormat("json" );<a name="line.89"></a>
-<span class="sourceLineNo">090</span>        __jamon__var_1.setFilter(filter);<a name="line.90"></a>
+<span class="sourceLineNo">089</span>        __jamon__var_1.setFilter(filter);<a name="line.89"></a>
+<span class="sourceLineNo">090</span>        __jamon__var_1.setFormat("json" );<a name="line.90"></a>
 <span class="sourceLineNo">091</span>        __jamon__var_1.renderNoFlush(jamonWriter);<a name="line.91"></a>
 <span class="sourceLineNo">092</span>      }<a name="line.92"></a>
 <span class="sourceLineNo">093</span>      // 41, 68<a name="line.93"></a>


[06/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
index d3abe39..c51826f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/tool/Canary.RegionTask.TaskType.html
@@ -615,9 +615,9 @@
 <span class="sourceLineNo">607</span>            if (this.failOnError &amp;&amp; monitor.hasError()) {<a name="line.607"></a>
 <span class="sourceLineNo">608</span>              monitorThread.interrupt();<a name="line.608"></a>
 <span class="sourceLineNo">609</span>              if (monitor.initialized) {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>                System.exit(monitor.errorCode);<a name="line.610"></a>
+<span class="sourceLineNo">610</span>                return monitor.errorCode;<a name="line.610"></a>
 <span class="sourceLineNo">611</span>              } else {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.612"></a>
+<span class="sourceLineNo">612</span>                return INIT_ERROR_EXIT_CODE;<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>            currentTimeLength = System.currentTimeMillis() - startTime;<a name="line.615"></a>
@@ -626,630 +626,629 @@
 <span class="sourceLineNo">618</span>                  + ") after timeout limit:" + this.timeout<a name="line.618"></a>
 <span class="sourceLineNo">619</span>                  + " will be killed itself !!");<a name="line.619"></a>
 <span class="sourceLineNo">620</span>              if (monitor.initialized) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>                System.exit(TIMEOUT_ERROR_EXIT_CODE);<a name="line.621"></a>
+<span class="sourceLineNo">621</span>                return TIMEOUT_ERROR_EXIT_CODE;<a name="line.621"></a>
 <span class="sourceLineNo">622</span>              } else {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>                System.exit(INIT_ERROR_EXIT_CODE);<a name="line.623"></a>
+<span class="sourceLineNo">623</span>                return INIT_ERROR_EXIT_CODE;<a name="line.623"></a>
 <span class="sourceLineNo">624</span>              }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>              break;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>            }<a name="line.626"></a>
-<span class="sourceLineNo">627</span>          }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>            monitorThread.interrupt();<a name="line.630"></a>
-<span class="sourceLineNo">631</span>            System.exit(monitor.errorCode);<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } finally {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          if (monitor != null) monitor.close();<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>        Thread.sleep(interval);<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      } while (interval &gt; 0);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    } // try-with-resources close<a name="line.639"></a>
-<span class="sourceLineNo">640</span><a name="line.640"></a>
-<span class="sourceLineNo">641</span>    if (choreService != null) {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      choreService.shutdown();<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    return(monitor.errorCode);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>  }<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private void printUsageAndExit() {<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    System.err.printf(<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        getClass().getName());<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    System.err.println(" where [opts] are:");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    System.err.println("   -help          Show this help and exit.");<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    System.err.println("      which means to enable regionserver mode");<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    System.err.println("      only works in regionserver mode.");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        " default is true");<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        + " Default is hbase:canary");<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    System.err<a name="line.668"></a>
-<span class="sourceLineNo">669</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    System.exit(USAGE_EXIT_CODE);<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>  /**<a name="line.673"></a>
-<span class="sourceLineNo">674</span>   * A Factory method for {@link Monitor}.<a name="line.674"></a>
-<span class="sourceLineNo">675</span>   * Can be overridden by user.<a name="line.675"></a>
-<span class="sourceLineNo">676</span>   * @param index a start index for monitor target<a name="line.676"></a>
-<span class="sourceLineNo">677</span>   * @param args args passed from user<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   * @return a Monitor instance<a name="line.678"></a>
-<span class="sourceLineNo">679</span>   */<a name="line.679"></a>
-<span class="sourceLineNo">680</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    Monitor monitor = null;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    String[] monitorTargets = null;<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>    if(index &gt;= 0) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      int length = args.length - index;<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      monitorTargets = new String[length];<a name="line.686"></a>
-<span class="sourceLineNo">687</span>      System.arraycopy(args, index, monitorTargets, 0, length);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    }<a name="line.688"></a>
-<span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>    if (this.regionServerMode) {<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      monitor =<a name="line.691"></a>
-<span class="sourceLineNo">692</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.692"></a>
-<span class="sourceLineNo">693</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.693"></a>
-<span class="sourceLineNo">694</span>              this.treatFailureAsError);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    } else {<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      monitor =<a name="line.696"></a>
-<span class="sourceLineNo">697</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.697"></a>
-<span class="sourceLineNo">698</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    return monitor;<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>  // a Monitor super-class can be extended by users<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>    protected Connection connection;<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    protected Admin admin;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    protected String[] targets;<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    protected boolean useRegExp;<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    protected boolean treatFailureAsError;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    protected boolean initialized = false;<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>    protected boolean done = false;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    protected int errorCode = 0;<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    protected Sink sink;<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    protected ExecutorService executor;<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>    public boolean isDone() {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return done;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>    public boolean hasError() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return errorCode != 0;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    }<a name="line.724"></a>
-<span class="sourceLineNo">725</span><a name="line.725"></a>
-<span class="sourceLineNo">726</span>    public boolean finalCheckForErrors() {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      if (errorCode != 0) {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>        return true;<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      }<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      return treatFailureAsError &amp;&amp;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>    @Override<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    public void close() throws IOException {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      if (this.admin != null) this.admin.close();<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span><a name="line.738"></a>
-<span class="sourceLineNo">739</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.739"></a>
-<span class="sourceLineNo">740</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>      this.connection = connection;<a name="line.743"></a>
-<span class="sourceLineNo">744</span>      this.targets = monitorTargets;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      this.useRegExp = useRegExp;<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      this.sink = sink;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      this.executor = executor;<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>    @Override<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    public abstract void run();<a name="line.752"></a>
-<span class="sourceLineNo">753</span><a name="line.753"></a>
-<span class="sourceLineNo">754</span>    protected boolean initAdmin() {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      if (null == this.admin) {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        try {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>          this.admin = this.connection.getAdmin();<a name="line.757"></a>
-<span class="sourceLineNo">758</span>        } catch (Exception e) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>        }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      } else if (admin.isAborted()) {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>        LOG.error("HBaseAdmin aborted");<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      }<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      return !this.hasError();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    }<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
-<span class="sourceLineNo">769</span><a name="line.769"></a>
-<span class="sourceLineNo">770</span>  // a monitor for region mode<a name="line.770"></a>
-<span class="sourceLineNo">771</span>  private static class RegionMonitor extends Monitor {<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    // 10 minutes<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    // 1 days<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>    private long lastCheckTime = -1;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    private boolean writeSniffing;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    private TableName writeTableName;<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    private int writeDataTTL;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    private float regionsLowerLimit;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    private float regionsUpperLimit;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    private int checkPeriod;<a name="line.783"></a>
-<span class="sourceLineNo">784</span><a name="line.784"></a>
-<span class="sourceLineNo">785</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.785"></a>
-<span class="sourceLineNo">786</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.786"></a>
-<span class="sourceLineNo">787</span>        boolean treatFailureAsError) {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      Configuration conf = connection.getConfiguration();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      this.writeSniffing = writeSniffing;<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      this.writeTableName = writeTableName;<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      this.writeDataTTL =<a name="line.792"></a>
-<span class="sourceLineNo">793</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.793"></a>
-<span class="sourceLineNo">794</span>      this.regionsLowerLimit =<a name="line.794"></a>
-<span class="sourceLineNo">795</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.795"></a>
-<span class="sourceLineNo">796</span>      this.regionsUpperLimit =<a name="line.796"></a>
-<span class="sourceLineNo">797</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.797"></a>
-<span class="sourceLineNo">798</span>      this.checkPeriod =<a name="line.798"></a>
-<span class="sourceLineNo">799</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.799"></a>
-<span class="sourceLineNo">800</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>    @Override<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    public void run() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      if (this.initAdmin()) {<a name="line.805"></a>
-<span class="sourceLineNo">806</span>        try {<a name="line.806"></a>
-<span class="sourceLineNo">807</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.809"></a>
-<span class="sourceLineNo">810</span>            this.initialized = true;<a name="line.810"></a>
-<span class="sourceLineNo">811</span>            for (String table : tables) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.812"></a>
-<span class="sourceLineNo">813</span>            }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>          } else {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.815"></a>
-<span class="sourceLineNo">816</span>          }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>          if (writeSniffing) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>              try {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>                checkWriteTableDistribution();<a name="line.821"></a>
-<span class="sourceLineNo">822</span>              } catch (IOException e) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.823"></a>
-<span class="sourceLineNo">824</span>              }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>            }<a name="line.826"></a>
-<span class="sourceLineNo">827</span>            // sniff canary table with write operation<a name="line.827"></a>
-<span class="sourceLineNo">828</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.828"></a>
-<span class="sourceLineNo">829</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.829"></a>
-<span class="sourceLineNo">830</span>          }<a name="line.830"></a>
-<span class="sourceLineNo">831</span><a name="line.831"></a>
-<span class="sourceLineNo">832</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.832"></a>
-<span class="sourceLineNo">833</span>            try {<a name="line.833"></a>
-<span class="sourceLineNo">834</span>              future.get();<a name="line.834"></a>
-<span class="sourceLineNo">835</span>            } catch (ExecutionException e) {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>              LOG.error("Sniff region failed!", e);<a name="line.836"></a>
-<span class="sourceLineNo">837</span>            }<a name="line.837"></a>
-<span class="sourceLineNo">838</span>          }<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        } catch (Exception e) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>          LOG.error("Run regionMonitor failed", e);<a name="line.840"></a>
-<span class="sourceLineNo">841</span>          this.errorCode = ERROR_EXIT_CODE;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>      }<a name="line.843"></a>
-<span class="sourceLineNo">844</span>      this.done = true;<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      String[] returnTables = null;<a name="line.848"></a>
-<span class="sourceLineNo">849</span><a name="line.849"></a>
-<span class="sourceLineNo">850</span>      if (this.useRegExp) {<a name="line.850"></a>
-<span class="sourceLineNo">851</span>        Pattern pattern = null;<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        HTableDescriptor[] tds = null;<a name="line.852"></a>
-<span class="sourceLineNo">853</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        try {<a name="line.854"></a>
-<span class="sourceLineNo">855</span>          if (LOG.isDebugEnabled()) {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>            LOG.debug(String.format("reading list of tables"));<a name="line.856"></a>
-<span class="sourceLineNo">857</span>          }<a name="line.857"></a>
-<span class="sourceLineNo">858</span>          tds = this.admin.listTables(pattern);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>          if (tds == null) {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>            tds = new HTableDescriptor[0];<a name="line.860"></a>
-<span class="sourceLineNo">861</span>          }<a name="line.861"></a>
-<span class="sourceLineNo">862</span>          for (String monitorTarget : monitorTargets) {<a name="line.862"></a>
-<span class="sourceLineNo">863</span>            pattern = Pattern.compile(monitorTarget);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>            for (HTableDescriptor td : tds) {<a name="line.864"></a>
-<span class="sourceLineNo">865</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>                tmpTables.add(td.getNameAsString());<a name="line.866"></a>
-<span class="sourceLineNo">867</span>              }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>            }<a name="line.868"></a>
-<span class="sourceLineNo">869</span>          }<a name="line.869"></a>
-<span class="sourceLineNo">870</span>        } catch (IOException e) {<a name="line.870"></a>
-<span class="sourceLineNo">871</span>          LOG.error("Communicate with admin failed", e);<a name="line.871"></a>
-<span class="sourceLineNo">872</span>          throw e;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>        }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>        if (tmpTables.size() &gt; 0) {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.876"></a>
-<span class="sourceLineNo">877</span>        } else {<a name="line.877"></a>
-<span class="sourceLineNo">878</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.878"></a>
-<span class="sourceLineNo">879</span>          LOG.error(msg);<a name="line.879"></a>
-<span class="sourceLineNo">880</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>          throw new TableNotFoundException(msg);<a name="line.881"></a>
-<span class="sourceLineNo">882</span>        }<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      } else {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>        returnTables = monitorTargets;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>      return returnTables;<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    }<a name="line.888"></a>
-<span class="sourceLineNo">889</span><a name="line.889"></a>
-<span class="sourceLineNo">890</span>    /*<a name="line.890"></a>
-<span class="sourceLineNo">891</span>     * canary entry point to monitor all the tables.<a name="line.891"></a>
-<span class="sourceLineNo">892</span>     */<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    private List&lt;Future&lt;Void&gt;&gt; sniff(TaskType taskType) throws Exception {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      if (LOG.isDebugEnabled()) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        LOG.debug(String.format("reading list of tables"));<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      }<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      for (HTableDescriptor table : admin.listTables()) {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>        if (admin.isTableEnabled(table.getTableName())<a name="line.899"></a>
-<span class="sourceLineNo">900</span>            &amp;&amp; (!table.getTableName().equals(writeTableName))) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>          taskFutures.addAll(Canary.sniff(admin, sink, table, executor, taskType));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        }<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      }<a name="line.903"></a>
-<span class="sourceLineNo">904</span>      return taskFutures;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>    private void checkWriteTableDistribution() throws IOException {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      if (!admin.tableExists(writeTableName)) {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>        int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.909"></a>
-<span class="sourceLineNo">910</span>        if (numberOfServers == 0) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>          throw new IllegalStateException("No live regionservers");<a name="line.911"></a>
-<span class="sourceLineNo">912</span>        }<a name="line.912"></a>
-<span class="sourceLineNo">913</span>        createWriteTable(numberOfServers);<a name="line.913"></a>
-<span class="sourceLineNo">914</span>      }<a name="line.914"></a>
-<span class="sourceLineNo">915</span><a name="line.915"></a>
-<span class="sourceLineNo">916</span>      if (!admin.isTableEnabled(writeTableName)) {<a name="line.916"></a>
-<span class="sourceLineNo">917</span>        admin.enableTable(writeTableName);<a name="line.917"></a>
-<span class="sourceLineNo">918</span>      }<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>      int numberOfServers = admin.getClusterStatus().getServers().size();<a name="line.920"></a>
-<span class="sourceLineNo">921</span>      List&lt;Pair&lt;HRegionInfo, ServerName&gt;&gt; pairs =<a name="line.921"></a>
-<span class="sourceLineNo">922</span>          MetaTableAccessor.getTableRegionsAndLocations(connection, writeTableName);<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      int numberOfRegions = pairs.size();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      if (numberOfRegions &lt; numberOfServers * regionsLowerLimit<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          || numberOfRegions &gt; numberOfServers * regionsUpperLimit) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        admin.disableTable(writeTableName);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>        admin.deleteTable(writeTableName);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>        createWriteTable(numberOfServers);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      HashSet&lt;ServerName&gt; serverSet = new HashSet&lt;ServerName&gt;();<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      for (Pair&lt;HRegionInfo, ServerName&gt; pair : pairs) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>        serverSet.add(pair.getSecond());<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      }<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      int numberOfCoveredServers = serverSet.size();<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      if (numberOfCoveredServers &lt; numberOfServers) {<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        admin.balancer();<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    }<a name="line.938"></a>
-<span class="sourceLineNo">939</span><a name="line.939"></a>
-<span class="sourceLineNo">940</span>    private void createWriteTable(int numberOfServers) throws IOException {<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      int numberOfRegions = (int)(numberOfServers * regionsLowerLimit);<a name="line.941"></a>
-<span class="sourceLineNo">942</span>      LOG.info("Number of live regionservers: " + numberOfServers + ", "<a name="line.942"></a>
-<span class="sourceLineNo">943</span>          + "pre-splitting the canary table into " + numberOfRegions + " regions "<a name="line.943"></a>
-<span class="sourceLineNo">944</span>          + "(current lower limit of regions per server is " + regionsLowerLimit<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          + " and you can change it by config: "<a name="line.945"></a>
-<span class="sourceLineNo">946</span>          + HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY + " )");<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      HTableDescriptor desc = new HTableDescriptor(writeTableName);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>      HColumnDescriptor family = new HColumnDescriptor(CANARY_TABLE_FAMILY_NAME);<a name="line.948"></a>
-<span class="sourceLineNo">949</span>      family.setMaxVersions(1);<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      family.setTimeToLive(writeDataTTL);<a name="line.950"></a>
-<span class="sourceLineNo">951</span><a name="line.951"></a>
-<span class="sourceLineNo">952</span>      desc.addFamily(family);<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      byte[][] splits = new RegionSplitter.HexStringSplit().split(numberOfRegions);<a name="line.953"></a>
-<span class="sourceLineNo">954</span>      admin.createTable(desc, splits);<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    }<a name="line.955"></a>
-<span class="sourceLineNo">956</span>  }<a name="line.956"></a>
-<span class="sourceLineNo">957</span><a name="line.957"></a>
-<span class="sourceLineNo">958</span>  /**<a name="line.958"></a>
-<span class="sourceLineNo">959</span>   * Canary entry point for specified table.<a name="line.959"></a>
-<span class="sourceLineNo">960</span>   * @throws Exception<a name="line.960"></a>
-<span class="sourceLineNo">961</span>   */<a name="line.961"></a>
-<span class="sourceLineNo">962</span>  public static void sniff(final Admin admin, TableName tableName)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      throws Exception {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    sniff(admin, tableName, TaskType.READ);<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>  /**<a name="line.967"></a>
-<span class="sourceLineNo">968</span>   * Canary entry point for specified table with task type(read/write)<a name="line.968"></a>
-<span class="sourceLineNo">969</span>   * @throws Exception<a name="line.969"></a>
-<span class="sourceLineNo">970</span>   */<a name="line.970"></a>
-<span class="sourceLineNo">971</span>  public static void sniff(final Admin admin, TableName tableName, TaskType taskType)<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      throws Exception {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>    List&lt;Future&lt;Void&gt;&gt; taskFutures =<a name="line.973"></a>
-<span class="sourceLineNo">974</span>        Canary.sniff(admin, new StdOutSink(), tableName.getNameAsString(),<a name="line.974"></a>
-<span class="sourceLineNo">975</span>          new ScheduledThreadPoolExecutor(1), taskType);<a name="line.975"></a>
-<span class="sourceLineNo">976</span>    for (Future&lt;Void&gt; future : taskFutures) {<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      future.get();<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><a name="line.980"></a>
-<span class="sourceLineNo">981</span>  /**<a name="line.981"></a>
-<span class="sourceLineNo">982</span>   * Canary entry point for specified table.<a name="line.982"></a>
-<span class="sourceLineNo">983</span>   * @throws Exception<a name="line.983"></a>
-<span class="sourceLineNo">984</span>   */<a name="line.984"></a>
-<span class="sourceLineNo">985</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink, String tableName,<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      ExecutorService executor, TaskType taskType) throws Exception {<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    if (LOG.isDebugEnabled()) {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      LOG.debug(String.format("checking table is enabled and getting table descriptor for table %s",<a name="line.988"></a>
-<span class="sourceLineNo">989</span>        tableName));<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    if (admin.isTableEnabled(TableName.valueOf(tableName))) {<a name="line.991"></a>
-<span class="sourceLineNo">992</span>      return Canary.sniff(admin, sink, admin.getTableDescriptor(TableName.valueOf(tableName)),<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        executor, taskType);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    } else {<a name="line.994"></a>
-<span class="sourceLineNo">995</span>      LOG.warn(String.format("Table %s is not enabled", tableName));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    }<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    return new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.997"></a>
-<span class="sourceLineNo">998</span>  }<a name="line.998"></a>
-<span class="sourceLineNo">999</span><a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  /*<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>   * Loops over regions that owns this table, and output some information abouts the state.<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   */<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>  private static List&lt;Future&lt;Void&gt;&gt; sniff(final Admin admin, final Sink sink,<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>      HTableDescriptor tableDesc, ExecutorService executor, TaskType taskType) throws Exception {<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span><a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>    if (LOG.isDebugEnabled()) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>      LOG.debug(String.format("reading list of regions for table %s", tableDesc.getTableName()));<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>    Table table = null;<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    try {<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      table = admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    } catch (TableNotFoundException e) {<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>      return new ArrayList&lt;Future&lt;Void&gt;&gt;();<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    }<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    List&lt;RegionTask&gt; tasks = new ArrayList&lt;RegionTask&gt;();<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    try {<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>      for (HRegionInfo region : admin.getTableRegions(tableDesc.getTableName())) {<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        tasks.add(new RegionTask(admin.getConnection(), region, sink, taskType));<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    } finally {<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      table.close();<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    }<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    return executor.invokeAll(tasks);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>  }<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>  // a monitor for regionserver mode<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>  private static class RegionServerMonitor extends Monitor {<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    private boolean allRegions;<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span><a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    public RegionServerMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        ExtendedSink sink, ExecutorService executor, boolean allRegions,<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>        boolean treatFailureAsError) {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>      this.allRegions = allRegions;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span><a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    private ExtendedSink getSink() {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>      return (ExtendedSink) this.sink;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span><a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    @Override<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    public void run() {<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>      if (this.initAdmin() &amp;&amp; this.checkNoTableNames()) {<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = this.filterRegionServerByName();<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>        this.initialized = true;<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>        this.monitorRegionServers(rsAndRMap);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      }<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>      this.done = true;<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>    private boolean checkNoTableNames() {<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>      List&lt;String&gt; foundTableNames = new ArrayList&lt;String&gt;();<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>      TableName[] tableNames = null;<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span><a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      if (LOG.isDebugEnabled()) {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>        LOG.debug(String.format("reading list of tables"));<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>      }<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>      try {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>        tableNames = this.admin.listTableNames();<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      } catch (IOException e) {<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>        LOG.error("Get listTableNames failed", e);<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>        return false;<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>      }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span><a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>      if (this.targets == null || this.targets.length == 0) return true;<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span><a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      for (String target : this.targets) {<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        for (TableName tableName : tableNames) {<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>          if (target.equals(tableName.getNameAsString())) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>            foundTableNames.add(target);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          }<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>      }<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span><a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (foundTableNames.size() &gt; 0) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        System.err.println("Cannot pass a tablename when using the -regionserver " +<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>            "option, tablenames:" + foundTableNames.toString());<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        this.errorCode = USAGE_EXIT_CODE;<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>      }<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      return foundTableNames.size() == 0;<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    }<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span><a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    private void monitorRegionServers(Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap) {<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>      List&lt;RegionServerTask&gt; tasks = new ArrayList&lt;RegionServerTask&gt;();<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>      Map&lt;String, AtomicLong&gt; successMap = new HashMap&lt;String, AtomicLong&gt;();<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>      Random rand = new Random();<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>      for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        String serverName = entry.getKey();<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>        AtomicLong successes = new AtomicLong(0);<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>        successMap.put(serverName, successes);<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>        if (this.allRegions) {<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>          for (HRegionInfo region : entry.getValue()) {<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>            tasks.add(new RegionServerTask(this.connection,<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>                serverName,<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>                region,<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>                getSink(),<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>                successes));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>          }<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        } else {<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>          // random select a region if flag not set<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>          HRegionInfo region = entry.getValue().get(rand.nextInt(entry.getValue().size()));<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>          tasks.add(new RegionServerTask(this.connection,<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>              serverName,<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>              region,<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>              getSink(),<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>              successes));<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>        }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span>      }<a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>      try {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>        for (Future&lt;Void&gt; future : this.executor.invokeAll(tasks)) {<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>          try {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>            future.get();<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>          } catch (ExecutionException e) {<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>            LOG.error("Sniff regionserver failed!", e);<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>            this.errorCode = ERROR_EXIT_CODE;<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>          }<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>        }<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        if (this.allRegions) {<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>          for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : rsAndRMap.entrySet()) {<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>            String serverName = entry.getKey();<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>            LOG.info("Successfully read " + successMap.get(serverName) + " regions out of "<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>                    + entry.getValue().size() + " on regionserver:" + serverName);<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          }<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        }<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      } catch (InterruptedException e) {<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>        this.errorCode = ERROR_EXIT_CODE;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        LOG.error("Sniff regionserver interrupted!", e);<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>      }<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>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; filterRegionServerByName() {<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; regionServerAndRegionsMap = this.getAllRegionServerByName();<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>      regionServerAndRegionsMap = this.doFilterRegionServerByName(regionServerAndRegionsMap);<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>      return regionServerAndRegionsMap;<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span><a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; getAllRegionServerByName() {<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; rsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      Table table = null;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      RegionLocator regionLocator = null;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      try {<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>        if (LOG.isDebugEnabled()) {<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span>          LOG.debug(String.format("reading list of tables and locations"));<a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>        }<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>        HTableDescriptor[] tableDescs = this.admin.listTables();<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>        List&lt;HRegionInfo&gt; regions = null;<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>        for (HTableDescriptor tableDesc : tableDescs) {<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>          table = this.admin.getConnection().getTable(tableDesc.getTableName());<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>          regionLocator = this.admin.getConnection().getRegionLocator(tableDesc.getTableName());<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span><a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>          for (HRegionLocation location : regionLocator.getAllRegionLocations()) {<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>            ServerName rs = location.getServerName();<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>            String rsName = rs.getHostname();<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>            HRegionInfo r = location.getRegionInfo();<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span><a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>            if (rsAndRMap.containsKey(rsName)) {<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>              regions = rsAndRMap.get(rsName);<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>            } else {<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>              regions = new ArrayList&lt;HRegionInfo&gt;();<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>              rsAndRMap.put(rsName, regions);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>            }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span>            regions.add(r);<a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>          }<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>          table.close();<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        }<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span><a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>      } catch (IOException e) {<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>        String msg = "Get HTables info failed";<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>        LOG.error(msg, e);<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>      } finally {<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>        if (table != null) {<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          try {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            table.close();<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          } catch (IOException e) {<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>            LOG.warn("Close table failed", e);<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          }<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>        }<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>      }<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span><a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>      return rsAndRMap;<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>    }<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span><a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>    private Map&lt;String, List&lt;HRegionInfo&gt;&gt; doFilterRegionServerByName(<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>        Map&lt;String, List&lt;HRegionInfo&gt;&gt; fullRsAndRMap) {<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span><a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>      Map&lt;String, List&lt;HRegionInfo&gt;&gt; filteredRsAndRMap = null;<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span><a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>      if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>        filteredRsAndRMap = new HashMap&lt;String, List&lt;HRegionInfo&gt;&gt;();<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        Pattern pattern = null;<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>        Matcher matcher = null;<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>        boolean regExpFound = false;<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        for (String rsName : this.targets) {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>          if (this.useRegExp) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>            regExpFound = false;<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>            pattern = Pattern.compile(rsName);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>            for (Map.Entry&lt;String, List&lt;HRegionInfo&gt;&gt; entry : fullRsAndRMap.entrySet()) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>              matcher = pattern.matcher(entry.getKey());<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>              if (matcher.matches()) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>                filteredRsAndRMap.put(entry.getKey(), entry.getValue());<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>                regExpFound = true;<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>            if (!regExpFound) {<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>              LOG.info("No RegionServerInfo found, regionServerPattern:" + rsName);<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>            }<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>            if (fullRsAndRMap.containsKey(rsName)) {<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>              filteredRsAndRMap.put(rsName, fullRsAndRMap.get(rsName));<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>            } else {<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>              LOG.info("No RegionServerInfo found, regionServerName:" + rsName);<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>            }<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>          }<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>        }<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>        filteredRsAndRMap = fullRsAndRMap;<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>      return filteredRsAndRMap;<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><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>  public static void main(String[] args) throws Exception {<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    final Configuration conf = HBaseConfiguration.create();<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span><a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // loading the generic options to conf<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    new GenericOptionsParser(conf, args);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span><a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>    int numThreads = conf.getInt("hbase.canary.threads.num", MAX_THREADS_NUM);<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    LOG.info("Number of exection threads " + numThreads);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span><a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    ExecutorService executor = new ScheduledThreadPoolExecutor(numThreads);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span><a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    Class&lt;? extends Sink&gt; sinkClass =<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        conf.getClass("hbase.canary.sink.class", RegionServerStdOutSink.class, Sink.class);<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>    Sink sink = ReflectionUtils.newInstance(sinkClass);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span><a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    int exitCode = ToolRunner.run(conf, new Canary(executor, sink), args);<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    executor.shutdown();<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    System.exit(exitCode);<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>  }<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>}<a name="line.1244"></a>
+<span class="sourceLineNo">625</span>            }<a name="line.625"></a>
+<span class="sourceLineNo">626</span>          }<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>          if (this.failOnError &amp;&amp; monitor.finalCheckForErrors()) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>            monitorThread.interrupt();<a name="line.629"></a>
+<span class="sourceLineNo">630</span>            return monitor.errorCode;<a name="line.630"></a>
+<span class="sourceLineNo">631</span>          }<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        } finally {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>          if (monitor != null) monitor.close();<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        }<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>        Thread.sleep(interval);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      } while (interval &gt; 0);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>    } // try-with-resources close<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>    if (choreService != null) {<a name="line.640"></a>
+<span class="sourceLineNo">641</span>      choreService.shutdown();<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    return monitor.errorCode;<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>  private void printUsageAndExit() {<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    System.err.printf(<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      "Usage: bin/hbase %s [opts] [table1 [table2]...] | [regionserver1 [regionserver2]..]%n",<a name="line.648"></a>
+<span class="sourceLineNo">649</span>        getClass().getName());<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    System.err.println(" where [opts] are:");<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.err.println("   -help          Show this help and exit.");<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    System.err.println("   -regionserver  replace the table argument to regionserver,");<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    System.err.println("      which means to enable regionserver mode");<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    System.err.println("   -allRegions    Tries all regions on a regionserver,");<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    System.err.println("      only works in regionserver mode.");<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    System.err.println("   -daemon        Continuous check at defined intervals.");<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    System.err.println("   -interval &lt;N&gt;  Interval between checks (sec)");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    System.err.println("   -e             Use table/regionserver as regular expression");<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    System.err.println("      which means the table/regionserver is regular expression pattern");<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    System.err.println("   -f &lt;B&gt;         stop whole program if first error occurs," +<a name="line.660"></a>
+<span class="sourceLineNo">661</span>        " default is true");<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    System.err.println("   -t &lt;N&gt;         timeout for a check, default is 600000 (milisecs)");<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    System.err.println("   -writeSniffing enable the write sniffing in canary");<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    System.err.println("   -treatFailureAsError treats read / write failure as error");<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    System.err.println("   -writeTable    The table used for write sniffing."<a name="line.665"></a>
+<span class="sourceLineNo">666</span>        + " Default is hbase:canary");<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    System.err<a name="line.667"></a>
+<span class="sourceLineNo">668</span>        .println("   -D&lt;configProperty&gt;=&lt;value&gt; assigning or override the configuration params");<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    System.exit(USAGE_EXIT_CODE);<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>   * A Factory method for {@link Monitor}.<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * Can be overridden by user.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   * @param index a start index for monitor target<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   * @param args args passed from user<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   * @return a Monitor instance<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   */<a name="line.678"></a>
+<span class="sourceLineNo">679</span>  public Monitor newMonitor(final Connection connection, int index, String[] args) {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Monitor monitor = null;<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    String[] monitorTargets = null;<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>    if(index &gt;= 0) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      int length = args.length - index;<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      monitorTargets = new String[length];<a name="line.685"></a>
+<span class="sourceLineNo">686</span>      System.arraycopy(args, index, monitorTargets, 0, length);<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>    if (this.regionServerMode) {<a name="line.689"></a>
+<span class="sourceLineNo">690</span>      monitor =<a name="line.690"></a>
+<span class="sourceLineNo">691</span>          new RegionServerMonitor(connection, monitorTargets, this.useRegExp,<a name="line.691"></a>
+<span class="sourceLineNo">692</span>              (ExtendedSink) this.sink, this.executor, this.regionServerAllRegions,<a name="line.692"></a>
+<span class="sourceLineNo">693</span>              this.treatFailureAsError);<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    } else {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      monitor =<a name="line.695"></a>
+<span class="sourceLineNo">696</span>          new RegionMonitor(connection, monitorTargets, this.useRegExp, this.sink, this.executor,<a name="line.696"></a>
+<span class="sourceLineNo">697</span>              this.writeSniffing, this.writeTableName, this.treatFailureAsError);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    }<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    return monitor;<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">702</span>  // a Monitor super-class can be extended by users<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  public static abstract class Monitor implements Runnable, Closeable {<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>    protected Connection connection;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    protected Admin admin;<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    protected String[] targets;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    protected boolean useRegExp;<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    protected boolean treatFailureAsError;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    protected boolean initialized = false;<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>    protected boolean done = false;<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    protected int errorCode = 0;<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    protected Sink sink;<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    protected ExecutorService executor;<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>    public boolean isDone() {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      return done;<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>    public boolean hasError() {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      return errorCode != 0;<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    }<a name="line.723"></a>
+<span class="sourceLineNo">724</span><a name="line.724"></a>
+<span class="sourceLineNo">725</span>    public boolean finalCheckForErrors() {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      if (errorCode != 0) {<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        return true;<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      return treatFailureAsError &amp;&amp;<a name="line.729"></a>
+<span class="sourceLineNo">730</span>          (sink.getReadFailureCount() &gt; 0 || sink.getWriteFailureCount() &gt; 0);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>    @Override<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    public void close() throws IOException {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      if (this.admin != null) this.admin.close();<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    protected Monitor(Connection connection, String[] monitorTargets, boolean useRegExp, Sink sink,<a name="line.738"></a>
+<span class="sourceLineNo">739</span>        ExecutorService executor, boolean treatFailureAsError) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      if (null == connection) throw new IllegalArgumentException("connection shall not be null");<a name="line.740"></a>
+<span class="sourceLineNo">741</span><a name="line.741"></a>
+<span class="sourceLineNo">742</span>      this.connection = connection;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      this.targets = monitorTargets;<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      this.useRegExp = useRegExp;<a name="line.744"></a>
+<span class="sourceLineNo">745</span>      this.treatFailureAsError = treatFailureAsError;<a name="line.745"></a>
+<span class="sourceLineNo">746</span>      this.sink = sink;<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      this.executor = executor;<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>    @Override<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    public abstract void run();<a name="line.751"></a>
+<span class="sourceLineNo">752</span><a name="line.752"></a>
+<span class="sourceLineNo">753</span>    protected boolean initAdmin() {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>      if (null == this.admin) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        try {<a name="line.755"></a>
+<span class="sourceLineNo">756</span>          this.admin = this.connection.getAdmin();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        } catch (Exception e) {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>          LOG.error("Initial HBaseAdmin failed...", e);<a name="line.758"></a>
+<span class="sourceLineNo">759</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
+<span class="sourceLineNo">761</span>      } else if (admin.isAborted()) {<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        LOG.error("HBaseAdmin aborted");<a name="line.762"></a>
+<span class="sourceLineNo">763</span>        this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      return !this.hasError();<a name="line.765"></a>
+<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
+<span class="sourceLineNo">767</span>  }<a name="line.767"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>  // a monitor for region mode<a name="line.769"></a>
+<span class="sourceLineNo">770</span>  private static class RegionMonitor extends Monitor {<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    // 10 minutes<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    private static final int DEFAULT_WRITE_TABLE_CHECK_PERIOD = 10 * 60 * 1000;<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    // 1 days<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    private static final int DEFAULT_WRITE_DATA_TTL = 24 * 60 * 60;<a name="line.774"></a>
+<span class="sourceLineNo">775</span><a name="line.775"></a>
+<span class="sourceLineNo">776</span>    private long lastCheckTime = -1;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    private boolean writeSniffing;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    private TableName writeTableName;<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    private int writeDataTTL;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    private float regionsLowerLimit;<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    private float regionsUpperLimit;<a name="line.781"></a>
+<span class="sourceLineNo">782</span>    private int checkPeriod;<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>    public RegionMonitor(Connection connection, String[] monitorTargets, boolean useRegExp,<a name="line.784"></a>
+<span class="sourceLineNo">785</span>        Sink sink, ExecutorService executor, boolean writeSniffing, TableName writeTableName,<a name="line.785"></a>
+<span class="sourceLineNo">786</span>        boolean treatFailureAsError) {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      super(connection, monitorTargets, useRegExp, sink, executor, treatFailureAsError);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      Configuration conf = connection.getConfiguration();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>      this.writeSniffing = writeSniffing;<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      this.writeTableName = writeTableName;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      this.writeDataTTL =<a name="line.791"></a>
+<span class="sourceLineNo">792</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_DATA_TTL_KEY, DEFAULT_WRITE_DATA_TTL);<a name="line.792"></a>
+<span class="sourceLineNo">793</span>      this.regionsLowerLimit =<a name="line.793"></a>
+<span class="sourceLineNo">794</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_LOWERLIMIT_KEY, 1.0f);<a name="line.794"></a>
+<span class="sourceLineNo">795</span>      this.regionsUpperLimit =<a name="line.795"></a>
+<span class="sourceLineNo">796</span>          conf.getFloat(HConstants.HBASE_CANARY_WRITE_PERSERVER_REGIONS_UPPERLIMIT_KEY, 1.5f);<a name="line.796"></a>
+<span class="sourceLineNo">797</span>      this.checkPeriod =<a name="line.797"></a>
+<span class="sourceLineNo">798</span>          conf.getInt(HConstants.HBASE_CANARY_WRITE_TABLE_CHECK_PERIOD_KEY,<a name="line.798"></a>
+<span class="sourceLineNo">799</span>            DEFAULT_WRITE_TABLE_CHECK_PERIOD);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>    @Override<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    public void run() {<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      if (this.initAdmin()) {<a name="line.804"></a>
+<span class="sourceLineNo">805</span>        try {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>          List&lt;Future&lt;Void&gt;&gt; taskFutures = new LinkedList&lt;Future&lt;Void&gt;&gt;();<a name="line.806"></a>
+<span class="sourceLineNo">807</span>          if (this.targets != null &amp;&amp; this.targets.length &gt; 0) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>            String[] tables = generateMonitorTables(this.targets);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>            this.initialized = true;<a name="line.809"></a>
+<span class="sourceLineNo">810</span>            for (String table : tables) {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>              taskFutures.addAll(Canary.sniff(admin, sink, table, executor, TaskType.READ));<a name="line.811"></a>
+<span class="sourceLineNo">812</span>            }<a name="line.812"></a>
+<span class="sourceLineNo">813</span>          } else {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>            taskFutures.addAll(sniff(TaskType.READ));<a name="line.814"></a>
+<span class="sourceLineNo">815</span>          }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>          if (writeSniffing) {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>            if (EnvironmentEdgeManager.currentTime() - lastCheckTime &gt; checkPeriod) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>              try {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>                checkWriteTableDistribution();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>              } catch (IOException e) {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>                LOG.error("Check canary table distribution failed!", e);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>              }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>              lastCheckTime = EnvironmentEdgeManager.currentTime();<a name="line.824"></a>
+<span class="sourceLineNo">825</span>            }<a name="line.825"></a>
+<span class="sourceLineNo">826</span>            // sniff canary table with write operation<a name="line.826"></a>
+<span class="sourceLineNo">827</span>            taskFutures.addAll(Canary.sniff(admin, sink,<a name="line.827"></a>
+<span class="sourceLineNo">828</span>              admin.getTableDescriptor(writeTableName), executor, TaskType.WRITE));<a name="line.828"></a>
+<span class="sourceLineNo">829</span>          }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>          for (Future&lt;Void&gt; future : taskFutures) {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>            try {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>              future.get();<a name="line.833"></a>
+<span class="sourceLineNo">834</span>            } catch (ExecutionException e) {<a name="line.834"></a>
+<span class="sourceLineNo">835</span>              LOG.error("Sniff region failed!", e);<a name="line.835"></a>
+<span class="sourceLineNo">836</span>            }<a name="line.836"></a>
+<span class="sourceLineNo">837</span>          }<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        } catch (Exception e) {<a name="line.838"></a>
+<span class="sourceLineNo">839</span>          LOG.error("Run regionMonitor failed", e);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>          this.errorCode = ERROR_EXIT_CODE;<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>      this.done = true;<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>    private String[] generateMonitorTables(String[] monitorTargets) throws IOException {<a name="line.846"></a>
+<span class="sourceLineNo">847</span>      String[] returnTables = null;<a name="line.847"></a>
+<span class="sourceLineNo">848</span><a name="line.848"></a>
+<span class="sourceLineNo">849</span>      if (this.useRegExp) {<a name="line.849"></a>
+<span class="sourceLineNo">850</span>        Pattern pattern = null;<a name="line.850"></a>
+<span class="sourceLineNo">851</span>        HTableDescriptor[] tds = null;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>        Set&lt;String&gt; tmpTables = new TreeSet&lt;String&gt;();<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        try {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          if (LOG.isDebugEnabled()) {<a name="line.854"></a>
+<span class="sourceLineNo">855</span>            LOG.debug(String.format("reading list of tables"));<a name="line.855"></a>
+<span class="sourceLineNo">856</span>          }<a name="line.856"></a>
+<span class="sourceLineNo">857</span>          tds = this.admin.listTables(pattern);<a name="line.857"></a>
+<span class="sourceLineNo">858</span>          if (tds == null) {<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            tds = new HTableDescriptor[0];<a name="line.859"></a>
+<span class="sourceLineNo">860</span>          }<a name="line.860"></a>
+<span class="sourceLineNo">861</span>          for (String monitorTarget : monitorTargets) {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>            pattern = Pattern.compile(monitorTarget);<a name="line.862"></a>
+<span class="sourceLineNo">863</span>            for (HTableDescriptor td : tds) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>              if (pattern.matcher(td.getNameAsString()).matches()) {<a name="line.864"></a>
+<span class="sourceLineNo">865</span>                tmpTables.add(td.getNameAsString());<a name="line.865"></a>
+<span class="sourceLineNo">866</span>              }<a name="line.866"></a>
+<span class="sourceLineNo">867</span>            }<a name="line.867"></a>
+<span class="sourceLineNo">868</span>          }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>        } catch (IOException e) {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>          LOG.error("Communicate with admin failed", e);<a name="line.870"></a>
+<span class="sourceLineNo">871</span>          throw e;<a name="line.871"></a>
+<span class="sourceLineNo">872</span>        }<a name="line.872"></a>
+<span class="sourceLineNo">873</span><a name="line.873"></a>
+<span class="sourceLineNo">874</span>        if (tmpTables.size() &gt; 0) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>          returnTables = tmpTables.toArray(new String[tmpTables.size()]);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>        } else {<a name="line.876"></a>
+<span class="sourceLineNo">877</span>          String msg = "No HTable found, tablePattern:" + Arrays.toString(monitorTargets);<a name="line.877"></a>
+<span class="sourceLineNo">878</span>          LOG.error(msg);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>          this.errorCode = INIT_ERROR_EXIT_CODE;<a name="line.879"></a>
+<span class="sourceLineNo">880</span>          throw new TableNotFoundException(msg);<a name="line.880"></a>
+<span class="sourceLineNo">881</span>        }<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      } else {<a name="line.882"></a>


<TRUNCATED>

[50/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index b72d971..33e12f0 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20160210" />
+    <meta name="Date-Revision-yyyymmdd" content="20160211" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -283,7 +283,7 @@
 <td>1673</td>
 <td>0</td>
 <td>0</td>
-<td>12772</td></tr></table></div>
+<td>12767</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -796,7 +796,7 @@
 <td><a href="#org.apache.hadoop.hbase.client.MultiServerCallable.java">org/apache/hadoop/hbase/client/MultiServerCallable.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>9</td></tr>
+<td>8</td></tr>
 <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>
@@ -2641,7 +2641,7 @@
 <td><a href="#org.apache.hadoop.hbase.master.LoadBalancer.java">org/apache/hadoop/hbase/master/LoadBalancer.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>18</td></tr>
+<td>16</td></tr>
 <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>
@@ -2786,7 +2786,7 @@
 <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>84</td></tr>
+<td>82</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.ClusterLoadState.java">org/apache/hadoop/hbase/master/balancer/ClusterLoadState.java</a></td>
 <td>0</td>
@@ -6033,7 +6033,7 @@
 <tr class="a">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_blocks.html#NeedBraces">NeedBraces</a></td>
-<td>1790</td>
+<td>1789</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td>coding</td>
@@ -6124,12 +6124,12 @@
 <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>766</td>
+<td>767</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#NonEmptyAtclauseDescription">NonEmptyAtclauseDescription</a></td>
-<td>3414</td>
+<td>3409</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td>misc</td>
@@ -14553,7 +14553,7 @@
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
+<td>JavadocTagContinuationIndentation</td>
 <td>Javadoc comment at column 64 has parse error. Missed HTML close tag 'code'. Sometimes it means that close tag missed for one of previous tags.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/HBaseAdmin.html#L1767">1767</a></td></tr>
 <tr class="a">
@@ -15701,143 +15701,137 @@
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'com.google.common.annotations.VisibleForTesting' import.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MultiServerCallable.html#L45">45</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MultiServerCallable.html#L44">44</a></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><a href="./xref/org/apache/hadoop/hbase/client/MultiServerCallable.html#L52">52</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MultiServerCallable.html#L51">51</a></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><a href="./xref/org/apache/hadoop/hbase/client/MultiServerCallable.html#L88">88</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MultiServerCallable.html#L87">87</a></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><a href="./xref/org/apache/hadoop/hbase/client/MultiServerCallable.html#L109">109</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MultiServerCallable.html#L108">108</a></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><a href="./xref/org/apache/hadoop/hbase/client/MultiServerCallable.html#L123">123</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MultiServerCallable.html#L122">122</a></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><a href="./xref/org/apache/hadoop/hbase/client/MultiServerCallable.html#L133">133</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MultiServerCallable.html#L132">132</a></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><a href="./xref/org/apache/hadoop/hbase/client/MultiServerCallable.html#L149">149</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MultiServerCallable.html#L148">148</a></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><a href="./xref/org/apache/hadoop/hbase/client/MultiServerCallable.html#L155">155</a></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><a href="./xref/org/apache/hadoop/hbase/client/MultiServerCallable.html#L157">157</a></td></tr></table></div>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MultiServerCallable.html#L154">154</a></td></tr></table></div>
 <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>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'com.google.common.collect.ArrayListMultimap' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Mutation.html#L51">51</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Mutation.html#L124">124</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Mutation.html#L125">125</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Mutation.html#L126">126</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Mutation.html#L127">127</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Mutation.html#L236">236</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Mutation.html#L330">330</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Mutation.html#L340">340</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Mutation.html#L344">344</a></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><a href="./xref/org/apache/hadoop/hbase/client/Mutation.html#L434">434</a></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><a href="./xref/org/apache/hadoop/hbase/client/Mutation.html#L466">466</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Mutation.html#L475">475</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Mutation.html#L476">476</a></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>
@@ -15846,13 +15840,13 @@
 <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="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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>
@@ -15861,79 +15855,79 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.PreemptiveFastFailInterceptor.java">org/apache/hadoop/hbase/client/PreemptiveFastFailInterceptor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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><a href="./xref/org/apache/hadoop/hbase/client/PreemptiveFastFailInterceptor.html#L151">151</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/PreemptiveFastFailInterceptor.html#L154">154</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/PreemptiveFastFailInterceptor.html#L216">216</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/PreemptiveFastFailInterceptor.html#L220">220</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/PreemptiveFastFailInterceptor.html#L242">242</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/PreemptiveFastFailInterceptor.html#L278">278</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/PreemptiveFastFailInterceptor.html#L310">310</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/PreemptiveFastFailInterceptor.html#L338">338</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/PreemptiveFastFailInterceptor.html#L339">339</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/PreemptiveFastFailInterceptor.html#L340">340</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/PreemptiveFastFailInterceptor.html#L341">341</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -15942,97 +15936,97 @@
 <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="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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><a href="./xref/org/apache/hadoop/hbase/client/Put.html#L73">73</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Put.html#L74">74</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Put.html#L75">75</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Put.html#L104">104</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Put.html#L105">105</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Put.html#L106">106</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Put.html#L107">107</a></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><a href="./xref/org/apache/hadoop/hbase/client/Put.html#L303">303</a></td></tr>
-<tr 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 have incorrect indentation level 2, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Put.html#L306">306</a></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><a href="./xref/org/apache/hadoop/hbase/client/Put.html#L318">318</a></td></tr>
-<tr 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 have incorrect indentation level 2, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Put.html#L321">321</a></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><a href="./xref/org/apache/hadoop/hbase/client/Put.html#L333">333</a></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><a href="./xref/org/apache/hadoop/hbase/client/Put.html#L349">349</a></td></tr>
-<tr 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 have incorrect indentation level 6, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Put.html#L352">352</a></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>
@@ -16041,55 +16035,55 @@
 <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="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</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 'com.google.common.collect.Maps' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Query.html#L22">22</a></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.google.common.collect.ArrayListMultimap' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Query.html#L34">34</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Query.html#L68">68</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Query.html#L78">78</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Query.html#L82">82</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Query.html#L138">138</a></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><a href="./xref/org/apache/hadoop/hbase/client/Query.html#L171">171</a></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>
@@ -16098,13 +16092,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RegionAdminServiceCallable.java">org/apache/hadoop/hbase/client/RegionAdminServiceCallable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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>
@@ -16113,13 +16107,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RegionCoprocessorServiceExec.java">org/apache/hadoop/hbase/client/RegionCoprocessorServiceExec.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -16128,43 +16122,43 @@
 <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="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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><a href="./xref/org/apache/hadoop/hbase/client/RegionReplicaUtil.html#L31">31</a></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><a href="./xref/org/apache/hadoop/hbase/client/RegionReplicaUtil.html#L58">58</a></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><a href="./xref/org/apache/hadoop/hbase/client/RegionReplicaUtil.html#L80">80</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/RegionReplicaUtil.html#L98">98</a></td></tr>
-<tr 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 have incorrect indentation level 10, expected level should be 8.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/RegionReplicaUtil.html#L133">133</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -16173,13 +16167,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RegionServerCallable.java">org/apache/hadoop/hbase/client/RegionServerCallable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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>
@@ -16188,25 +16182,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.Registry.java">org/apache/hadoop/hbase/client/Registry.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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><a href="./xref/org/apache/hadoop/hbase/client/Registry.html#L33">33</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Registry.html#L39">39</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -16215,13 +16209,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RegistryFactory.java">org/apache/hadoop/hbase/client/RegistryFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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>
@@ -16230,79 +16224,79 @@
 <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>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Result.html#L250">250</a></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><a href="./xref/org/apache/hadoop/hbase/client/Result.html#L252">252</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Result.html#L346">346</a></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><a href="./xref/org/apache/hadoop/hbase/client/Result.html#L350">350</a></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><a href="./xref/org/apache/hadoop/hbase/client/Result.html#L378">378</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'familyEntry' have incorrect indentation level 6, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Result.html#L661">661</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Result.html#L837">837</a></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><a href="./xref/org/apache/hadoop/hbase/client/Result.html#L854">854</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Result.html#L855">855</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Result.html#L873">873</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Result.html#L879">879</a></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>
@@ -16311,37 +16305,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ResultBoundedCompletionService.java">org/apache/hadoop/hbase/client/ResultBoundedCompletionService.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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><a href="./xref/org/apache/hadoop/hbase/client/ResultBoundedCompletionService.html#L85">85</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ResultBoundedCompletionService.html#L87">87</a></td></tr>
-<tr 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><a href="./xref/org/apache/hadoop/hbase/client/ResultBoundedCompletionService.html#L152">152</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ResultBoundedCompletionService.html#L159">159</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -16350,13 +16344,13 @@
 <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="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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>
@@ -16365,13 +16359,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="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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>
@@ -16380,19 +16374,19 @@
 <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="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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' have incorrect indentation level 0, expected level should be 2.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/RetriesExhaustedWithDetailsException.html#L49">49</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -16401,43 +16395,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RetryingCallable.java">org/apache/hadoop/hbase/client/RetryingCallable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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><a href="./xref/org/apache/hadoop/hbase/client/RetryingCallable.html#L43">43</a></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><a href="./xref/org/apache/hadoop/hbase/client/RetryingCallable.html#L45">45</a></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><a href="./xref/org/apache/hadoop/hbase/client/RetryingCallable.html#L60">60</a></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><a href="./xref/org/apache/hadoop/hbase/client/RetryingCallable.html#L61">61</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/RetryingCallable.html#L66">66</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -16446,31 +16440,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RetryingCallerInterceptor.java">org/apache/hadoop/hbase/client/RetryingCallerInterceptor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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><a href="./xref/org/apache/hadoop/hbase/client/RetryingCallerInterceptor.html#L72">72</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/RetryingCallerInterceptor.html#L80">80</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/RetryingCallerInterceptor.html#L81">81</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -16479,49 +16473,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ReversedClientScanner.java">org/apache/hadoop/hbase/client/ReversedClientScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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><a href="./xref/org/apache/hadoop/hbase/client/ReversedClientScanner.html#L44">44</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ReversedClientScanner.html#L45">45</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ReversedClientScanner.html#L46">46</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ReversedClientScanner.html#L47">47</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ReversedClientScanner.html#L48">48</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ReversedClientScanner.html#L49">49</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -16530,73 +16524,73 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ReversedScannerCallable.java">org/apache/hadoop/hbase/client/ReversedScannerCallable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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><a href="./xref/org/apache/hadoop/hbase/client/ReversedScannerCallable.html#L50">50</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ReversedScannerCallable.html#L51">51</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ReversedScannerCallable.html#L52">52</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ReversedScannerCallable.html#L53">53</a></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><a href="./xref/org/apache/hadoop/hbase/client/ReversedScannerCallable.html#L56">56</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ReversedScannerCallable.html#L65">65</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ReversedScannerCallable.html#L66">66</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ReversedScannerCallable.html#L67">67</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ReversedScannerCallable.html#L68">68</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ReversedScannerCallable.html#L95">95</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -16605,25 +16599,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RowMutations.java">org/apache/hadoop/hbase/client/RowMutations.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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><a href="./xref/org/apache/hadoop/hbase/client/RowMutations.html#L61">61</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/RowMutations.html#L70">70</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -16632,13 +16626,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RpcRetryingCaller.java">org/apache/hadoop/hbase/client/RpcRetryingCaller.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</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>
@@ -16647,13 +16641,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RpcRetryingCallerFactory.java">org/apache/hadoop/hbase/client/RpcRetryingCallerFactory.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</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>
@@ -16662,31 +16656,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RpcRetryingCallerImpl.java">org/apache/hadoop/hbase/client/RpcRetryingCallerImpl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</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 'com.google.protobuf.ServiceException' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/RpcRetryingCallerImpl.html#L39">39</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/RpcRetryingCallerImpl.html#L85">85</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/RpcRetryingCallerImpl.html#L159">159</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -16695,25 +16689,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.RpcRetryingCallerWithReadReplicas.java">org/apache/hadoop/hbase/client/RpcRetryingCallerWithReadReplicas.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<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.google.protobuf.ServiceException' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/RpcRetryingCallerWithReadReplicas.html#L51">51</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/RpcRetryingCallerWithReadReplicas.html#L123">123</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -16722,55 +16716,55 @@
 <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="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Scan.html#L122">122</a></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><a href="./xref/org/apache/hadoop/hbase/client/Scan.html#L386">386</a></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><a href="./xref/org/apache/hadoop/hbase/client/Scan.html#L387">387</a></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><a href="./xref/org/apache/hadoop/hbase/client/Scan.html#L676">676</a></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><a href="./xref/org/apache/hadoop/hbase/client/Scan.html#L686">686</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Scan.html#L717">717</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Scan.html#L898">898</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -16779,55 +16773,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ScannerCallable.java">org/apache/hadoop/hbase/client/ScannerCallable.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</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 'com.google.protobuf.ServiceException' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ScannerCallable.html#L55">55</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ScannerCallable.html#L120">120</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ScannerCallable.html#L121">121</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ScannerCallable.html#L122">122</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ScannerCallable.html#L123">123</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ScannerCallable.html#L145">145</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ScannerCallable.html#L358">358</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -16836,49 +16830,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.java">org/apache/hadoop/hbase/client/ScannerCallableWithReplicas.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<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><a href="./xref/org/apache/hadoop/hbase/client/ScannerCallableWithReplicas.html#L23">23</a></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.google.common.annotations.VisibleForTesting' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ScannerCallableWithReplicas.html#L46">46</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ScannerCallableWithReplicas.html#L225">225</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ScannerCallableWithReplicas.html#L228">228</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ScannerCallableWithReplicas.html#L263">263</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ScannerCallableWithReplicas.html#L309">309</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -16887,13 +16881,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ScannerTimeoutException.java">org/apache/hadoop/hbase/client/ScannerTimeoutException.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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>
@@ -16902,13 +16896,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ServerStatisticTracker.java">org/apache/hadoop/hbase/client/ServerStatisticTracker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -16917,13 +16911,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.StatsTrackingRpcRetryingCaller.java">org/apache/hadoop/hbase/client/StatsTrackingRpcRetryingCaller.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -16932,181 +16926,181 @@
 <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>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'com.google.protobuf.Descriptors' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L35">35</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L116">116</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L135">135</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L136">136</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L147">147</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L149">149</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L150">150</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L208">208</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L209">209</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L260">260</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L261">261</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L264">264</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L265">265</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L308">308</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L350">350</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L369">369</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L422">422</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L427">427</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L428">428</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L450">450</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L455">455</a></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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L456">456</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L457">457</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img 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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L472">472</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img 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><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L484">484</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L510">510</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L511">511</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/Table.html#L546">546</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -17115,13 +17109,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TableConfiguration.java">org/apache/hadoop/hbase/client/TableConfiguration.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -17130,31 +17124,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TableSnapshotScanner.java">org/apache/hadoop/hbase/client/TableSnapshotScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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><a href="./xref/org/apache/hadoop/hbase/client/TableSnapshotScanner.html#L89">89</a></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><a href="./xref/org/apache/hadoop/hbase/client/TableSnapshotScanner.html#L90">90</a></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><a href="./xref/org/apache/hadoop/hbase/client/TableSnapshotScanner.html#L105">105</a></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>
@@ -17163,211 +17157,211 @@
 <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="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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 have incorrect indentation level 6, expected level should be 8.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L50">50</a></td></tr>
-<tr 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 have incorrect indentation level 8, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L51">51</a></td></tr>
-<tr 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 have incorrect indentation level 8, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L52">52</a></td></tr>
-<tr 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 have incorrect indentation level 6, expected level should be 8.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L53">53</a></td></tr>
-<tr 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 have incorrect indentation level 8, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L54">54</a></td></tr>
-<tr 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 have incorrect indentation level 8, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L55">55</a></td></tr>
-<tr 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 have incorrect indentation level 6, expected level should be 8.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L56">56</a></td></tr>
-<tr 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 have incorrect indentation level 8, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L57">57</a></td></tr>
-<tr 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 have incorrect indentation level 8, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L58">58</a></td></tr>
-<tr 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 have incorrect indentation level 6, expected level should be 8.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L59">59</a></td></tr>
-<tr 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 have incorrect indentation level 8, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L60">60</a></td></tr>
-<tr 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 have incorrect indentation level 8, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L61">61</a></td></tr>
-<tr 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 have incorrect indentation level 6, expected level should be 8.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L62">62</a></td></tr>
-<tr 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 have incorrect indentation level 8, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L63">63</a></td></tr>
-<tr 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 have incorrect indentation level 6, expected level should be 8.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L76">76</a></td></tr>
-<tr 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 have incorrect indentation level 8, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L77">77</a></td></tr>
-<tr 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 have incorrect indentation level 8, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L78">78</a></td></tr>
-<tr 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 have incorrect indentation level 6, expected level should be 8.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L79">79</a></td></tr>
-<tr 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 have incorrect indentation level 8, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L80">80</a></td></tr>
-<tr 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 have incorrect indentation level 8, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L81">81</a></td></tr>
-<tr 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 have incorrect indentation level 6, expected level should be 8.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L82">82</a></td></tr>
-<tr 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 have incorrect indentation level 8, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L83">83</a></td></tr>
-<tr 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 have incorrect indentation level 8, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L84">84</a></td></tr>
-<tr 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 have incorrect indentation level 6, expected level should be 8.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L85">85</a></td></tr>
-<tr 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 have incorrect indentation level 8, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L86">86</a></td></tr>
-<tr 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 have incorrect indentation level 8, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L87">87</a></td></tr>
-<tr 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 have incorrect indentation level 6, expected level should be 8.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L88">88</a></td></tr>
-<tr 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 have incorrect indentation level 8, expected level should be 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L89">89</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L141">141</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L186">186</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L194">194</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L195">195</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/TableState.html#L199">199</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -17376,19 +17370,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.UnmodifyableHTableDescriptor.java">org/apache/hadoop/hbase/client/UnmodifyableHTableDescriptor.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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><a href="./xref/org/apache/hadoop/hbase/client/UnmodifyableHTableDescriptor.html#L81">81</a></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>
@@ -17397,43 +17391,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.ZooKeeperRegistry.java">org/apache/hadoop/hbase/client/ZooKeeperRegistry.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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><a href="./xref/org/apache/hadoop/hbase/client/ZooKeeperRegistry.html#L74">74</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ZooKeeperRegistry.html#L80">80</a></td></tr>
-<tr 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><a href="./xref/org/apache/hadoop/hbase/client/ZooKeeperRegistry.html#L81">81</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ZooKeeperRegistry.html#L96">96</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/ZooKeeperRegistry.html#L111">111</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -17442,13 +17436,13 @@
 <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>indentation</td>
 <td>Indentation</td>
@@ -17457,13 +17451,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.backoff.ExponentialClientBackoffPolicy.java">org/apache/hadoop/hbase/client/backoff/ExponentialClientBackoffPolicy.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -17472,25 +17466,25 @@
 <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="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<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><a href="./xref/org/apache/hadoop/hbase/client/backoff/ServerStatistics.html#L24">24</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/backoff/ServerStatistics.html#L39">39</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -17499,583 +17493,583 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.coprocessor.AggregationClient.java">org/apache/hadoop/hbase/client/coprocessor/AggregationClient.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<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.google.protobuf.ByteString' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/coprocessor/AggregationClient.html#L56">56</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/coprocessor/AggregationClient.html#L88">88</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/coprocessor/AggregationClient.html#L110">110</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/coprocessor/AggregationClient.html#L111">111</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/coprocessor/AggregationClient.html#L112">112</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/coprocessor/AggregationClient.html#L130">130</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/client/coprocessor/AggregationClient.html#L131">131</a></td></tr>
-<tr class="b">
+<tr class="a">

<TRUNCATED>

[19/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
index fbdde18..1d64963 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
@@ -2959,7 +2959,7 @@
 <span class="sourceLineNo">2951</span>    Set&lt;byte[]&gt; deletesCfSet = null;<a name="line.2951"></a>
 <span class="sourceLineNo">2952</span>    long currentNonceGroup = HConstants.NO_NONCE;<a name="line.2952"></a>
 <span class="sourceLineNo">2953</span>    long currentNonce = HConstants.NO_NONCE;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    WALEdit walEdit = new WALEdit(replay);<a name="line.2954"></a>
+<span class="sourceLineNo">2954</span>    WALEdit walEdit = null;<a name="line.2954"></a>
 <span class="sourceLineNo">2955</span>    boolean locked = false;<a name="line.2955"></a>
 <span class="sourceLineNo">2956</span>    // reference family maps directly so coprocessors can mutate them if desired<a name="line.2956"></a>
 <span class="sourceLineNo">2957</span>    Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps = new Map[batchOp.operations.length];<a name="line.2957"></a>
@@ -2970,4878 +2970,4890 @@
 <span class="sourceLineNo">2962</span>    int noOfPuts = 0;<a name="line.2962"></a>
 <span class="sourceLineNo">2963</span>    int noOfDeletes = 0;<a name="line.2963"></a>
 <span class="sourceLineNo">2964</span>    WriteEntry writeEntry = null;<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    try {<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>      int numReadyToWrite = 0;<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>          lastIndexExclusive++;<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>          continue;<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>        }<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>        RowLock rowLock = null;<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>        try {<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>        } catch (IOException ioe) {<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span>        }<a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>        if (rowLock == null) {<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>          // We failed to grab another lock<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>          break; // Stop acquiring more rows for this batch<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>        } else {<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>          acquiredRowLocks.add(rowLock);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span>        }<a name="line.2989"></a>
-<span class="sourceLineNo">2990</span><a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>        lastIndexExclusive++;<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>        numReadyToWrite++;<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span><a name="line.2993"></a>
-<span class="sourceLineNo">2994</span>        if (mutation instanceof Put) {<a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>          // If Column Families stay consistent through out all of the<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>          // individual puts then metrics can be reported as a multiput across<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>          // column families in the first put.<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>          if (putsCfSet == null) {<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>          } else {<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span>          }<a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>        } else {<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>          if (deletesCfSet == null) {<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>          } else {<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>          }<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span>        }<a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>      }<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span><a name="line.3013"></a>
-<span class="sourceLineNo">3014</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3014"></a>
-<span class="sourceLineNo">3015</span><a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3020"></a>
-<span class="sourceLineNo">3021</span><a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>        return 0L;<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>      }<a name="line.3025"></a>
+<span class="sourceLineNo">2965</span>    int cellCount = 0;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    /** Keep track of the locks we hold so we can release them in finally clause */<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span>    List&lt;RowLock&gt; acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);<a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    try {<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>      // STEP 1. Try to acquire as many locks as we can, and ensure we acquire at least one.<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>      int numReadyToWrite = 0;<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>      long now = EnvironmentEdgeManager.currentTime();<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>      while (lastIndexExclusive &lt; batchOp.operations.length) {<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>        if (checkBatchOp(batchOp, lastIndexExclusive, familyMaps, now)) {<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>          lastIndexExclusive++;<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span>          continue;<a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>        }<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>        Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>        // If we haven't got any rows in our batch, we should block to get the next one.<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>        RowLock rowLock = null;<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span>        try {<a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>          rowLock = getRowLock(mutation.getRow(), true);<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>        } catch (IOException ioe) {<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>          LOG.warn("Failed getting lock, row=" + Bytes.toStringBinary(mutation.getRow()), ioe);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>        }<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>        if (rowLock == null) {<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>          // We failed to grab another lock<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span>          break; // Stop acquiring more rows for this batch<a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>        } else {<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>          acquiredRowLocks.add(rowLock);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>        }<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span><a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>        lastIndexExclusive++;<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span>        numReadyToWrite++;<a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>        if (replay) {<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>          for (List&lt;Cell&gt; cells : mutation.getFamilyCellMap().values()) {<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>            cellCount += cells.size();<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>          }<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>        }<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span>        if (mutation instanceof Put) {<a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>          // If Column Families stay consistent through out all of the<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>          // individual puts then metrics can be reported as a multiput across<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>          // column families in the first put.<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>          if (putsCfSet == null) {<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span>            putsCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>          } else {<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>            putsCfSetConsistent = putsCfSetConsistent<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(putsCfSet);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>          }<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>        } else {<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>          if (deletesCfSet == null) {<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>            deletesCfSet = mutation.getFamilyCellMap().keySet();<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>          } else {<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span>            deletesCfSetConsistent = deletesCfSetConsistent<a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>                &amp;&amp; mutation.getFamilyCellMap().keySet().equals(deletesCfSet);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>          }<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>        }<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>      }<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span><a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>      // We've now grabbed as many mutations off the list as we can<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span><a name="line.3020"></a>
+<span class="sourceLineNo">3021</span>      // STEP 2. Update any LATEST_TIMESTAMP timestamps<a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>      // We should record the timestamp only after we have acquired the rowLock,<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>      // otherwise, newer puts/deletes are not guaranteed to have a newer timestamp<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span>      now = EnvironmentEdgeManager.currentTime();<a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>      byte[] byteNow = Bytes.toBytes(now);<a name="line.3025"></a>
 <span class="sourceLineNo">3026</span><a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span>        // skip invalid<a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>          // lastIndexExclusive was incremented above.<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span>          continue;<a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>        }<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span><a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>        if (mutation instanceof Put) {<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>          noOfPuts++;<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>        } else {<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>          noOfDeletes++;<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>        }<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span>      }<a name="line.3044"></a>
-<span class="sourceLineNo">3045</span><a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>      locked = true;<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span><a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>      // calling the pre CP hook for batch mutation<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>          return 0L;<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>        }<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>      }<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span><a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>      // STEP 3. Build WAL edit<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>          continue;<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>        }<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>        Mutation m = batchOp.getMutation(i);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>          durability = tmpDur;<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>        }<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>          continue;<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span>        }<a name="line.3075"></a>
-<span class="sourceLineNo">3076</span><a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>        long nonce = batchOp.getNonce(i);<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>          // Write what we have so far for nonces out to WAL<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>          walEdit = new WALEdit(replay);<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span>          currentNonceGroup = nonceGroup;<a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>          currentNonce = nonce;<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>        }<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span><a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>        // Add WAL edits by CP<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>        if (fromCP != null) {<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span>            walEdit.add(cell);<a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>          }<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>        }<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span>      }<a name="line.3098"></a>
-<span class="sourceLineNo">3099</span><a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>      WALKey walKey = null;<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>      if (replay) {<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>        // use wal key from the original<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3107"></a>
-<span class="sourceLineNo">3108</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>      }<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>      if (!walEdit.isEmpty()) {<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>        if (!replay) {<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>        }<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>        try {<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span>          long txid =<a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>          if (txid != 0) sync(txid, durability);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span>          writeEntry = walKey.getWriteEntry();<a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>        } catch (IOException ioe) {<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>          throw ioe;<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>        }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>      }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span>      if (walKey == null) {<a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>        writeEntry = mvcc.begin();<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>      }<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span><a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>      // STEP 5. Write back to memstore<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>      long addedSize = 0;<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>          continue;<a name="line.3139"></a>
+<span class="sourceLineNo">3027</span>      // Nothing to put/delete -- an exception in the above such as NoSuchColumnFamily?<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>      if (numReadyToWrite &lt;= 0) {<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>        return 0L;<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span>      }<a name="line.3030"></a>
+<span class="sourceLineNo">3031</span><a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>      for (int i = firstIndex; !replay &amp;&amp; i &lt; lastIndexExclusive; i++) {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>        // skip invalid<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>            != OperationStatusCode.NOT_RUN) {<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>          // lastIndexExclusive was incremented above.<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>          continue;<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span>        }<a name="line.3038"></a>
+<span class="sourceLineNo">3039</span><a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>        Mutation mutation = batchOp.getMutation(i);<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>        if (mutation instanceof Put) {<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span>          updateCellTimestamps(familyMaps[i].values(), byteNow);<a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>          noOfPuts++;<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>        } else {<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>          prepareDeleteTimestamps(mutation, familyMaps[i], byteNow);<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>          noOfDeletes++;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>        }<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>        rewriteCellTags(familyMaps[i], mutation);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span>        if (fromCP != null) {<a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>          cellCount += fromCP.size();<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>        }<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>        for (List&lt;Cell&gt; cells : familyMaps[i].values()) {<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span>          cellCount += cells.size();<a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>        }<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>      }<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>      walEdit = new WALEdit(cellCount, replay);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>      lock(this.updatesLock.readLock(), numReadyToWrite);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>      locked = true;<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span><a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>      // calling the pre CP hook for batch mutation<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>        if (coprocessorHost.preBatchMutate(miniBatchOp)) {<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>          return 0L;<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>        }<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>      }<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>      // STEP 3. Build WAL edit<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>      Durability durability = Durability.USE_DEFAULT;<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>        // Skip puts that were determined to be invalid during preprocessing<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span>          continue;<a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>        }<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span><a name="line.3078"></a>
+<span class="sourceLineNo">3079</span>        Mutation m = batchOp.getMutation(i);<a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>        Durability tmpDur = getEffectiveDurability(m.getDurability());<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>        if (tmpDur.ordinal() &gt; durability.ordinal()) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>          durability = tmpDur;<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>        }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>        if (tmpDur == Durability.SKIP_WAL) {<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span>          recordMutationWithoutWal(m.getFamilyCellMap());<a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>          continue;<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>        }<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span><a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>        long nonceGroup = batchOp.getNonceGroup(i);<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>        long nonce = batchOp.getNonce(i);<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>        // In replay, the batch may contain multiple nonces. If so, write WALEdit for each.<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span>        // Given how nonces are originally written, these should be contiguous.<a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>        // They don't have to be, it will still work, just write more WALEdits than needed.<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>        if (nonceGroup != currentNonceGroup || nonce != currentNonce) {<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>          // Write what we have so far for nonces out to WAL<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span>          appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);<a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>          walEdit = new WALEdit(cellCount, replay);<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>          currentNonceGroup = nonceGroup;<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>          currentNonce = nonce;<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>        }<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span><a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>        // Add WAL edits by CP<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>        WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span>        if (fromCP != null) {<a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>          for (Cell cell : fromCP.getCells()) {<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>            walEdit.add(cell);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>          }<a name="line.3107"></a>
+<span class="sourceLineNo">3108</span>        }<a name="line.3108"></a>
+<span class="sourceLineNo">3109</span>        addFamilyMapToWALEdit(familyMaps[i], walEdit);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>      }<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span><a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>      // STEP 4. Append the final edit to WAL and sync.<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>      Mutation mutation = batchOp.getMutation(firstIndex);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>      WALKey walKey = null;<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>      if (replay) {<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>        // use wal key from the original<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>        walKey = new ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span>          this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>          mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>        walKey.setOrigLogSeqNum(batchOp.getReplaySequenceId());<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>      }<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>      // Not sure what is going on here when replay is going on... does the below append get<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>      // called for replayed edits? Am afraid to change it without test.<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>      if (!walEdit.isEmpty()) {<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span>        if (!replay) {<a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>          // we use HLogKey here instead of WALKey directly to support legacy coprocessors.<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>          walKey = new HLogKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>            this.htableDescriptor.getTableName(), WALKey.NO_SEQUENCE_ID, now,<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>            mutation.getClusterIds(), currentNonceGroup, currentNonce, mvcc);<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>        }<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span>        // TODO: Use the doAppend methods below... complicated by the replay stuff above.<a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>        try {<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>          long txid =<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span>            this.wal.append(this.htableDescriptor, this.getRegionInfo(), walKey, walEdit, true);<a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>          if (txid != 0) sync(txid, durability);<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>          writeEntry = walKey.getWriteEntry();<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>        } catch (IOException ioe) {<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>          if (walKey != null) mvcc.complete(walKey.getWriteEntry());<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>          throw ioe;<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span>        }<a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span>      }<a name="line.3143"></a>
-<span class="sourceLineNo">3144</span><a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>      // STEP 6. Complete mvcc.<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>      if (replay) {<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>        mvcc.completeAndWait(writeEntry);<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>        writeEntry = null;<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span>      }<a name="line.3151"></a>
-<span class="sourceLineNo">3152</span><a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>      // STEP 7. Release row locks, etc.<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>      if (locked) {<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span>        this.updatesLock.readLock().unlock();<a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>        locked = false;<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>      }<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>      // calling the post CP hook for batch mutation<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>      }<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span><a name="line.3167"></a>
-<span class="sourceLineNo">3168</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>        }<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>      }<a name="line.3172"></a>
-<span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>          // only for successful puts<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span>              != OperationStatusCode.SUCCESS) {<a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>            continue;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>          }<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>          Mutation m = batchOp.getMutation(i);<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>          if (m instanceof Put) {<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>          } else {<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>          }<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>        }<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>      }<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span><a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>      success = true;<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span>      return addedSize;<a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    } finally {<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>      if (locked) {<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span>        this.updatesLock.readLock().unlock();<a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>      }<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span><a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>      // See if the column families were consistent through the whole thing.<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>      // null will be treated as unknown.<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span><a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>      if (noOfPuts &gt; 0) {<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>        // There were some Puts in the batch.<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>        if (this.metricsRegion != null) {<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span>          this.metricsRegion.updatePut();<a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>        }<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>      }<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>      if (noOfDeletes &gt; 0) {<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>        // There were some Deletes in the batch.<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>        if (this.metricsRegion != null) {<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span>          this.metricsRegion.updateDelete();<a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>        }<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>      }<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>      if (!success) {<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>          }<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>        }<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>      }<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>        // call the coprocessor hook to do any finalization steps<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>        // after the put is done<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>                lastIndexExclusive);<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>      }<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span><a name="line.3236"></a>
-<span class="sourceLineNo">3237</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    }<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>  }<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>  throws IOException {<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    if (walEdit.isEmpty()) return;<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>  }<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span><a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>  throws IOException {<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    boolean skip = false;<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    // Skip anything that "ran" already<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>      return true;<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span>    }<a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span>    // store the family map reference to allow for mutations<a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    try {<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>      if (mutation instanceof Put) {<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>        // Check the families in the put. If bad, skip this one.<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>        if (batchOp.isInReplay()) {<a name="line.3271"></a>
-<span class="sourceLineNo">3272</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>        } else {<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>          checkFamilies(familyMap.keySet());<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>        }<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>      } else {<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span>        prepareDelete((Delete)mutation);<a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>      }<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>      skip = true;<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>      skip = true;<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    } catch (WrongRegionException we) {<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>      skip = true;<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    }<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    return skip;<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>  }<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>  /**<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>   * During replay, there could exist column families which are removed between region server<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>   * failure and replay<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>   */<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>        if (nonExistentList == null) {<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span>        }<a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>        nonExistentList.add(family);<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>      }<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>    }<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>    if (nonExistentList != null) {<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>      for (byte[] family : nonExistentList) {<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>        // Perhaps schema was changed between crash and replay<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>        familyMap.remove(family);<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>      }<a name="line.3319"></a>
-<span class="sourceLineNo">3320</span>    }<a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>  }<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span><a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>  /**<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span>   * Returns effective durability from the passed durability and<a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>   * the table descriptor.<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span>   */<a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>  }<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span><a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>  @Override<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      boolean writeToWAL)<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>  throws IOException{<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    checkMutationType(mutation, row);<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>      mutation, writeToWAL);<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>  }<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span><a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>  @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3343"></a>
-<span class="sourceLineNo">3344</span>      boolean writeToWAL)<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>  throws IOException {<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, rm, null,<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>      writeToWAL);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>  }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span><a name="line.3349"></a>
-<span class="sourceLineNo">3350</span>  /**<a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>   * checkAndMutate and checkAndRowMutate are 90% the same. Rather than copy/paste, below has<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>   * switches in the few places where there is deviation.<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span>   */<a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>  private boolean doCheckAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rowMutations,<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>      Mutation mutation, boolean writeToWAL)<a name="line.3356"></a>
+<span class="sourceLineNo">3141</span>      }<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>      if (walKey == null) {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>        // If no walKey, then skipping WAL or some such. Being an mvcc transaction so sequenceid.<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>        writeEntry = mvcc.begin();<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>      }<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span><a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>      // STEP 5. Write back to memstore<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>      long addedSize = 0;<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span>        if (batchOp.retCodeDetails[i].getOperationStatusCode() != OperationStatusCode.NOT_RUN) {<a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>          continue;<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>        }<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span>        addedSize += applyFamilyMapToMemstore(familyMaps[i], replay,<a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>            replay? batchOp.getReplaySequenceId(): writeEntry.getWriteNumber());<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>      }<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span><a name="line.3156"></a>
+<span class="sourceLineNo">3157</span>      // STEP 6. Complete mvcc.<a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>      if (replay) {<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>        this.mvcc.advanceTo(batchOp.getReplaySequenceId());<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>      } else if (writeEntry != null/*Can be null if in replay mode*/) {<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span>        mvcc.completeAndWait(writeEntry);<a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>        writeEntry = null;<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>      }<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span><a name="line.3164"></a>
+<span class="sourceLineNo">3165</span>      // STEP 7. Release row locks, etc.<a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>      if (locked) {<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>        this.updatesLock.readLock().unlock();<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>        locked = false;<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span>      }<a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span><a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>      // calling the post CP hook for batch mutation<a name="line.3172"></a>
+<span class="sourceLineNo">3173</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3173"></a>
+<span class="sourceLineNo">3174</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>          new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>          batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex, lastIndexExclusive);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>        coprocessorHost.postBatchMutate(miniBatchOp);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span>      }<a name="line.3178"></a>
+<span class="sourceLineNo">3179</span><a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>      for (int i = firstIndex; i &lt; lastIndexExclusive; i ++) {<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>        if (batchOp.retCodeDetails[i] == OperationStatus.NOT_RUN) {<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>          batchOp.retCodeDetails[i] = OperationStatus.SUCCESS;<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span>        }<a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>      }<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span><a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>      // STEP 8. Run coprocessor post hooks. This should be done after the wal is<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>      // synced so that the coprocessor contract is adhered to.<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>      if (!replay &amp;&amp; coprocessorHost != null) {<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span>          // only for successful puts<a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode()<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>              != OperationStatusCode.SUCCESS) {<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>            continue;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>          }<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span>          Mutation m = batchOp.getMutation(i);<a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>          if (m instanceof Put) {<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>            coprocessorHost.postPut((Put) m, walEdit, m.getDurability());<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>          } else {<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>            coprocessorHost.postDelete((Delete) m, walEdit, m.getDurability());<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>          }<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>        }<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>      }<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>      success = true;<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>      return addedSize;<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    } finally {<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>      // Call complete rather than completeAndWait because we probably had error if walKey != null<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span>      if (writeEntry != null) mvcc.complete(writeEntry);<a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>      if (locked) {<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>        this.updatesLock.readLock().unlock();<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>      }<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>      releaseRowLocks(acquiredRowLocks);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span><a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>      // See if the column families were consistent through the whole thing.<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span>      // if they were then keep them. If they were not then pass a null.<a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>      // null will be treated as unknown.<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>      // Total time taken might be involving Puts and Deletes.<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>      // Split the time for puts and deletes based on the total number of Puts and Deletes.<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span><a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>      if (noOfPuts &gt; 0) {<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span>        // There were some Puts in the batch.<a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>        if (this.metricsRegion != null) {<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>          this.metricsRegion.updatePut();<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>        }<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>      }<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>      if (noOfDeletes &gt; 0) {<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span>        // There were some Deletes in the batch.<a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>        if (this.metricsRegion != null) {<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>          this.metricsRegion.updateDelete();<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>        }<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>      }<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span>      if (!success) {<a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>        for (int i = firstIndex; i &lt; lastIndexExclusive; i++) {<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>          if (batchOp.retCodeDetails[i].getOperationStatusCode() == OperationStatusCode.NOT_RUN) {<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>            batchOp.retCodeDetails[i] = OperationStatus.FAILURE;<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>          }<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>        }<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>      }<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>      if (coprocessorHost != null &amp;&amp; !batchOp.isInReplay()) {<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>        // call the coprocessor hook to do any finalization steps<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span>        // after the put is done<a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>        MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp =<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>            new MiniBatchOperationInProgress&lt;Mutation&gt;(batchOp.getMutationsForCoprocs(),<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>                batchOp.retCodeDetails, batchOp.walEditsFromCoprocessors, firstIndex,<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>                lastIndexExclusive);<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>        coprocessorHost.postBatchMutateIndispensably(miniBatchOp, success);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span>      }<a name="line.3247"></a>
+<span class="sourceLineNo">3248</span><a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>      batchOp.nextIndexToProcess = lastIndexExclusive;<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span>    }<a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>  }<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span><a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>  private void appendCurrentNonces(final Mutation mutation, final boolean replay,<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>      final WALEdit walEdit, final long now, final long currentNonceGroup, final long currentNonce)<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  throws IOException {<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span>    if (walEdit.isEmpty()) return;<a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>    if (!replay) throw new IOException("Multiple nonces per batch and not in replay");<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>    WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>        this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>        currentNonceGroup, currentNonce, mvcc);<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>    this.wal.append(this.htableDescriptor,  this.getRegionInfo(), walKey, walEdit, true);<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>    // Complete the mvcc transaction started down in append else it will block others<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>    this.mvcc.complete(walKey.getWriteEntry());<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  }<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span><a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>  private boolean checkBatchOp(BatchOperation&lt;?&gt; batchOp, final int lastIndexExclusive,<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>      final Map&lt;byte[], List&lt;Cell&gt;&gt;[] familyMaps, final long now)<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>  throws IOException {<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    boolean skip = false;<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    // Skip anything that "ran" already<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    if (batchOp.retCodeDetails[lastIndexExclusive].getOperationStatusCode()<a name="line.3271"></a>
+<span class="sourceLineNo">3272</span>        != OperationStatusCode.NOT_RUN) {<a name="line.3272"></a>
+<span class="sourceLineNo">3273</span>      return true;<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    }<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span>    Mutation mutation = batchOp.getMutation(lastIndexExclusive);<a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap = mutation.getFamilyCellMap();<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span>    // store the family map reference to allow for mutations<a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    familyMaps[lastIndexExclusive] = familyMap;<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span><a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    try {<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>      if (mutation instanceof Put) {<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span>        // Check the families in the put. If bad, skip this one.<a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>        if (batchOp.isInReplay()) {<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>          removeNonExistentColumnFamilyForReplay(familyMap);<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>        } else {<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>          checkFamilies(familyMap.keySet());<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>        }<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span>        checkTimestamps(mutation.getFamilyCellMap(), now);<a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>      } else {<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>        prepareDelete((Delete)mutation);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>      }<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>      checkRow(mutation.getRow(), "doMiniBatchMutation");<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span>    } catch (NoSuchColumnFamilyException nscf) {<a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>      LOG.warn("No such column family in batch mutation", nscf);<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>          OperationStatusCode.BAD_FAMILY, nscf.getMessage());<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span>      skip = true;<a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    } catch (FailedSanityCheckException fsce) {<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>      LOG.warn("Batch Mutation did not pass sanity check", fsce);<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>          OperationStatusCode.SANITY_CHECK_FAILURE, fsce.getMessage());<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>      skip = true;<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    } catch (WrongRegionException we) {<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span>      LOG.warn("Batch mutation had a row that does not belong to this region", we);<a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>      batchOp.retCodeDetails[lastIndexExclusive] = new OperationStatus(<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>          OperationStatusCode.SANITY_CHECK_FAILURE, we.getMessage());<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>      skip = true;<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    }<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span>    return skip;<a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>  }<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span><a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>  /**<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>   * During replay, there could exist column families which are removed between region server<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>   * failure and replay<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span>  private void removeNonExistentColumnFamilyForReplay(final Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap) {<a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    List&lt;byte[]&gt; nonExistentList = null;<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    for (byte[] family : familyMap.keySet()) {<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>      if (!this.htableDescriptor.hasFamily(family)) {<a name="line.3319"></a>
+<span class="sourceLineNo">3320</span>        if (nonExistentList == null) {<a name="line.3320"></a>
+<span class="sourceLineNo">3321</span>          nonExistentList = new ArrayList&lt;byte[]&gt;();<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>        }<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>        nonExistentList.add(family);<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>      }<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>    }<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>    if (nonExistentList != null) {<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>      for (byte[] family : nonExistentList) {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>        // Perhaps schema was changed between crash and replay<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>        LOG.info("No family for " + Bytes.toString(family) + " omit from reply.");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span>        familyMap.remove(family);<a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>      }<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    }<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>  }<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>  /**<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span>   * Returns effective durability from the passed durability and<a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>   * the table descriptor.<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>   */<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>  protected Durability getEffectiveDurability(Durability d) {<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>    return d == Durability.USE_DEFAULT ? this.durability : d;<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>  }<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span><a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>  @Override<a name="line.3343"></a>
+<span class="sourceLineNo">3344</span>  public boolean checkAndMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3344"></a>
+<span class="sourceLineNo">3345</span>      CompareOp compareOp, ByteArrayComparable comparator, Mutation mutation,<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>      boolean writeToWAL)<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span>  throws IOException{<a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    checkMutationType(mutation, row);<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    return doCheckAndRowMutate(row, family, qualifier, compareOp, comparator, null,<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>      mutation, writeToWAL);<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>  }<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span><a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>  @Override<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>  public boolean checkAndRowMutate(byte [] row, byte [] family, byte [] qualifier,<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      CompareOp compareOp, ByteArrayComparable comparator, RowMutations rm,<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      boolean writeToWAL)<a name="line.3356"></a>
 <span class="sourceLineNo">3357</span>  throws IOException {<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // Could do the below checks but seems wacky with two callers only. Just comment out for now.<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // One caller passes a Mutation, the other passes RowMutation. Presume all good so we don't<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // need these commented out checks.<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // if (rowMutations == null &amp;&amp; mutation == null) throw new DoNotRetryIOException("Both null");<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // if (rowMutations != null &amp;&amp; mutation != null) throw new DoNotRetryIOException("Both set");<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    checkReadOnly();<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // TODO, add check for value length also move this check to the client<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span>    checkResources();<a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    startRegionOperation();<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    try {<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>      Get get = new Get(row);<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>      checkFamily(family);<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>      get.addColumn(family, qualifier);<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>      // Lock row - note that doBatchMutate will relock this row if called<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>      RowLock rowLock = getRowLock(get.getRow());<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>      try {<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>        if (mutation != null &amp;&amp; this.getCoprocessorHost() != null) {<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>          // Call coprocessor.<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>          Boolean processed = null;<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>          if (mutation instanceof Put) {<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>            processed = this.getCoprocessorHost().preCheckAndPutAfterRowLock(row, family,<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>                qualifier, compareOp, comparator, (Put)mutation);<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>          } else if (mutation instanceof Delete) {<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>            processed = this.getCoprocessorHost().preCheckAndDeleteAfterRowLock(row, family,<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span>                qualifier, compareOp, comparator, (Delete)mutation);<a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>          }<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>          if (processed != null) {<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>            return processed;<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>          }<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>        }<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>        // NOTE: We used to wait here until mvcc caught up:  mvcc.await();<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        // Supposition is that now all changes are done under row locks, then when we go to read,<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>        // we'll get the latest on this row.<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        List&lt;Cell&gt; result = get(get, false);<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>        boolean valueIsNull = comparator.getValue() == null || comparator.getValue().length == 0;<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        boolean matches = false;<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>        long cellTs = 0;<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        if (result.size() == 0 &amp;&amp; valueIsNull) {<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>          matches = true;<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>        } else if (result.size() &gt; 0 &amp;&amp; result.get(0).getValueLength() == 0 &amp;&amp; valueIsNull) {<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>          matches = true;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>          cellTs = result.get(0).getTimestamp();<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        } else if (result.size() == 1 &amp;&amp; !valueIsNull) {<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>          Cell kv = result.get(0);<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>          cellTs = kv.getTimestamp();<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>          int compareResult = CellComparator.compareValue(kv, comparator);<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span>          matches = matches(compareOp, compareResult);<a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>        }<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>        // If matches put the new put or delete the new delete<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>        if (matches) {<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>          // We have acquired the row lock alrea

<TRUNCATED>

[34/51] [partial] hbase-site git commit: Published site at 29a192ef3cbe3b9cc12a6ee38f39e1199ac9790f.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/8bb348c6/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html
index ccccc8d..d2f53d2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.html
@@ -89,16 +89,16 @@
 <span class="sourceLineNo">081</span>      return UNKNOWN_RACK;<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">084</span><a name="line.84"></a>
 <span class="sourceLineNo">085</span>  /**<a name="line.85"></a>
 <span class="sourceLineNo">086</span>   * The constructor that uses the basic MetricsBalancer<a name="line.86"></a>
 <span class="sourceLineNo">087</span>   */<a name="line.87"></a>
 <span class="sourceLineNo">088</span>  protected BaseLoadBalancer() {<a name="line.88"></a>
 <span class="sourceLineNo">089</span>    metricsBalancer = new MetricsBalancer();<a name="line.89"></a>
 <span class="sourceLineNo">090</span>  }<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  <a name="line.91"></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>   * This Constructor accepts an instance of MetricsBalancer, <a name="line.93"></a>
+<span class="sourceLineNo">093</span>   * This Constructor accepts an instance of MetricsBalancer,<a name="line.93"></a>
 <span class="sourceLineNo">094</span>   * which will be used instead of creating a new one<a name="line.94"></a>
 <span class="sourceLineNo">095</span>   */<a name="line.95"></a>
 <span class="sourceLineNo">096</span>  protected BaseLoadBalancer(MetricsBalancer metricsBalancer) {<a name="line.96"></a>
@@ -1287,284 +1287,251 @@
 <span class="sourceLineNo">1279</span>  }<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>   * Generates an immediate assignment plan to be used by a new master for<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>   * regions in transition that do not have an already known destination.<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>   *<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>   * Takes a list of regions that need immediate assignment and a list of all<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>   * available servers. Returns a map of regions to the server they should be<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>   * assigned to.<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>   *<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>   * This method will return quickly and does not do any intelligent balancing.<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>   * The goal is to make a fast decision not the best decision possible.<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>   *<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>   * Currently this is random.<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>   *<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>   * @param regions<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>   * @param servers<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>   * @return map of regions to the server it should be assigned to<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>  public Map&lt;HRegionInfo, ServerName&gt; immediateAssignment(List&lt;HRegionInfo&gt; regions,<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      List&lt;ServerName&gt; servers) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>    metricsBalancer.incrMiscInvocations();<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>    if (servers == null || servers.isEmpty()) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>      LOG.warn("Wanted to do random assignment but no servers to assign to");<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      return null;<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>    Map&lt;HRegionInfo, ServerName&gt; assignments = new TreeMap&lt;HRegionInfo, ServerName&gt;();<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>    for (HRegionInfo region : regions) {<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>      assignments.put(region, randomAssignment(region, servers));<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>    }<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>    return assignments;<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>  }<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span><a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>  /**<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>   * Used to assign a single region to a random server.<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>   */<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>  @Override<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>  public ServerName randomAssignment(HRegionInfo regionInfo, List&lt;ServerName&gt; servers) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    metricsBalancer.incrMiscInvocations();<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>        return masterServerName;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      }<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      // Guarantee not to put other regions on master<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>      servers.remove(masterServerName);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    }<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span><a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>    if (numServers == 0) {<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>      return null;<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>    }<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>      return servers.get(0);<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>    List&lt;HRegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    return randomAssignment(cluster, regionInfo, servers);<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>  }<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span><a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  /**<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>   * available/online servers available for assignment.<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>   * &lt;p&gt;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>   * completely balanced.<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>   * &lt;p&gt;<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>   * assigned randomly to available servers.<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>   *<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>   * @param regions regions and existing assignment from meta<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>   * @param servers available servers<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>   * @return map of servers and regions to be assigned to them<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>   */<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>  @Override<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; retainAssignment(Map&lt;HRegionInfo, ServerName&gt; regions,<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>      List&lt;ServerName&gt; servers) {<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    // Update metrics<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    metricsBalancer.incrMiscInvocations();<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>      = assignMasterRegions(regions.keySet(), servers);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>      // Guarantee not to put other regions on master<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>      servers.remove(masterServerName);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      if (!masterRegions.isEmpty()) {<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>        regions = new HashMap&lt;HRegionInfo, ServerName&gt;(regions);<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        for (HRegionInfo region: masterRegions) {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>          regions.remove(region);<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        }<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>    }<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>    if (regions == null || regions.isEmpty()) {<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      return assignments;<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>    }<a name="line.1381"></a>
+<span class="sourceLineNo">1282</span>   * Used to assign a single region to a random server.<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>   */<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>  @Override<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>  public ServerName randomAssignment(HRegionInfo regionInfo, List&lt;ServerName&gt; servers) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>    metricsBalancer.incrMiscInvocations();<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    if (servers != null &amp;&amp; servers.contains(masterServerName)) {<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      if (shouldBeOnMaster(regionInfo)) {<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>        return masterServerName;<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      }<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      // Guarantee not to put other regions on master<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      servers.remove(masterServerName);<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span><a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>    if (numServers == 0) {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      return null;<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>    }<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      return servers.get(0);<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>    List&lt;HRegionInfo&gt; regions = Lists.newArrayList(regionInfo);<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    Cluster cluster = createCluster(servers, regions);<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>    return randomAssignment(cluster, regionInfo, servers);<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>  }<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span><a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>  /**<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * Generates a bulk assignment startup plan, attempting to reuse the existing<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   * assignment information from META, but adjusting for the specified list of<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>   * available/online servers available for assignment.<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>   * &lt;p&gt;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>   * Takes a map of all regions to their existing assignment from META. Also<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>   * takes a list of online servers for regions to be assigned to. Attempts to<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>   * retain all assignment, so in some instances initial assignment will not be<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>   * completely balanced.<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>   * &lt;p&gt;<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>   * Any leftover regions without an existing server to be assigned to will be<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>   * assigned randomly to available servers.<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>   *<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>   * @param regions regions and existing assignment from meta<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>   * @param servers available servers<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>   * @return map of servers and regions to be assigned to them<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>   */<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>  @Override<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>  public Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; retainAssignment(Map&lt;HRegionInfo, ServerName&gt; regions,<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      List&lt;ServerName&gt; servers) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>    // Update metrics<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>    metricsBalancer.incrMiscInvocations();<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>    Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>      = assignMasterRegions(regions.keySet(), servers);<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>    if (assignments != null &amp;&amp; !assignments.isEmpty()) {<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>      servers = new ArrayList&lt;ServerName&gt;(servers);<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>      // Guarantee not to put other regions on master<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      servers.remove(masterServerName);<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>      List&lt;HRegionInfo&gt; masterRegions = assignments.get(masterServerName);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>      if (!masterRegions.isEmpty()) {<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>        regions = new HashMap&lt;HRegionInfo, ServerName&gt;(regions);<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>        for (HRegionInfo region: masterRegions) {<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>          regions.remove(region);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>        }<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>      }<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    }<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    if (regions == null || regions.isEmpty()) {<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>      return assignments;<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    }<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span><a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    if (numServers == 0) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>      return null;<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    }<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>      ServerName server = servers.get(0);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions.keySet()));<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>      return assignments;<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    }<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span><a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    // Group all of the old assignments by their hostname.<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    // We can't group directly by ServerName since the servers all have<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    // new start-codes.<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span><a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>    // servers on the same host on different ports.<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    for (ServerName server : servers) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>      serversByHostname.put(server.getHostname(), server);<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>    // Collection of the hostnames that used to have regions<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    // assigned, but for which we no longer have any RS running<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>    // after the cluster restart.<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span><a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    int numRandomAssignments = 0;<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>    int numRetainedAssigments = 0;<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span><a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>    Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1381"></a>
 <span class="sourceLineNo">1382</span><a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    int numServers = servers == null ? 0 : servers.size();<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    if (numServers == 0) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>      LOG.warn("Wanted to do retain assignment but no servers to assign to");<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>      return null;<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    }<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    if (numServers == 1) { // Only one server, nothing fancy we can do here<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>      ServerName server = servers.get(0);<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;(regions.keySet()));<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      return assignments;<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span><a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    // Group all of the old assignments by their hostname.<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    // We can't group directly by ServerName since the servers all have<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>    // new start-codes.<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span><a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    // Group the servers by their hostname. It's possible we have multiple<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    // servers on the same host on different ports.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    ArrayListMultimap&lt;String, ServerName&gt; serversByHostname = ArrayListMultimap.create();<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    for (ServerName server : servers) {<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>      assignments.put(server, new ArrayList&lt;HRegionInfo&gt;());<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      serversByHostname.put(server.getHostname(), server);<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    }<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    // Collection of the hostnames that used to have regions<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>    // assigned, but for which we no longer have any RS running<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    // after the cluster restart.<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>    Set&lt;String&gt; oldHostsNoLongerPresent = Sets.newTreeSet();<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    int numRandomAssignments = 0;<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>    int numRetainedAssigments = 0;<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>    Cluster cluster = createCluster(servers, regions.keySet());<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span><a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    for (Map.Entry&lt;HRegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      HRegionInfo region = entry.getKey();<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>      ServerName oldServerName = entry.getValue();<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;ServerName&gt;();<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      if (oldServerName != null) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        localServers = serversByHostname.get(oldServerName.getHostname());<a name="line.1421"></a>
+<span class="sourceLineNo">1383</span>    for (Map.Entry&lt;HRegionInfo, ServerName&gt; entry : regions.entrySet()) {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>      HRegionInfo region = entry.getKey();<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      ServerName oldServerName = entry.getValue();<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      List&lt;ServerName&gt; localServers = new ArrayList&lt;ServerName&gt;();<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>      if (oldServerName != null) {<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>        localServers = serversByHostname.get(oldServerName.getHostname());<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>      }<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>      if (localServers.isEmpty()) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>        // No servers on the new cluster match up with this hostname,<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>        // assign randomly.<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>        ServerName randomServer = randomAssignment(cluster, region, servers);<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>        assignments.get(randomServer).add(region);<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        numRandomAssignments++;<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        if (oldServerName != null) oldHostsNoLongerPresent.add(oldServerName.getHostname());<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>      } else if (localServers.size() == 1) {<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>        // the usual case - one new server on same host<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>        ServerName target = localServers.get(0);<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>        assignments.get(target).add(region);<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>        cluster.doAssignRegion(region, target);<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>        numRetainedAssigments++;<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>      } else {<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>        // multiple new servers in the cluster on this same host<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>        if (localServers.contains(oldServerName)) {<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>          assignments.get(oldServerName).add(region);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>          cluster.doAssignRegion(region, oldServerName);<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>        } else {<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>          ServerName target = null;<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>          for (ServerName tmp: localServers) {<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>              target = tmp;<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>              break;<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>            }<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>          }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>          if (target == null) {<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>            target = randomAssignment(cluster, region, localServers);<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>          }<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>          assignments.get(target).add(region);<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>        }<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>        numRetainedAssigments++;<a name="line.1421"></a>
 <span class="sourceLineNo">1422</span>      }<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      if (localServers.isEmpty()) {<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        // No servers on the new cluster match up with this hostname,<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>        // assign randomly.<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>        ServerName randomServer = randomAssignment(cluster, region, servers);<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>        assignments.get(randomServer).add(region);<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>        numRandomAssignments++;<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>        if (oldServerName != null) oldHostsNoLongerPresent.add(oldServerName.getHostname());<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      } else if (localServers.size() == 1) {<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>        // the usual case - one new server on same host<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>        ServerName target = localServers.get(0);<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>        assignments.get(target).add(region);<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>        cluster.doAssignRegion(region, target);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>        numRetainedAssigments++;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>      } else {<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>        // multiple new servers in the cluster on this same host<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>        if (localServers.contains(oldServerName)) {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>          assignments.get(oldServerName).add(region);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>          cluster.doAssignRegion(region, oldServerName);<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        } else {<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>          ServerName target = null;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>          for (ServerName tmp: localServers) {<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>            if (tmp.getPort() == oldServerName.getPort()) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>              target = tmp;<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>              break;<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>            }<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>          }<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>          if (target == null) {<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>            target = randomAssignment(cluster, region, localServers);<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>          }<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>          assignments.get(target).add(region);<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>        }<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>        numRetainedAssigments++;<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      }<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    }<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span><a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    String randomAssignMsg = "";<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>    if (numRandomAssignments &gt; 0) {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>      randomAssignMsg =<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>          numRandomAssignments + " regions were assigned "<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<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>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    return assignments;<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  }<a name="line.1470"></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>    String randomAssignMsg = "";<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>    if (numRandomAssignments &gt; 0) {<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      randomAssignMsg =<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>          numRandomAssignments + " regions were assigned "<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>              + "to random hosts, since the old hosts for these regions are no "<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>              + "longer present in the cluster. These hosts were:\n  "<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>              + Joiner.on("\n  ").join(oldHostsNoLongerPresent);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    }<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>    LOG.info("Reassigned " + regions.size() + " regions. " + numRetainedAssigments<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>        + " retained the pre-restart assignment. " + randomAssignMsg);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    return assignments;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>  }<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span><a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>  @Override<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>  public void initialize() throws HBaseIOException{<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>  }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span><a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>  @Override<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>  public void regionOnline(HRegionInfo regionInfo, ServerName sn) {<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>  }<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span><a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>  @Override<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>  public void regionOffline(HRegionInfo regionInfo) {<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>  @Override<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>  public boolean isStopped() {<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    return stopped;<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>  }<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span><a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>  @Override<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>  public void stop(String why) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    stopped = true;<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>  }<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span><a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>  /**<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>   * Used to assign a single region to a random server.<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>   */<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>  private ServerName randomAssignment(Cluster cluster, HRegionInfo regionInfo,<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>      List&lt;ServerName&gt; servers) {<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    ServerName sn = null;<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    final int maxIterations = numServers * 4;<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    int iterations = 0;<a name="line.1470"></a>
 <span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  @Override<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>  public void initialize() throws HBaseIOException{<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>  }<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span><a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>  @Override<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>  public void regionOnline(HRegionInfo regionInfo, ServerName sn) {<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>  }<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span><a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>  @Override<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>  public void regionOffline(HRegionInfo regionInfo) {<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>  public boolean isStopped() {<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>    return stopped;<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>  @Override<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>  public void stop(String why) {<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    LOG.info("Load Balancer stop requested: "+why);<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>    stopped = true;<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>  }<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span><a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>  /**<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>   * Used to assign a single region to a random server.<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>   */<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>  private ServerName randomAssignment(Cluster cluster, HRegionInfo regionInfo,<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>      List&lt;ServerName&gt; servers) {<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    int numServers = servers.size(); // servers is not null, numServers &gt; 1<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>    ServerName sn = null;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>    final int maxIterations = numServers * 4;<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>    int iterations = 0;<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span><a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    do {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>      int i = RANDOM.nextInt(numServers);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>      sn = servers.get(i);<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    return sn;<a name="line.1511"></a>
+<span class="sourceLineNo">1472</span>    do {<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      int i = RANDOM.nextInt(numServers);<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      sn = servers.get(i);<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>    } while (cluster.wouldLowerAvailability(regionInfo, sn)<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>        &amp;&amp; iterations++ &lt; maxIterations);<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>    cluster.doAssignRegion(regionInfo, sn);<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>    return sn;<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>  /**<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>   * Round robin a list of regions to a list of servers<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>   */<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>  private void roundRobinAssignment(Cluster cluster, List&lt;HRegionInfo&gt; regions,<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>      List&lt;HRegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments) {<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>    int numServers = servers.size();<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>    int numRegions = regions.size();<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>    int serverIdx = 0;<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    if (numServers &gt; 1) {<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    }<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    int regionIdx = 0;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span><a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      List&lt;HRegionInfo&gt; serverRegions = new ArrayList&lt;HRegionInfo&gt;(max);<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>        HRegionInfo region = regions.get(i % numRegions);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>          unassignedRegions.add(region);<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>        } else {<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>          serverRegions.add(region);<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>          cluster.doAssignRegion(region, server);<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>      assignments.put(server, serverRegions);<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      regionIdx++;<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    }<a name="line.1511"></a>
 <span class="sourceLineNo">1512</span>  }<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>
-<span class="sourceLineNo">1515</span>   * Round robin a list of regions to a list of servers<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>   */<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>  private void roundRobinAssignment(Cluster cluster, List&lt;HRegionInfo&gt; regions,<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>      List&lt;HRegionInfo&gt; unassignedRegions, List&lt;ServerName&gt; servers,<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>      Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; assignments) {<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span><a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    int numServers = servers.size();<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    int numRegions = regions.size();<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    int max = (int) Math.ceil((float) numRegions / numServers);<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    int serverIdx = 0;<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    if (numServers &gt; 1) {<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>      serverIdx = RANDOM.nextInt(numServers);<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    }<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>    int regionIdx = 0;<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span><a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    for (int j = 0; j &lt; numServers; j++) {<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>      ServerName server = servers.get((j + serverIdx) % numServers);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>      List&lt;HRegionInfo&gt; serverRegions = new ArrayList&lt;HRegionInfo&gt;(max);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>      for (int i = regionIdx; i &lt; numRegions; i += numServers) {<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>        HRegionInfo region = regions.get(i % numRegions);<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>        if (cluster.wouldLowerAvailability(region, server)) {<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>          unassignedRegions.add(region);<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>        } else {<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>          serverRegions.add(region);<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>          cluster.doAssignRegion(region, server);<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>        }<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      }<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      assignments.put(server, serverRegions);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>      regionIdx++;<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    }<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>  }<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span><a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>    Collection&lt;HRegionInfo&gt; regions) {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    } else {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      return new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    }<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>  }<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span><a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>  @Override<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>  }<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>}<a name="line.1559"></a>
+<span class="sourceLineNo">1514</span>  protected Map&lt;ServerName, List&lt;HRegionInfo&gt;&gt; getRegionAssignmentsByServer(<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>    Collection&lt;HRegionInfo&gt; regions) {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    if (this.services != null &amp;&amp; this.services.getAssignmentManager() != null) {<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>      return this.services.getAssignmentManager().getSnapShotOfAssignment(regions);<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    } else {<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>      return new HashMap&lt;ServerName, List&lt;HRegionInfo&gt;&gt;();<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    }<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>  }<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span><a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>  @Override<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>  public void onConfigurationChange(Configuration conf) {<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>  }<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>}<a name="line.1526"></a>