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/03/24 16:54:41 UTC

[01/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 123539c56 -> f30982bde


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/xref-test/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html
----------------------------------------------------------------------
diff --git a/xref-test/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html b/xref-test/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html
index e5d94ff..2ed1554 100644
--- a/xref-test/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html
+++ b/xref-test/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html
@@ -30,593 +30,835 @@
 <a class="jxr_linenumber" name="20" href="#20">20</a>  <strong class="jxr_keyword">package</strong> org.apache.hadoop.hbase.regionserver;
 <a class="jxr_linenumber" name="21" href="#21">21</a>  
 <a class="jxr_linenumber" name="22" href="#22">22</a>  <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.hadoop.hbase.regionserver.KeyValueScanFixture.scanFixture;
-<a class="jxr_linenumber" name="23" href="#23">23</a>  
-<a class="jxr_linenumber" name="24" href="#24">24</a>  <strong class="jxr_keyword">import</strong> java.io.IOException;
-<a class="jxr_linenumber" name="25" href="#25">25</a>  <strong class="jxr_keyword">import</strong> java.util.ArrayList;
-<a class="jxr_linenumber" name="26" href="#26">26</a>  <strong class="jxr_keyword">import</strong> java.util.Arrays;
-<a class="jxr_linenumber" name="27" href="#27">27</a>  <strong class="jxr_keyword">import</strong> java.util.List;
-<a class="jxr_linenumber" name="28" href="#28">28</a>  <strong class="jxr_keyword">import</strong> java.util.NavigableSet;
-<a class="jxr_linenumber" name="29" href="#29">29</a>  <strong class="jxr_keyword">import</strong> java.util.TreeSet;
-<a class="jxr_linenumber" name="30" href="#30">30</a>  
-<a class="jxr_linenumber" name="31" href="#31">31</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.conf.Configuration;
-<a class="jxr_linenumber" name="32" href="#32">32</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.CategoryBasedTimeout;
-<a class="jxr_linenumber" name="33" href="#33">33</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.Cell;
-<a class="jxr_linenumber" name="34" href="#34">34</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.CellComparator;
-<a class="jxr_linenumber" name="35" href="#35">35</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.HBaseConfiguration;
-<a class="jxr_linenumber" name="36" href="#36">36</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.HConstants;
-<a class="jxr_linenumber" name="37" href="#37">37</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.KeepDeletedCells;
-<a class="jxr_linenumber" name="38" href="#38">38</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.KeyValue;
-<a class="jxr_linenumber" name="39" href="#39">39</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.KeyValueTestUtil;
-<a class="jxr_linenumber" name="40" href="#40">40</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.client.Scan;
-<a class="jxr_linenumber" name="41" href="#41">41</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.testclassification.MediumTests;
-<a class="jxr_linenumber" name="42" href="#42">42</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.testclassification.RegionServerTests;
-<a class="jxr_linenumber" name="43" href="#43">43</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.util.Bytes;
-<a class="jxr_linenumber" name="44" href="#44">44</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.util.EnvironmentEdge;
-<a class="jxr_linenumber" name="45" href="#45">45</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;
-<a class="jxr_linenumber" name="46" href="#46">46</a>  <strong class="jxr_keyword">import</strong> org.junit.Assert;
-<a class="jxr_linenumber" name="47" href="#47">47</a>  <strong class="jxr_keyword">import</strong> org.junit.Rule;
-<a class="jxr_linenumber" name="48" href="#48">48</a>  <strong class="jxr_keyword">import</strong> org.junit.Test;
-<a class="jxr_linenumber" name="49" href="#49">49</a>  <strong class="jxr_keyword">import</strong> org.junit.experimental.categories.Category;
-<a class="jxr_linenumber" name="50" href="#50">50</a>  <strong class="jxr_keyword">import</strong> org.junit.rules.TestName;
-<a class="jxr_linenumber" name="51" href="#51">51</a>  <strong class="jxr_keyword">import</strong> org.junit.rules.TestRule;
-<a class="jxr_linenumber" name="52" href="#52">52</a>  
-<a class="jxr_linenumber" name="53" href="#53">53</a>  <em class="jxr_comment">// Can't be small as it plays with EnvironmentEdgeManager</em>
-<a class="jxr_linenumber" name="54" href="#54">54</a>  @Category({RegionServerTests.<strong class="jxr_keyword">class</strong>, MediumTests.<strong class="jxr_keyword">class</strong>})
-<a class="jxr_linenumber" name="55" href="#55">55</a>  <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">class</strong> <a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html">TestStoreScanner</a> {
-<a class="jxr_linenumber" name="56" href="#56">56</a>    @Rule <strong class="jxr_keyword">public</strong> TestName name = <strong class="jxr_keyword">new</strong> TestName();
-<a class="jxr_linenumber" name="57" href="#57">57</a>    @Rule <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">final</strong> TestRule timeout = CategoryBasedTimeout.builder().withTimeout(<strong class="jxr_keyword">this</strong>.getClass()).
-<a class="jxr_linenumber" name="58" href="#58">58</a>        withLookingForStuckThread(<strong class="jxr_keyword">true</strong>).build();
-<a class="jxr_linenumber" name="59" href="#59">59</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> String CF_STR = <span class="jxr_string">"cf"</span>;
-<a class="jxr_linenumber" name="60" href="#60">60</a>    <strong class="jxr_keyword">final</strong> byte [] CF = Bytes.toBytes(CF_STR);
-<a class="jxr_linenumber" name="61" href="#61">61</a>    <strong class="jxr_keyword">static</strong> Configuration CONF = HBaseConfiguration.create();
-<a class="jxr_linenumber" name="62" href="#62">62</a>    <strong class="jxr_keyword">private</strong> ScanInfo scanInfo = <strong class="jxr_keyword">new</strong> ScanInfo(CONF, CF, 0, Integer.MAX_VALUE,
-<a class="jxr_linenumber" name="63" href="#63">63</a>        Long.MAX_VALUE, KeepDeletedCells.FALSE, 0, CellComparator.COMPARATOR);
-<a class="jxr_linenumber" name="64" href="#64">64</a>    <strong class="jxr_keyword">private</strong> ScanType scanType = ScanType.USER_SCAN;
-<a class="jxr_linenumber" name="65" href="#65">65</a>  
-<a class="jxr_linenumber" name="66" href="#66">66</a>    <em class="jxr_comment">/*</em>
-<a class="jxr_linenumber" name="67" href="#67">67</a>  <em class="jxr_comment">   * Test utility for building a NavigableSet for scanners.</em>
-<a class="jxr_linenumber" name="68" href="#68">68</a>  <em class="jxr_comment">   * @param strCols</em>
-<a class="jxr_linenumber" name="69" href="#69">69</a>  <em class="jxr_comment">   * @return</em>
-<a class="jxr_linenumber" name="70" href="#70">70</a>  <em class="jxr_comment">   */</em>
-<a class="jxr_linenumber" name="71" href="#71">71</a>    NavigableSet&lt;byte[]&gt; getCols(String ...strCols) {
-<a class="jxr_linenumber" name="72" href="#72">72</a>      NavigableSet&lt;byte[]&gt; cols = <strong class="jxr_keyword">new</strong> TreeSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);
-<a class="jxr_linenumber" name="73" href="#73">73</a>      <strong class="jxr_keyword">for</strong> (String col : strCols) {
-<a class="jxr_linenumber" name="74" href="#74">74</a>        byte[] bytes = Bytes.toBytes(col);
-<a class="jxr_linenumber" name="75" href="#75">75</a>        cols.add(bytes);
-<a class="jxr_linenumber" name="76" href="#76">76</a>      }
-<a class="jxr_linenumber" name="77" href="#77">77</a>      <strong class="jxr_keyword">return</strong> cols;
-<a class="jxr_linenumber" name="78" href="#78">78</a>    }
-<a class="jxr_linenumber" name="79" href="#79">79</a>  
-<a class="jxr_linenumber" name="80" href="#80">80</a>    @Test
-<a class="jxr_linenumber" name="81" href="#81">81</a>    <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testScanTimeRange() <strong class="jxr_keyword">throws</strong> IOException {
-<a class="jxr_linenumber" name="82" href="#82">82</a>      String r1 = <span class="jxr_string">"R1"</span>;
-<a class="jxr_linenumber" name="83" href="#83">83</a>      <em class="jxr_comment">// returns only 1 of these 2 even though same timestamp</em>
-<a class="jxr_linenumber" name="84" href="#84">84</a>      KeyValue [] kvs = <strong class="jxr_keyword">new</strong> KeyValue[] {
-<a class="jxr_linenumber" name="85" href="#85">85</a>          KeyValueTestUtil.create(r1, CF_STR, <span class="jxr_string">"a"</span>, 1, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="86" href="#86">86</a>          KeyValueTestUtil.create(r1, CF_STR, <span class="jxr_string">"a"</span>, 2, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="87" href="#87">87</a>          KeyValueTestUtil.create(r1, CF_STR, <span class="jxr_string">"a"</span>, 3, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="88" href="#88">88</a>          KeyValueTestUtil.create(r1, CF_STR, <span class="jxr_string">"a"</span>, 4, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="89" href="#89">89</a>          KeyValueTestUtil.create(r1, CF_STR, <span class="jxr_string">"a"</span>, 5, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="90" href="#90">90</a>      };
-<a class="jxr_linenumber" name="91" href="#91">91</a>      List&lt;KeyValueScanner&gt; scanners = Arrays.&lt;KeyValueScanner&gt;asList(
-<a class="jxr_linenumber" name="92" href="#92">92</a>          <strong class="jxr_keyword">new</strong> KeyValueScanner[] {
-<a class="jxr_linenumber" name="93" href="#93">93</a>              <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html">KeyValueScanFixture</a>(CellComparator.COMPARATOR, kvs)
-<a class="jxr_linenumber" name="94" href="#94">94</a>      });
-<a class="jxr_linenumber" name="95" href="#95">95</a>      Scan scanSpec = <strong class="jxr_keyword">new</strong> Scan(Bytes.toBytes(r1));
-<a class="jxr_linenumber" name="96" href="#96">96</a>      scanSpec.setTimeRange(0, 6);
-<a class="jxr_linenumber" name="97" href="#97">97</a>      scanSpec.setMaxVersions();
-<a class="jxr_linenumber" name="98" href="#98">98</a>      List&lt;Cell&gt; results = <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="99" href="#99">99</a>      <strong class="jxr_keyword">try</strong> (StoreScanner scan =
-<a class="jxr_linenumber" name="100" href="#100">100</a>         <strong class="jxr_keyword">new</strong> StoreScanner(scanSpec, scanInfo, scanType, getCols(<span class="jxr_string">"a"</span>), scanners)) {
-<a class="jxr_linenumber" name="101" href="#101">101</a>       results = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
-<a class="jxr_linenumber" name="102" href="#102">102</a>       Assert.assertEquals(<strong class="jxr_keyword">true</strong>, scan.next(results));
-<a class="jxr_linenumber" name="103" href="#103">103</a>       Assert.assertEquals(5, results.size());
-<a class="jxr_linenumber" name="104" href="#104">104</a>       Assert.assertEquals(kvs[kvs.length - 1], results.get(0));
-<a class="jxr_linenumber" name="105" href="#105">105</a>     }
-<a class="jxr_linenumber" name="106" href="#106">106</a>     <em class="jxr_comment">// Scan limited TimeRange</em>
-<a class="jxr_linenumber" name="107" href="#107">107</a>     scanSpec = <strong class="jxr_keyword">new</strong> Scan(Bytes.toBytes(r1));
-<a class="jxr_linenumber" name="108" href="#108">108</a>     scanSpec.setTimeRange(1, 3);
-<a class="jxr_linenumber" name="109" href="#109">109</a>     scanSpec.setMaxVersions();
-<a class="jxr_linenumber" name="110" href="#110">110</a>     <strong class="jxr_keyword">try</strong> (StoreScanner scan =
-<a class="jxr_linenumber" name="111" href="#111">111</a>         <strong class="jxr_keyword">new</strong> StoreScanner(scanSpec, scanInfo, scanType, getCols(<span class="jxr_string">"a"</span>), scanners)) {
-<a class="jxr_linenumber" name="112" href="#112">112</a>       results = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
-<a class="jxr_linenumber" name="113" href="#113">113</a>       Assert.assertEquals(<strong class="jxr_keyword">true</strong>, scan.next(results));
-<a class="jxr_linenumber" name="114" href="#114">114</a>       Assert.assertEquals(2, results.size());
-<a class="jxr_linenumber" name="115" href="#115">115</a>     }
-<a class="jxr_linenumber" name="116" href="#116">116</a>     <em class="jxr_comment">// Another range.</em>
-<a class="jxr_linenumber" name="117" href="#117">117</a>     scanSpec = <strong class="jxr_keyword">new</strong> Scan(Bytes.toBytes(r1));
-<a class="jxr_linenumber" name="118" href="#118">118</a>     scanSpec.setTimeRange(5, 10);
-<a class="jxr_linenumber" name="119" href="#119">119</a>     scanSpec.setMaxVersions();
-<a class="jxr_linenumber" name="120" href="#120">120</a>     <strong class="jxr_keyword">try</strong> (StoreScanner scan =
-<a class="jxr_linenumber" name="121" href="#121">121</a>         <strong class="jxr_keyword">new</strong> StoreScanner(scanSpec, scanInfo, scanType, getCols(<span class="jxr_string">"a"</span>), scanners)) {
-<a class="jxr_linenumber" name="122" href="#122">122</a>       results = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
-<a class="jxr_linenumber" name="123" href="#123">123</a>       Assert.assertEquals(<strong class="jxr_keyword">true</strong>, scan.next(results));
-<a class="jxr_linenumber" name="124" href="#124">124</a>       Assert.assertEquals(1, results.size());
-<a class="jxr_linenumber" name="125" href="#125">125</a>     }
-<a class="jxr_linenumber" name="126" href="#126">126</a>     <em class="jxr_comment">// See how TimeRange and Versions interact.</em>
-<a class="jxr_linenumber" name="127" href="#127">127</a>     <em class="jxr_comment">// Another range.</em>
-<a class="jxr_linenumber" name="128" href="#128">128</a>     scanSpec = <strong class="jxr_keyword">new</strong> Scan(Bytes.toBytes(r1));
-<a class="jxr_linenumber" name="129" href="#129">129</a>     scanSpec.setTimeRange(0, 10);
-<a class="jxr_linenumber" name="130" href="#130">130</a>     scanSpec.setMaxVersions(3);
-<a class="jxr_linenumber" name="131" href="#131">131</a>     <strong class="jxr_keyword">try</strong> (StoreScanner scan = <strong class="jxr_keyword">new</strong> StoreScanner(scanSpec, scanInfo, scanType, getCols(<span class="jxr_string">"a"</span>),
-<a class="jxr_linenumber" name="132" href="#132">132</a>         scanners)) {
-<a class="jxr_linenumber" name="133" href="#133">133</a>       results = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
-<a class="jxr_linenumber" name="134" href="#134">134</a>       Assert.assertEquals(<strong class="jxr_keyword">true</strong>, scan.next(results));
-<a class="jxr_linenumber" name="135" href="#135">135</a>       Assert.assertEquals(3, results.size());
-<a class="jxr_linenumber" name="136" href="#136">136</a>     }
-<a class="jxr_linenumber" name="137" href="#137">137</a>   }
-<a class="jxr_linenumber" name="138" href="#138">138</a> 
-<a class="jxr_linenumber" name="139" href="#139">139</a>   @Test
-<a class="jxr_linenumber" name="140" href="#140">140</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testScanSameTimestamp() <strong class="jxr_keyword">throws</strong> IOException {
-<a class="jxr_linenumber" name="141" href="#141">141</a>     <em class="jxr_comment">// returns only 1 of these 2 even though same timestamp</em>
-<a class="jxr_linenumber" name="142" href="#142">142</a>     KeyValue [] kvs = <strong class="jxr_keyword">new</strong> KeyValue[] {
-<a class="jxr_linenumber" name="143" href="#143">143</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, 1, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="144" href="#144">144</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, 1, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="145" href="#145">145</a>     };
-<a class="jxr_linenumber" name="146" href="#146">146</a>     List&lt;KeyValueScanner&gt; scanners = Arrays.asList(
-<a class="jxr_linenumber" name="147" href="#147">147</a>         <strong class="jxr_keyword">new</strong> KeyValueScanner[] {
-<a class="jxr_linenumber" name="148" href="#148">148</a>             <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html">KeyValueScanFixture</a>(CellComparator.COMPARATOR, kvs)
-<a class="jxr_linenumber" name="149" href="#149">149</a>         });
-<a class="jxr_linenumber" name="150" href="#150">150</a> 
-<a class="jxr_linenumber" name="151" href="#151">151</a>     Scan scanSpec = <strong class="jxr_keyword">new</strong> Scan(Bytes.toBytes(<span class="jxr_string">"R1"</span>));
-<a class="jxr_linenumber" name="152" href="#152">152</a>     <em class="jxr_comment">// this only uses maxVersions (default=1) and TimeRange (default=all)</em>
-<a class="jxr_linenumber" name="153" href="#153">153</a>     <strong class="jxr_keyword">try</strong> (StoreScanner scan =
-<a class="jxr_linenumber" name="154" href="#154">154</a>         <strong class="jxr_keyword">new</strong> StoreScanner(scanSpec, scanInfo, scanType, getCols(<span class="jxr_string">"a"</span>), scanners)) {
-<a class="jxr_linenumber" name="155" href="#155">155</a>       List&lt;Cell&gt; results = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
-<a class="jxr_linenumber" name="156" href="#156">156</a>       Assert.assertEquals(<strong class="jxr_keyword">true</strong>, scan.next(results));
-<a class="jxr_linenumber" name="157" href="#157">157</a>       Assert.assertEquals(1, results.size());
-<a class="jxr_linenumber" name="158" href="#158">158</a>       Assert.assertEquals(kvs[0], results.get(0));
-<a class="jxr_linenumber" name="159" href="#159">159</a>     }
-<a class="jxr_linenumber" name="160" href="#160">160</a>   }
-<a class="jxr_linenumber" name="161" href="#161">161</a> 
-<a class="jxr_linenumber" name="162" href="#162">162</a>   <em class="jxr_comment">/*</em>
-<a class="jxr_linenumber" name="163" href="#163">163</a> <em class="jxr_comment">   * Test test shows exactly how the matcher's return codes confuses the StoreScanner</em>
-<a class="jxr_linenumber" name="164" href="#164">164</a> <em class="jxr_comment">   * and prevent it from doing the right thing.  Seeking once, then nexting twice</em>
-<a class="jxr_linenumber" name="165" href="#165">165</a> <em class="jxr_comment">   * should return R1, then R2, but in this case it doesnt.</em>
-<a class="jxr_linenumber" name="166" href="#166">166</a> <em class="jxr_comment">   * TODO this comment makes no sense above. Appears to do the right thing.</em>
-<a class="jxr_linenumber" name="167" href="#167">167</a> <em class="jxr_comment">   * @throws IOException</em>
-<a class="jxr_linenumber" name="168" href="#168">168</a> <em class="jxr_comment">   */</em>
-<a class="jxr_linenumber" name="169" href="#169">169</a>   @Test
-<a class="jxr_linenumber" name="170" href="#170">170</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testWontNextToNext() <strong class="jxr_keyword">throws</strong> IOException {
-<a class="jxr_linenumber" name="171" href="#171">171</a>     <em class="jxr_comment">// build the scan file:</em>
-<a class="jxr_linenumber" name="172" href="#172">172</a>     KeyValue [] kvs = <strong class="jxr_keyword">new</strong> KeyValue[] {
-<a class="jxr_linenumber" name="173" href="#173">173</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, 2, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="174" href="#174">174</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, 1, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="175" href="#175">175</a>         KeyValueTestUtil.create(<span class="jxr_string">"R2"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, 1, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>)
-<a class="jxr_linenumber" name="176" href="#176">176</a>     };
-<a class="jxr_linenumber" name="177" href="#177">177</a>     List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);
-<a class="jxr_linenumber" name="178" href="#178">178</a> 
-<a class="jxr_linenumber" name="179" href="#179">179</a>     Scan scanSpec = <strong class="jxr_keyword">new</strong> Scan(Bytes.toBytes(<span class="jxr_string">"R1"</span>));
-<a class="jxr_linenumber" name="180" href="#180">180</a>     <em class="jxr_comment">// this only uses maxVersions (default=1) and TimeRange (default=all)</em>
-<a class="jxr_linenumber" name="181" href="#181">181</a>     <strong class="jxr_keyword">try</strong> (StoreScanner scan =
-<a class="jxr_linenumber" name="182" href="#182">182</a>         <strong class="jxr_keyword">new</strong> StoreScanner(scanSpec, scanInfo, scanType, getCols(<span class="jxr_string">"a"</span>), scanners)) {
-<a class="jxr_linenumber" name="183" href="#183">183</a>       List&lt;Cell&gt; results = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
-<a class="jxr_linenumber" name="184" href="#184">184</a>       scan.next(results);
-<a class="jxr_linenumber" name="185" href="#185">185</a>       Assert.assertEquals(1, results.size());
-<a class="jxr_linenumber" name="186" href="#186">186</a>       Assert.assertEquals(kvs[0], results.get(0));
-<a class="jxr_linenumber" name="187" href="#187">187</a>       <em class="jxr_comment">// should be ok...</em>
-<a class="jxr_linenumber" name="188" href="#188">188</a>       <em class="jxr_comment">// now scan _next_ again.</em>
-<a class="jxr_linenumber" name="189" href="#189">189</a>       results.clear();
-<a class="jxr_linenumber" name="190" href="#190">190</a>       scan.next(results);
-<a class="jxr_linenumber" name="191" href="#191">191</a>       Assert.assertEquals(1, results.size());
-<a class="jxr_linenumber" name="192" href="#192">192</a>       Assert.assertEquals(kvs[2], results.get(0));
-<a class="jxr_linenumber" name="193" href="#193">193</a> 
-<a class="jxr_linenumber" name="194" href="#194">194</a>       results.clear();
-<a class="jxr_linenumber" name="195" href="#195">195</a>       scan.next(results);
-<a class="jxr_linenumber" name="196" href="#196">196</a>       Assert.assertEquals(0, results.size());
-<a class="jxr_linenumber" name="197" href="#197">197</a>     }
-<a class="jxr_linenumber" name="198" href="#198">198</a>   }
-<a class="jxr_linenumber" name="199" href="#199">199</a> 
-<a class="jxr_linenumber" name="200" href="#200">200</a> 
-<a class="jxr_linenumber" name="201" href="#201">201</a>   @Test
-<a class="jxr_linenumber" name="202" href="#202">202</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testDeleteVersionSameTimestamp() <strong class="jxr_keyword">throws</strong> IOException {
-<a class="jxr_linenumber" name="203" href="#203">203</a>     KeyValue [] kvs = <strong class="jxr_keyword">new</strong> KeyValue [] {
-<a class="jxr_linenumber" name="204" href="#204">204</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, 1, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="205" href="#205">205</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, 1, KeyValue.Type.Delete, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="206" href="#206">206</a>     };
-<a class="jxr_linenumber" name="207" href="#207">207</a>     List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);
-<a class="jxr_linenumber" name="208" href="#208">208</a>     Scan scanSpec = <strong class="jxr_keyword">new</strong> Scan(Bytes.toBytes(<span class="jxr_string">"R1"</span>));
-<a class="jxr_linenumber" name="209" href="#209">209</a>     <strong class="jxr_keyword">try</strong> (StoreScanner scan =
-<a class="jxr_linenumber" name="210" href="#210">210</a>         <strong class="jxr_keyword">new</strong> StoreScanner(scanSpec, scanInfo, scanType, getCols(<span class="jxr_string">"a"</span>), scanners)) {
-<a class="jxr_linenumber" name="211" href="#211">211</a>       List&lt;Cell&gt; results = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
-<a class="jxr_linenumber" name="212" href="#212">212</a>       Assert.assertFalse(scan.next(results));
-<a class="jxr_linenumber" name="213" href="#213">213</a>       Assert.assertEquals(0, results.size());
-<a class="jxr_linenumber" name="214" href="#214">214</a>     }
-<a class="jxr_linenumber" name="215" href="#215">215</a>   }
-<a class="jxr_linenumber" name="216" href="#216">216</a> 
-<a class="jxr_linenumber" name="217" href="#217">217</a>   <em class="jxr_comment">/*</em>
-<a class="jxr_linenumber" name="218" href="#218">218</a> <em class="jxr_comment">   * Test the case where there is a delete row 'in front of' the next row, the scanner</em>
-<a class="jxr_linenumber" name="219" href="#219">219</a> <em class="jxr_comment">   * will move to the next row.</em>
-<a class="jxr_linenumber" name="220" href="#220">220</a> <em class="jxr_comment">   */</em>
-<a class="jxr_linenumber" name="221" href="#221">221</a>   @Test
-<a class="jxr_linenumber" name="222" href="#222">222</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testDeletedRowThenGoodRow() <strong class="jxr_keyword">throws</strong> IOException {
-<a class="jxr_linenumber" name="223" href="#223">223</a>     KeyValue [] kvs = <strong class="jxr_keyword">new</strong> KeyValue [] {
-<a class="jxr_linenumber" name="224" href="#224">224</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, 1, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="225" href="#225">225</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, 1, KeyValue.Type.Delete, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="226" href="#226">226</a>         KeyValueTestUtil.create(<span class="jxr_string">"R2"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, 20, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>)
-<a class="jxr_linenumber" name="227" href="#227">227</a>     };
-<a class="jxr_linenumber" name="228" href="#228">228</a>     List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);
-<a class="jxr_linenumber" name="229" href="#229">229</a>     Scan scanSpec = <strong class="jxr_keyword">new</strong> Scan(Bytes.toBytes(<span class="jxr_string">"R1"</span>));
-<a class="jxr_linenumber" name="230" href="#230">230</a>     <strong class="jxr_keyword">try</strong> (StoreScanner scan =
-<a class="jxr_linenumber" name="231" href="#231">231</a>         <strong class="jxr_keyword">new</strong> StoreScanner(scanSpec, scanInfo, scanType, getCols(<span class="jxr_string">"a"</span>), scanners)) {
-<a class="jxr_linenumber" name="232" href="#232">232</a>       List&lt;Cell&gt; results = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
-<a class="jxr_linenumber" name="233" href="#233">233</a>       Assert.assertEquals(<strong class="jxr_keyword">true</strong>, scan.next(results));
-<a class="jxr_linenumber" name="234" href="#234">234</a>       Assert.assertEquals(0, results.size());
-<a class="jxr_linenumber" name="235" href="#235">235</a> 
-<a class="jxr_linenumber" name="236" href="#236">236</a>       Assert.assertEquals(<strong class="jxr_keyword">true</strong>, scan.next(results));
-<a class="jxr_linenumber" name="237" href="#237">237</a>       Assert.assertEquals(1, results.size());
-<a class="jxr_linenumber" name="238" href="#238">238</a>       Assert.assertEquals(kvs[2], results.get(0));
-<a class="jxr_linenumber" name="239" href="#239">239</a> 
-<a class="jxr_linenumber" name="240" href="#240">240</a>       Assert.assertEquals(false, scan.next(results));
-<a class="jxr_linenumber" name="241" href="#241">241</a>     }
-<a class="jxr_linenumber" name="242" href="#242">242</a>   }
-<a class="jxr_linenumber" name="243" href="#243">243</a> 
-<a class="jxr_linenumber" name="244" href="#244">244</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testDeleteVersionMaskingMultiplePuts() <strong class="jxr_keyword">throws</strong> IOException {
-<a class="jxr_linenumber" name="245" href="#245">245</a>     <strong class="jxr_keyword">long</strong> now = System.currentTimeMillis();
-<a class="jxr_linenumber" name="246" href="#246">246</a>     KeyValue [] kvs1 = <strong class="jxr_keyword">new</strong> KeyValue[] {
-<a class="jxr_linenumber" name="247" href="#247">247</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, now, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="248" href="#248">248</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, now, KeyValue.Type.Delete, <span class="jxr_string">"dont-care"</span>)
-<a class="jxr_linenumber" name="249" href="#249">249</a>     };
-<a class="jxr_linenumber" name="250" href="#250">250</a>     KeyValue [] kvs2 = <strong class="jxr_keyword">new</strong> KeyValue[] {
-<a class="jxr_linenumber" name="251" href="#251">251</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, now-500, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="252" href="#252">252</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, now-100, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="253" href="#253">253</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, now, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>)
-<a class="jxr_linenumber" name="254" href="#254">254</a>     };
-<a class="jxr_linenumber" name="255" href="#255">255</a>     List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs1, kvs2);
-<a class="jxr_linenumber" name="256" href="#256">256</a> 
-<a class="jxr_linenumber" name="257" href="#257">257</a>     <strong class="jxr_keyword">try</strong> (StoreScanner scan = <strong class="jxr_keyword">new</strong> StoreScanner(<strong class="jxr_keyword">new</strong> Scan(Bytes.toBytes(<span class="jxr_string">"R1"</span>)), scanInfo, scanType,
-<a class="jxr_linenumber" name="258" href="#258">258</a>         getCols(<span class="jxr_string">"a"</span>), scanners)) {
-<a class="jxr_linenumber" name="259" href="#259">259</a>       List&lt;Cell&gt; results = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
-<a class="jxr_linenumber" name="260" href="#260">260</a>       <em class="jxr_comment">// the two put at ts=now will be masked by the 1 delete, and</em>
-<a class="jxr_linenumber" name="261" href="#261">261</a>       <em class="jxr_comment">// since the scan default returns 1 version we'll return the newest</em>
-<a class="jxr_linenumber" name="262" href="#262">262</a>       <em class="jxr_comment">// key, which is kvs[2], now-100.</em>
-<a class="jxr_linenumber" name="263" href="#263">263</a>       Assert.assertEquals(<strong class="jxr_keyword">true</strong>, scan.next(results));
-<a class="jxr_linenumber" name="264" href="#264">264</a>       Assert.assertEquals(1, results.size());
-<a class="jxr_linenumber" name="265" href="#265">265</a>       Assert.assertEquals(kvs2[1], results.get(0));
-<a class="jxr_linenumber" name="266" href="#266">266</a>     }
-<a class="jxr_linenumber" name="267" href="#267">267</a>   }
-<a class="jxr_linenumber" name="268" href="#268">268</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testDeleteVersionsMixedAndMultipleVersionReturn() <strong class="jxr_keyword">throws</strong> IOException {
-<a class="jxr_linenumber" name="269" href="#269">269</a>     <strong class="jxr_keyword">long</strong> now = System.currentTimeMillis();
-<a class="jxr_linenumber" name="270" href="#270">270</a>     KeyValue [] kvs1 = <strong class="jxr_keyword">new</strong> KeyValue[] {
-<a class="jxr_linenumber" name="271" href="#271">271</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, now, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="272" href="#272">272</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, now, KeyValue.Type.Delete, <span class="jxr_string">"dont-care"</span>)
-<a class="jxr_linenumber" name="273" href="#273">273</a>     };
-<a class="jxr_linenumber" name="274" href="#274">274</a>     KeyValue [] kvs2 = <strong class="jxr_keyword">new</strong> KeyValue[] {
-<a class="jxr_linenumber" name="275" href="#275">275</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, now-500, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="276" href="#276">276</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, now+500, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="277" href="#277">277</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, now, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="278" href="#278">278</a>         KeyValueTestUtil.create(<span class="jxr_string">"R2"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"z"</span>, now, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>)
-<a class="jxr_linenumber" name="279" href="#279">279</a>     };
-<a class="jxr_linenumber" name="280" href="#280">280</a>     List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs1, kvs2);
-<a class="jxr_linenumber" name="281" href="#281">281</a> 
-<a class="jxr_linenumber" name="282" href="#282">282</a>     Scan scanSpec = <strong class="jxr_keyword">new</strong> Scan(Bytes.toBytes(<span class="jxr_string">"R1"</span>)).setMaxVersions(2);
-<a class="jxr_linenumber" name="283" href="#283">283</a>     <strong class="jxr_keyword">try</strong> (StoreScanner scan = <strong class="jxr_keyword">new</strong> StoreScanner(scanSpec, scanInfo, scanType,
-<a class="jxr_linenumber" name="284" href="#284">284</a>         getCols(<span class="jxr_string">"a"</span>), scanners)) {
-<a class="jxr_linenumber" name="285" href="#285">285</a>       List&lt;Cell&gt; results = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
-<a class="jxr_linenumber" name="286" href="#286">286</a>       Assert.assertEquals(<strong class="jxr_keyword">true</strong>, scan.next(results));
-<a class="jxr_linenumber" name="287" href="#287">287</a>       Assert.assertEquals(2, results.size());
-<a class="jxr_linenumber" name="288" href="#288">288</a>       Assert.assertEquals(kvs2[1], results.get(0));
-<a class="jxr_linenumber" name="289" href="#289">289</a>       Assert.assertEquals(kvs2[0], results.get(1));
-<a class="jxr_linenumber" name="290" href="#290">290</a>     }
-<a class="jxr_linenumber" name="291" href="#291">291</a>   }
-<a class="jxr_linenumber" name="292" href="#292">292</a> 
-<a class="jxr_linenumber" name="293" href="#293">293</a>   @Test
-<a class="jxr_linenumber" name="294" href="#294">294</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testWildCardOneVersionScan() <strong class="jxr_keyword">throws</strong> IOException {
-<a class="jxr_linenumber" name="295" href="#295">295</a>     KeyValue [] kvs = <strong class="jxr_keyword">new</strong> KeyValue [] {
-<a class="jxr_linenumber" name="296" href="#296">296</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, 2, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="297" href="#297">297</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"b"</span>, 1, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="298" href="#298">298</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, 1, KeyValue.Type.DeleteColumn, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="299" href="#299">299</a>     };
-<a class="jxr_linenumber" name="300" href="#300">300</a>     List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);
-<a class="jxr_linenumber" name="301" href="#301">301</a>     <strong class="jxr_keyword">try</strong> (StoreScanner scan =
-<a class="jxr_linenumber" name="302" href="#302">302</a>         <strong class="jxr_keyword">new</strong> StoreScanner(<strong class="jxr_keyword">new</strong> Scan(Bytes.toBytes(<span class="jxr_string">"R1"</span>)), scanInfo, scanType, <strong class="jxr_keyword">null</strong>, scanners)) {
-<a class="jxr_linenumber" name="303" href="#303">303</a>       List&lt;Cell&gt; results = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
-<a class="jxr_linenumber" name="304" href="#304">304</a>       Assert.assertEquals(<strong class="jxr_keyword">true</strong>, scan.next(results));
-<a class="jxr_linenumber" name="305" href="#305">305</a>       Assert.assertEquals(2, results.size());
-<a class="jxr_linenumber" name="306" href="#306">306</a>       Assert.assertEquals(kvs[0], results.get(0));
-<a class="jxr_linenumber" name="307" href="#307">307</a>       Assert.assertEquals(kvs[1], results.get(1));
-<a class="jxr_linenumber" name="308" href="#308">308</a>     }
-<a class="jxr_linenumber" name="309" href="#309">309</a>   }
-<a class="jxr_linenumber" name="310" href="#310">310</a> 
-<a class="jxr_linenumber" name="311" href="#311">311</a>   @Test
-<a class="jxr_linenumber" name="312" href="#312">312</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testWildCardScannerUnderDeletes() <strong class="jxr_keyword">throws</strong> IOException {
-<a class="jxr_linenumber" name="313" href="#313">313</a>     KeyValue [] kvs = <strong class="jxr_keyword">new</strong> KeyValue [] {
-<a class="jxr_linenumber" name="314" href="#314">314</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, 2, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>), <em class="jxr_comment">// inc</em>
-<a class="jxr_linenumber" name="315" href="#315">315</a>         <em class="jxr_comment">// orphaned delete column.</em>
-<a class="jxr_linenumber" name="316" href="#316">316</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, 1, KeyValue.Type.DeleteColumn, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="317" href="#317">317</a>         <em class="jxr_comment">// column b</em>
-<a class="jxr_linenumber" name="318" href="#318">318</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"b"</span>, 2, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>), <em class="jxr_comment">// inc</em>
-<a class="jxr_linenumber" name="319" href="#319">319</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"b"</span>, 1, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>), <em class="jxr_comment">// inc</em>
-<a class="jxr_linenumber" name="320" href="#320">320</a>         <em class="jxr_comment">// column c</em>
-<a class="jxr_linenumber" name="321" href="#321">321</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"c"</span>, 10, KeyValue.Type.Delete, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="322" href="#322">322</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"c"</span>, 10, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>), <em class="jxr_comment">// no</em>
-<a class="jxr_linenumber" name="323" href="#323">323</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"c"</span>, 9, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),  <em class="jxr_comment">// inc</em>
-<a class="jxr_linenumber" name="324" href="#324">324</a>         <em class="jxr_comment">// column d</em>
-<a class="jxr_linenumber" name="325" href="#325">325</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"d"</span>, 11, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>), <em class="jxr_comment">// inc</em>
-<a class="jxr_linenumber" name="326" href="#326">326</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"d"</span>, 10, KeyValue.Type.DeleteColumn, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="327" href="#327">327</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"d"</span>, 9, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),  <em class="jxr_comment">// no</em>
-<a class="jxr_linenumber" name="328" href="#328">328</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"d"</span>, 8, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),  <em class="jxr_comment">// no</em>
-<a class="jxr_linenumber" name="329" href="#329">329</a> 
-<a class="jxr_linenumber" name="330" href="#330">330</a>     };
-<a class="jxr_linenumber" name="331" href="#331">331</a>     List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);
-<a class="jxr_linenumber" name="332" href="#332">332</a>     <strong class="jxr_keyword">try</strong> (StoreScanner scan = <strong class="jxr_keyword">new</strong> StoreScanner(<strong class="jxr_keyword">new</strong> Scan().setMaxVersions(2),
-<a class="jxr_linenumber" name="333" href="#333">333</a>         scanInfo, scanType, <strong class="jxr_keyword">null</strong>, scanners)) {
-<a class="jxr_linenumber" name="334" href="#334">334</a>       List&lt;Cell&gt; results = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
-<a class="jxr_linenumber" name="335" href="#335">335</a>       Assert.assertEquals(<strong class="jxr_keyword">true</strong>, scan.next(results));
-<a class="jxr_linenumber" name="336" href="#336">336</a>       Assert.assertEquals(5, results.size());
-<a class="jxr_linenumber" name="337" href="#337">337</a>       Assert.assertEquals(kvs[0], results.get(0));
-<a class="jxr_linenumber" name="338" href="#338">338</a>       Assert.assertEquals(kvs[2], results.get(1));
-<a class="jxr_linenumber" name="339" href="#339">339</a>       Assert.assertEquals(kvs[3], results.get(2));
-<a class="jxr_linenumber" name="340" href="#340">340</a>       Assert.assertEquals(kvs[6], results.get(3));
-<a class="jxr_linenumber" name="341" href="#341">341</a>       Assert.assertEquals(kvs[7], results.get(4));
-<a class="jxr_linenumber" name="342" href="#342">342</a>     }
-<a class="jxr_linenumber" name="343" href="#343">343</a>   }
-<a class="jxr_linenumber" name="344" href="#344">344</a> 
-<a class="jxr_linenumber" name="345" href="#345">345</a>   @Test
-<a class="jxr_linenumber" name="346" href="#346">346</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testDeleteFamily() <strong class="jxr_keyword">throws</strong> IOException {
-<a class="jxr_linenumber" name="347" href="#347">347</a>     KeyValue [] kvs = <strong class="jxr_keyword">new</strong> KeyValue[] {
-<a class="jxr_linenumber" name="348" href="#348">348</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, 100, KeyValue.Type.DeleteFamily, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="349" href="#349">349</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"b"</span>, 11, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="350" href="#350">350</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"c"</span>, 11, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="351" href="#351">351</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"d"</span>, 11, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="352" href="#352">352</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"e"</span>, 11, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="353" href="#353">353</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"e"</span>, 11, KeyValue.Type.DeleteColumn, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="354" href="#354">354</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"f"</span>, 11, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="355" href="#355">355</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"g"</span>, 11, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="356" href="#356">356</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"g"</span>, 11, KeyValue.Type.Delete, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="357" href="#357">357</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"h"</span>, 11, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="358" href="#358">358</a>         KeyValueTestUtil.create(<span class="jxr_string">"R1"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"i"</span>, 11, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="359" href="#359">359</a>         KeyValueTestUtil.create(<span class="jxr_string">"R2"</span>, <span class="jxr_string">"cf"</span>, <span class="jxr_string">"a"</span>, 11, KeyValue.Type.Put, <span class="jxr_string">"dont-care"</span>),
-<a class="jxr_linenumber" name="360" href="#360">360</a>     };
-<a class="jxr_linenumber" name="361" href="#361">361</a>     List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);
+<a class="jxr_linenumber" name="23" href="#23">23</a>  <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.junit.Assert.*;
+<a class="jxr_linenumber" name="24" href="#24">24</a>  
+<a class="jxr_linenumber" name="25" href="#25">25</a>  <strong class="jxr_keyword">import</strong> java.io.IOException;
+<a class="jxr_linenumber" name="26" href="#26">26</a>  <strong class="jxr_keyword">import</strong> java.util.ArrayList;
+<a class="jxr_linenumber" name="27" href="#27">27</a>  <strong class="jxr_keyword">import</strong> java.util.Arrays;
+<a class="jxr_linenumber" name="28" href="#28">28</a>  <strong class="jxr_keyword">import</strong> java.util.List;
+<a class="jxr_linenumber" name="29" href="#29">29</a>  <strong class="jxr_keyword">import</strong> java.util.NavigableSet;
+<a class="jxr_linenumber" name="30" href="#30">30</a>  <strong class="jxr_keyword">import</strong> java.util.TreeSet;
+<a class="jxr_linenumber" name="31" href="#31">31</a>  <strong class="jxr_keyword">import</strong> java.util.concurrent.atomic.AtomicInteger;
+<a class="jxr_linenumber" name="32" href="#32">32</a>  
+<a class="jxr_linenumber" name="33" href="#33">33</a>  <strong class="jxr_keyword">import</strong> org.apache.commons.logging.Log;
+<a class="jxr_linenumber" name="34" href="#34">34</a>  <strong class="jxr_keyword">import</strong> org.apache.commons.logging.LogFactory;
+<a class="jxr_linenumber" name="35" href="#35">35</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.conf.Configuration;
+<a class="jxr_linenumber" name="36" href="#36">36</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.CategoryBasedTimeout;
+<a class="jxr_linenumber" name="37" href="#37">37</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.Cell;
+<a class="jxr_linenumber" name="38" href="#38">38</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.CellComparator;
+<a class="jxr_linenumber" name="39" href="#39">39</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.CellUtil;
+<a class="jxr_linenumber" name="40" href="#40">40</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.HBaseConfiguration;
+<a class="jxr_linenumber" name="41" href="#41">41</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.HConstants;
+<a class="jxr_linenumber" name="42" href="#42">42</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.KeepDeletedCells;
+<a class="jxr_linenumber" name="43" href="#43">43</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.KeyValue;
+<a class="jxr_linenumber" name="44" href="#44">44</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.KeyValueTestUtil;
+<a class="jxr_linenumber" name="45" href="#45">45</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.client.Get;
+<a class="jxr_linenumber" name="46" href="#46">46</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.client.Scan;
+<a class="jxr_linenumber" name="47" href="#47">47</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.testclassification.MediumTests;
+<a class="jxr_linenumber" name="48" href="#48">48</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.testclassification.RegionServerTests;
+<a class="jxr_linenumber" name="49" href="#49">49</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.util.Bytes;
+<a class="jxr_linenumber" name="50" href="#50">50</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.util.EnvironmentEdge;
+<a class="jxr_linenumber" name="51" href="#51">51</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;
+<a class="jxr_linenumber" name="52" href="#52">52</a>  <strong class="jxr_keyword">import</strong> org.junit.Assert;
+<a class="jxr_linenumber" name="53" href="#53">53</a>  <strong class="jxr_keyword">import</strong> org.junit.Rule;
+<a class="jxr_linenumber" name="54" href="#54">54</a>  <strong class="jxr_keyword">import</strong> org.junit.Test;
+<a class="jxr_linenumber" name="55" href="#55">55</a>  <strong class="jxr_keyword">import</strong> org.junit.experimental.categories.Category;
+<a class="jxr_linenumber" name="56" href="#56">56</a>  <strong class="jxr_keyword">import</strong> org.junit.rules.TestName;
+<a class="jxr_linenumber" name="57" href="#57">57</a>  <strong class="jxr_keyword">import</strong> org.junit.rules.TestRule;
+<a class="jxr_linenumber" name="58" href="#58">58</a>  
+<a class="jxr_linenumber" name="59" href="#59">59</a>  <em class="jxr_comment">// Can't be small as it plays with EnvironmentEdgeManager</em>
+<a class="jxr_linenumber" name="60" href="#60">60</a>  @Category({RegionServerTests.<strong class="jxr_keyword">class</strong>, MediumTests.<strong class="jxr_keyword">class</strong>})
+<a class="jxr_linenumber" name="61" href="#61">61</a>  <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">class</strong> <a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html">TestStoreScanner</a> {
+<a class="jxr_linenumber" name="62" href="#62">62</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> Log LOG = LogFactory.getLog(TestStoreScanner.<strong class="jxr_keyword">class</strong>);
+<a class="jxr_linenumber" name="63" href="#63">63</a>    @Rule <strong class="jxr_keyword">public</strong> TestName name = <strong class="jxr_keyword">new</strong> TestName();
+<a class="jxr_linenumber" name="64" href="#64">64</a>    @Rule <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">final</strong> TestRule timeout = CategoryBasedTimeout.builder().withTimeout(<strong class="jxr_keyword">this</strong>.getClass()).
+<a class="jxr_linenumber" name="65" href="#65">65</a>        withLookingForStuckThread(<strong class="jxr_keyword">true</strong>).build();
+<a class="jxr_linenumber" name="66" href="#66">66</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> String CF_STR = <span class="jxr_string">"cf"</span>;
+<a class="jxr_linenumber" name="67" href="#67">67</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> byte [] CF = Bytes.toBytes(CF_STR);
+<a class="jxr_linenumber" name="68" href="#68">68</a>    <strong class="jxr_keyword">static</strong> Configuration CONF = HBaseConfiguration.create();
+<a class="jxr_linenumber" name="69" href="#69">69</a>    <strong class="jxr_keyword">private</strong> ScanInfo scanInfo = <strong class="jxr_keyword">new</strong> ScanInfo(CONF, CF, 0, Integer.MAX_VALUE,
+<a class="jxr_linenumber" name="70" href="#70">70</a>        Long.MAX_VALUE, KeepDeletedCells.FALSE, 0, CellComparator.COMPARATOR);
+<a class="jxr_linenumber" name="71" href="#71">71</a>    <strong class="jxr_keyword">private</strong> ScanType scanType = ScanType.USER_SCAN;
+<a class="jxr_linenumber" name="72" href="#72">72</a>  
+<a class="jxr_linenumber" name="73" href="#73">73</a>    <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="74" href="#74">74</a>  <em class="jxr_javadoccomment">   * From here on down, we have a bunch of defines and specific CELL_GRID of Cells. The</em>
+<a class="jxr_linenumber" name="75" href="#75">75</a>  <em class="jxr_javadoccomment">   * CELL_GRID then has a Scanner that can fake out 'block' transitions. All this elaborate</em>
+<a class="jxr_linenumber" name="76" href="#76">76</a>  <em class="jxr_javadoccomment">   * setup is for tests that ensure we don't overread, and that the</em>
+<a class="jxr_linenumber" name="77" href="#77">77</a>  <em class="jxr_javadoccomment">   * {@link StoreScanner#optimize(org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode,</em>
+<a class="jxr_linenumber" name="78" href="#78">78</a>  <em class="jxr_javadoccomment">   * Cell)} is not overly enthusiastic.</em>
+<a class="jxr_linenumber" name="79" href="#79">79</a>  <em class="jxr_javadoccomment">   */</em>
+<a class="jxr_linenumber" name="80" href="#80">80</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> byte [] ZERO = <strong class="jxr_keyword">new</strong> byte [] {'0'};
+<a class="jxr_linenumber" name="81" href="#81">81</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> byte [] ZERO_POINT_ZERO = <strong class="jxr_keyword">new</strong> byte [] {'0', '.', '0'};
+<a class="jxr_linenumber" name="82" href="#82">82</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> byte [] ONE = <strong class="jxr_keyword">new</strong> byte [] {'1'};
+<a class="jxr_linenumber" name="83" href="#83">83</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> byte [] TWO = <strong class="jxr_keyword">new</strong> byte [] {'2'};
+<a class="jxr_linenumber" name="84" href="#84">84</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> byte [] TWO_POINT_TWO = <strong class="jxr_keyword">new</strong> byte [] {'2', '.', '2'};
+<a class="jxr_linenumber" name="85" href="#85">85</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> byte [] THREE = <strong class="jxr_keyword">new</strong> byte [] {'3'};
+<a class="jxr_linenumber" name="86" href="#86">86</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> byte [] FOUR = <strong class="jxr_keyword">new</strong> byte [] {'4'};
+<a class="jxr_linenumber" name="87" href="#87">87</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> byte [] FIVE = <strong class="jxr_keyword">new</strong> byte [] {'5'};
+<a class="jxr_linenumber" name="88" href="#88">88</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> byte [] VALUE = <strong class="jxr_keyword">new</strong> byte [] {'v'};
+<a class="jxr_linenumber" name="89" href="#89">89</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">int</strong> CELL_GRID_BLOCK2_BOUNDARY = 4;
+<a class="jxr_linenumber" name="90" href="#90">90</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">int</strong> CELL_GRID_BLOCK3_BOUNDARY = 11;
+<a class="jxr_linenumber" name="91" href="#91">91</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">int</strong> CELL_GRID_BLOCK4_BOUNDARY = 15;
+<a class="jxr_linenumber" name="92" href="#92">92</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">int</strong> CELL_GRID_BLOCK5_BOUNDARY = 19;
+<a class="jxr_linenumber" name="93" href="#93">93</a>  
+<a class="jxr_linenumber" name="94" href="#94">94</a>    <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="95" href="#95">95</a>  <em class="jxr_javadoccomment">   * Five rows by four columns distinguished by column qualifier (column qualifier is one of the</em>
+<a class="jxr_linenumber" name="96" href="#96">96</a>  <em class="jxr_javadoccomment">   * four rows... ONE, TWO, etc.). Exceptions are a weird row after TWO; it is TWO_POINT_TWO.</em>
+<a class="jxr_linenumber" name="97" href="#97">97</a>  <em class="jxr_javadoccomment">   * And then row FOUR has five columns finishing w/ row FIVE having a single column.</em>
+<a class="jxr_linenumber" name="98" href="#98">98</a>  <em class="jxr_javadoccomment">   * We will use this to test scan does the right thing as it</em>
+<a class="jxr_linenumber" name="99" href="#99">99</a>  <em class="jxr_javadoccomment">   * we do Gets, StoreScanner#optimize, and what we do on (faked) block boundaries.</em>
+<a class="jxr_linenumber" name="100" href="#100">100</a> <em class="jxr_javadoccomment">   */</em>
+<a class="jxr_linenumber" name="101" href="#101">101</a>   <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> Cell [] CELL_GRID = <strong class="jxr_keyword">new</strong> Cell [] {
+<a class="jxr_linenumber" name="102" href="#102">102</a>     CellUtil.createCell(ONE, CF, ONE, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="103" href="#103">103</a>     CellUtil.createCell(ONE, CF, TWO, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="104" href="#104">104</a>     CellUtil.createCell(ONE, CF, THREE, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="105" href="#105">105</a>     CellUtil.createCell(ONE, CF, FOUR, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="106" href="#106">106</a>     <em class="jxr_comment">// Offset 4 CELL_GRID_BLOCK2_BOUNDARY</em>
+<a class="jxr_linenumber" name="107" href="#107">107</a>     CellUtil.createCell(TWO, CF, ONE, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="108" href="#108">108</a>     CellUtil.createCell(TWO, CF, TWO, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="109" href="#109">109</a>     CellUtil.createCell(TWO, CF, THREE, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="110" href="#110">110</a>     CellUtil.createCell(TWO, CF, FOUR, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="111" href="#111">111</a>     CellUtil.createCell(TWO_POINT_TWO, CF, ZERO, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="112" href="#112">112</a>     CellUtil.createCell(TWO_POINT_TWO, CF, ZERO_POINT_ZERO, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="113" href="#113">113</a>     CellUtil.createCell(TWO_POINT_TWO, CF, FIVE, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="114" href="#114">114</a>     <em class="jxr_comment">// Offset 11! CELL_GRID_BLOCK3_BOUNDARY</em>
+<a class="jxr_linenumber" name="115" href="#115">115</a>     CellUtil.createCell(THREE, CF, ONE, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="116" href="#116">116</a>     CellUtil.createCell(THREE, CF, TWO, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="117" href="#117">117</a>     CellUtil.createCell(THREE, CF, THREE, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="118" href="#118">118</a>     CellUtil.createCell(THREE, CF, FOUR, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="119" href="#119">119</a>     <em class="jxr_comment">// Offset 15 CELL_GRID_BLOCK4_BOUNDARY</em>
+<a class="jxr_linenumber" name="120" href="#120">120</a>     CellUtil.createCell(FOUR, CF, ONE, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="121" href="#121">121</a>     CellUtil.createCell(FOUR, CF, TWO, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="122" href="#122">122</a>     CellUtil.createCell(FOUR, CF, THREE, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="123" href="#123">123</a>     CellUtil.createCell(FOUR, CF, FOUR, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="124" href="#124">124</a>     <em class="jxr_comment">// Offset 19 CELL_GRID_BLOCK5_BOUNDARY</em>
+<a class="jxr_linenumber" name="125" href="#125">125</a>     CellUtil.createCell(FOUR, CF, FIVE, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="126" href="#126">126</a>     CellUtil.createCell(FIVE, CF, ZERO, 1L, KeyValue.Type.Put.getCode(), VALUE),
+<a class="jxr_linenumber" name="127" href="#127">127</a>   };
+<a class="jxr_linenumber" name="128" href="#128">128</a> 
+<a class="jxr_linenumber" name="129" href="#129">129</a>   <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="130" href="#130">130</a> <em class="jxr_javadoccomment">   * A StoreScanner for our CELL_GRID above. Fakes the block transitions. Does counts of</em>
+<a class="jxr_linenumber" name="131" href="#131">131</a> <em class="jxr_javadoccomment">   * calls to optimize and counts of when optimize actually did an optimize.</em>
+<a class="jxr_linenumber" name="132" href="#132">132</a> <em class="jxr_javadoccomment">   */</em>
+<a class="jxr_linenumber" name="133" href="#133">133</a>   <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">class</strong> <a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html">CellGridStoreScanner</a> <strong class="jxr_keyword">extends</strong> StoreScanner {
+<a class="jxr_linenumber" name="134" href="#134">134</a>     <em class="jxr_comment">// Count of how often optimize is called and of how often it does an optimize.</em>
+<a class="jxr_linenumber" name="135" href="#135">135</a>     <strong class="jxr_keyword">final</strong> AtomicInteger count = <strong class="jxr_keyword">new</strong> AtomicInteger(0);
+<a class="jxr_linenumber" name="136" href="#136">136</a>     <strong class="jxr_keyword">final</strong> AtomicInteger optimization = <strong class="jxr_keyword">new</strong> AtomicInteger(0);
+<a class="jxr_linenumber" name="137" href="#137">137</a> 
+<a class="jxr_linenumber" name="138" href="#138">138</a>     <a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html">CellGridStoreScanner</a>(<strong class="jxr_keyword">final</strong> Scan scan, ScanInfo scanInfo, ScanType scanType)
+<a class="jxr_linenumber" name="139" href="#139">139</a>     <strong class="jxr_keyword">throws</strong> IOException {
+<a class="jxr_linenumber" name="140" href="#140">140</a>       <strong class="jxr_keyword">super</strong>(scan, scanInfo, scanType, scan.getFamilyMap().get(CF),
+<a class="jxr_linenumber" name="141" href="#141">141</a>         Arrays.&lt;KeyValueScanner&gt;asList(
+<a class="jxr_linenumber" name="142" href="#142">142</a>           <strong class="jxr_keyword">new</strong> KeyValueScanner[] {<strong class="jxr_keyword">new</strong> KeyValueScanFixture(CellComparator.COMPARATOR, CELL_GRID)}));
+<a class="jxr_linenumber" name="143" href="#143">143</a>     }
+<a class="jxr_linenumber" name="144" href="#144">144</a> 
+<a class="jxr_linenumber" name="145" href="#145">145</a>     <strong class="jxr_keyword">protected</strong> ScanQueryMatcher.MatchCode optimize(ScanQueryMatcher.MatchCode qcode, Cell cell) {
+<a class="jxr_linenumber" name="146" href="#146">146</a>       count.incrementAndGet();
+<a class="jxr_linenumber" name="147" href="#147">147</a>       ScanQueryMatcher.MatchCode after = <strong class="jxr_keyword">super</strong>.optimize(qcode, cell);
+<a class="jxr_linenumber" name="148" href="#148">148</a>       LOG.info(<span class="jxr_string">"Cell="</span> + cell + <span class="jxr_string">", nextIndex="</span> + CellUtil.toString(getNextIndexedKey(), false) +
+<a class="jxr_linenumber" name="149" href="#149">149</a>           <span class="jxr_string">", before="</span> + qcode + <span class="jxr_string">", after="</span> + after);
+<a class="jxr_linenumber" name="150" href="#150">150</a>       <strong class="jxr_keyword">if</strong> (qcode != after) {
+<a class="jxr_linenumber" name="151" href="#151">151</a>         optimization.incrementAndGet();
+<a class="jxr_linenumber" name="152" href="#152">152</a>       }
+<a class="jxr_linenumber" name="153" href="#153">153</a>       <strong class="jxr_keyword">return</strong> after;
+<a class="jxr_linenumber" name="154" href="#154">154</a>     };
+<a class="jxr_linenumber" name="155" href="#155">155</a> 
+<a class="jxr_linenumber" name="156" href="#156">156</a>     @Override
+<a class="jxr_linenumber" name="157" href="#157">157</a>     <strong class="jxr_keyword">public</strong> Cell getNextIndexedKey() {
+<a class="jxr_linenumber" name="158" href="#158">158</a>       <em class="jxr_comment">// Fake block boundaries by having index of next block change as we go through scan.</em>
+<a class="jxr_linenumber" name="159" href="#159">159</a>       <strong class="jxr_keyword">return</strong> count.get() &gt; CELL_GRID_BLOCK4_BOUNDARY?
+<a class="jxr_linenumber" name="160" href="#160">160</a>           CellUtil.createFirstOnRow(CELL_GRID[CELL_GRID_BLOCK5_BOUNDARY]):
+<a class="jxr_linenumber" name="161" href="#161">161</a>             count.get() &gt; CELL_GRID_BLOCK3_BOUNDARY?
+<a class="jxr_linenumber" name="162" href="#162">162</a>                 CellUtil.createFirstOnRow(CELL_GRID[CELL_GRID_BLOCK4_BOUNDARY]):
+<a class="jxr_linenumber" name="163" href="#163">163</a>                   count.get() &gt; CELL_GRID_BLOCK2_BOUNDARY?
+<a class="jxr_linenumber" name="164" href="#164">164</a>                       CellUtil.createFirstOnRow(CELL_GRID[CELL_GRID_BLOCK3_BOUNDARY]):
+<a class="jxr_linenumber" name="165" href="#165">165</a>                         CellUtil.createFirstOnRow(CELL_GRID[CELL_GRID_BLOCK2_BOUNDARY]);
+<a class="jxr_linenumber" name="166" href="#166">166</a>     }
+<a class="jxr_linenumber" name="167" href="#167">167</a>   };
+<a class="jxr_linenumber" name="168" href="#168">168</a> 
+<a class="jxr_linenumber" name="169" href="#169">169</a>   <em class="jxr_comment">/*</em>
+<a class="jxr_linenumber" name="170" href="#170">170</a> <em class="jxr_comment">   * Test utility for building a NavigableSet for scanners.</em>
+<a class="jxr_linenumber" name="171" href="#171">171</a> <em class="jxr_comment">   * @param strCols</em>
+<a class="jxr_linenumber" name="172" href="#172">172</a> <em class="jxr_comment">   * @return</em>
+<a class="jxr_linenumber" name="173" href="#173">173</a> <em class="jxr_comment">   */</em>
+<a class="jxr_linenumber" name="174" href="#174">174</a>   NavigableSet&lt;byte[]&gt; getCols(String ...strCols) {
+<a class="jxr_linenumber" name="175" href="#175">175</a>     NavigableSet&lt;byte[]&gt; cols = <strong class="jxr_keyword">new</strong> TreeSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);
+<a class="jxr_linenumber" name="176" href="#176">176</a>     <strong class="jxr_keyword">for</strong> (String col : strCols) {
+<a class="jxr_linenumber" name="177" href="#177">177</a>       byte[] bytes = Bytes.toBytes(col);
+<a class="jxr_linenumber" name="178" href="#178">178</a>       cols.add(bytes);
+<a class="jxr_linenumber" name="179" href="#179">179</a>     }
+<a class="jxr_linenumber" name="180" href="#180">180</a>     <strong class="jxr_keyword">return</strong> cols;
+<a class="jxr_linenumber" name="181" href="#181">181</a>   }
+<a class="jxr_linenumber" name="182" href="#182">182</a> 
+<a class="jxr_linenumber" name="183" href="#183">183</a>   @Test
+<a class="jxr_linenumber" name="184" href="#184">184</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testFullRowGetDoesNotOverreadWhenRowInsideOneBlock() <strong class="jxr_keyword">throws</strong> IOException {
+<a class="jxr_linenumber" name="185" href="#185">185</a>     <em class="jxr_comment">// Do a Get against row two. Row two is inside a block that starts with row TWO but ends with</em>
+<a class="jxr_linenumber" name="186" href="#186">186</a>     <em class="jxr_comment">// row TWO_POINT_TWO. We should read one block only.</em>
+<a class="jxr_linenumber" name="187" href="#187">187</a>     Get get = <strong class="jxr_keyword">new</strong> Get(TWO);
+<a class="jxr_linenumber" name="188" href="#188">188</a>     Scan scan = <strong class="jxr_keyword">new</strong> Scan(get);
+<a class="jxr_linenumber" name="189" href="#189">189</a>     <a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html">CellGridStoreScanner</a> scanner = <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html">CellGridStoreScanner</a>(scan, <strong class="jxr_keyword">this</strong>.scanInfo, <strong class="jxr_keyword">this</strong>.scanType);
+<a class="jxr_linenumber" name="190" href="#190">190</a>     <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="191" href="#191">191</a>       List&lt;Cell&gt; results = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
+<a class="jxr_linenumber" name="192" href="#192">192</a>       <strong class="jxr_keyword">while</strong> (scanner.next(results)) {
+<a class="jxr_linenumber" name="193" href="#193">193</a>         <strong class="jxr_keyword">continue</strong>;
+<a class="jxr_linenumber" name="194" href="#194">194</a>       }
+<a class="jxr_linenumber" name="195" href="#195">195</a>       <em class="jxr_comment">// Should be four results of column 1 (though there are 5 rows in the CELL_GRID -- the</em>
+<a class="jxr_linenumber" name="196" href="#196">196</a>       <em class="jxr_comment">// TWO_POINT_TWO row does not have a a column ONE.</em>
+<a class="jxr_linenumber" name="197" href="#197">197</a>       Assert.assertEquals(4, results.size());
+<a class="jxr_linenumber" name="198" href="#198">198</a>       <em class="jxr_comment">// We should have gone the optimize route 5 times totally... an INCLUDE for the four cells</em>
+<a class="jxr_linenumber" name="199" href="#199">199</a>       <em class="jxr_comment">// in the row plus the DONE on the end.</em>
+<a class="jxr_linenumber" name="200" href="#200">200</a>       Assert.assertEquals(5, scanner.count.get());
+<a class="jxr_linenumber" name="201" href="#201">201</a>       <em class="jxr_comment">// For a full row Get, there should be no opportunity for scanner optimization.</em>
+<a class="jxr_linenumber" name="202" href="#202">202</a>       Assert.assertEquals(0, scanner.optimization.get());
+<a class="jxr_linenumber" name="203" href="#203">203</a>     } <strong class="jxr_keyword">finally</strong> {
+<a class="jxr_linenumber" name="204" href="#204">204</a>       scanner.close();
+<a class="jxr_linenumber" name="205" href="#205">205</a>     }
+<a class="jxr_linenumber" name="206" href="#206">206</a>   }
+<a class="jxr_linenumber" name="207" href="#207">207</a> 
+<a class="jxr_linenumber" name="208" href="#208">208</a>   @Test
+<a class="jxr_linenumber" name="209" href="#209">209</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testFullRowSpansBlocks() <strong class="jxr_keyword">throws</strong> IOException {
+<a class="jxr_linenumber" name="210" href="#210">210</a>     <em class="jxr_comment">// Do a Get against row FOUR. It spans two blocks.</em>
+<a class="jxr_linenumber" name="211" href="#211">211</a>     Get get = <strong class="jxr_keyword">new</strong> Get(FOUR);
+<a class="jxr_linenumber" name="212" href="#212">212</a>     Scan scan = <strong class="jxr_keyword">new</strong> Scan(get);
+<a class="jxr_linenumber" name="213" href="#213">213</a>     <a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html">CellGridStoreScanner</a> scanner = <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html">CellGridStoreScanner</a>(scan, <strong class="jxr_keyword">this</strong>.scanInfo, <strong class="jxr_keyword">this</strong>.scanType);
+<a class="jxr_linenumber" name="214" href="#214">214</a>     <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="215" href="#215">215</a>       List&lt;Cell&gt; results = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
+<a class="jxr_linenumber" name="216" href="#216">216</a>       <strong class="jxr_keyword">while</strong> (scanner.next(results)) {
+<a class="jxr_linenumber" name="217" href="#217">217</a>         <strong class="jxr_keyword">continue</strong>;
+<a class="jxr_linenumber" name="218" href="#218">218</a>       }
+<a class="jxr_linenumber" name="219" href="#219">219</a>       <em class="jxr_comment">// Should be four results of column 1 (though there are 5 rows in the CELL_GRID -- the</em>
+<a class="jxr_linenumber" name="220" href="#220">220</a>       <em class="jxr_comment">// TWO_POINT_TWO row does not have a a column ONE.</em>
+<a class="jxr_linenumber" name="221" href="#221">221</a>       Assert.assertEquals(5, results.size());
+<a class="jxr_linenumber" name="222" href="#222">222</a>       <em class="jxr_comment">// We should have gone the optimize route 6 times totally... an INCLUDE for the five cells</em>
+<a class="jxr_linenumber" name="223" href="#223">223</a>       <em class="jxr_comment">// in the row plus the DONE on the end.</em>
+<a class="jxr_linenumber" name="224" href="#224">224</a>       Assert.assertEquals(6, scanner.count.get());
+<a class="jxr_linenumber" name="225" href="#225">225</a>       <em class="jxr_comment">// For a full row Get, there should be no opportunity for scanner optimization.</em>
+<a class="jxr_linenumber" name="226" href="#226">226</a>       Assert.assertEquals(0, scanner.optimization.get());
+<a class="jxr_linenumber" name="227" href="#227">227</a>     } <strong class="jxr_keyword">finally</strong> {
+<a class="jxr_linenumber" name="228" href="#228">228</a>       scanner.close();
+<a class="jxr_linenumber" name="229" href="#229">229</a>     }
+<a class="jxr_linenumber" name="230" href="#230">230</a>   }
+<a class="jxr_linenumber" name="231" href="#231">231</a> 
+<a class="jxr_linenumber" name="232" href="#232">232</a>   <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="233" href="#233">233</a> <em class="jxr_javadoccomment">   * Test optimize in StoreScanner. Test that we skip to the next 'block' when we it makes sense</em>
+<a class="jxr_linenumber" name="234" href="#234">234</a> <em class="jxr_javadoccomment">   * reading the block 'index'.</em>
+<a class="jxr_linenumber" name="235" href="#235">235</a> <em class="jxr_javadoccomment">   * @throws IOException</em>
+<a class="jxr_linenumber" name="236" href="#236">236</a> <em class="jxr_javadoccomment">   */</em>
+<a class="jxr_linenumber" name="237" href="#237">237</a>   @Test
+<a class="jxr_linenumber" name="238" href="#238">238</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testOptimize() <strong class="jxr_keyword">throws</strong> IOException {
+<a class="jxr_linenumber" name="239" href="#239">239</a>     Scan scan = <strong class="jxr_keyword">new</strong> Scan();
+<a class="jxr_linenumber" name="240" href="#240">240</a>     <em class="jxr_comment">// A scan that just gets the first qualifier on each row of the CELL_GRID</em>
+<a class="jxr_linenumber" name="241" href="#241">241</a>     scan.addColumn(CF, ONE);
+<a class="jxr_linenumber" name="242" href="#242">242</a>     <a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html">CellGridStoreScanner</a> scanner = <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html">CellGridStoreScanner</a>(scan, <strong class="jxr_keyword">this</strong>.scanInfo, <strong class="jxr_keyword">this</strong>.scanType);
+<a class="jxr_linenumber" name="243" href="#243">243</a>     <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="244" href="#244">244</a>       List&lt;Cell&gt; results = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
+<a class="jxr_linenumber" name="245" href="#245">245</a>       <strong class="jxr_keyword">while</strong> (scanner.next(results)) {
+<a class="jxr_linenumber" name="246" href="#246">246</a>         <strong class="jxr_keyword">continue</strong>;
+<a class="jxr_linenumber" name="247" href="#247">247</a>       }
+<a class="jxr_linenumber" name="248" href="#248">248</a>       <em class="jxr_comment">// Should be four results of column 1 (though there are 5 rows in the CELL_GRID -- the</em>
+<a class="jxr_linenumber" name="249" href="#249">249</a>       <em class="jxr_comment">// TWO_POINT_TWO row does not have a a column ONE.</em>
+<a class="jxr_linenumber" name="250" href="#250">250</a>       Assert.assertEquals(4, results.size());
+<a class="jxr_linenumber" name="251" href="#251">251</a>       <strong class="jxr_keyword">for</strong> (Cell cell: results) {
+<a class="jxr_linenumber" name="252" href="#252">252</a>         assertTrue(Bytes.equals(ONE, 0, ONE.length,
+<a class="jxr_linenumber" name="253" href="#253">253</a>             cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()));
+<a class="jxr_linenumber" name="254" href="#254">254</a>       }
+<a class="jxr_linenumber" name="255" href="#255">255</a>       Assert.assertTrue(<span class="jxr_string">"Optimize should do some optimizations"</span>, scanner.optimization.get() &gt; 0);
+<a class="jxr_linenumber" name="256" href="#256">256</a>     } <strong class="jxr_keyword">finally</strong> {
+<a class="jxr_linenumber" name="257" href="#257">257</a>       scanner.close();
+<a class="jxr_linenumber" name="258" href="#258">258</a>     }
+<a class="jxr_linenumber" name="259" href="#259">259</a>   }
+<a class="jxr_linenumber" name="260" href="#260">260</a> 
+<a class="jxr_linenumber" name="261" href="#261">261</a>   <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="262" href="#262">262</a> <em class="jxr_javadoccomment">   * Ensure the optimize Scan method in StoreScanner does not get in the way of a Get doing minimum</em>
+<a class="jxr_linenumber" name="263" href="#263">263</a> <em class="jxr_javadoccomment">   * work... seeking to start of block and then SKIPPING until we find the wanted Cell.</em>
+<a class="jxr_linenumber" name="264" href="#264">264</a> <em class="jxr_javadoccomment">   * This 'simple' scenario mimics case of all Cells fitting inside a single HFileBlock.</em>
+<a class="jxr_linenumber" name="265" href="#265">265</a> <em class="jxr_javadoccomment">   * See HBASE-15392. This test is a little cryptic. Takes a bit of staring to figure what it up to.</em>
+<a class="jxr_linenumber" name="266" href="#266">266</a> <em class="jxr_javadoccomment">   * @throws IOException</em>
+<a class="jxr_linenumber" name="267" href="#267">267</a> <em class="jxr_javadoccomment">   */</em>
+<a class="jxr_linenumber" name="268" href="#268">268</a>   @Test
+<a class="jxr_linenumber" name="269" href="#269">269</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testOptimizeAndGet() <strong class="jxr_keyword">throws</strong> IOException {
+<a class="jxr_linenumber" name="270" href="#270">270</a>     <em class="jxr_comment">// First test a Get of two columns in the row R2. Every Get is a Scan. Get columns named</em>
+<a class="jxr_linenumber" name="271" href="#271">271</a>     <em class="jxr_comment">// R2 and R3.</em>
+<a class="jxr_linenumber" name="272" href="#272">272</a>     Get get = <strong class="jxr_keyword">new</strong> Get(TWO);
+<a class="jxr_linenumber" name="273" href="#273">273</a>     get.addColumn(CF, TWO);
+<a class="jxr_linenumber" name="274" href="#274">274</a>     get.addColumn(CF, THREE);
+<a class="jxr_linenumber" name="275" href="#275">275</a>     Scan scan = <strong class="jxr_keyword">new</strong> Scan(get);
+<a class="jxr_linenumber" name="276" href="#276">276</a>     <a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html">CellGridStoreScanner</a> scanner = <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html">CellGridStoreScanner</a>(scan, <strong class="jxr_keyword">this</strong>.scanInfo, <strong class="jxr_keyword">this</strong>.scanType);
+<a class="jxr_linenumber" name="277" href="#277">277</a>     <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="278" href="#278">278</a>       List&lt;Cell&gt; results = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
+<a class="jxr_linenumber" name="279" href="#279">279</a>       <em class="jxr_comment">// For a Get there should be no more next's after the first call.</em>
+<a class="jxr_linenumber" name="280" href="#280">280</a>       Assert.assertEquals(false, scanner.next(results));
+<a class="jxr_linenumber" name="281" href="#281">281</a>       <em class="jxr_comment">// Should be one result only.</em>
+<a class="jxr_linenumber" name="282" href="#282">282</a>       Assert.assertEquals(2, results.size());
+<a class="jxr_linenumber" name="283" href="#283">283</a>       <em class="jxr_comment">// And we should have gone through optimize twice only.</em>
+<a class="jxr_linenumber" name="284" href="#284">284</a>       Assert.assertEquals(<span class="jxr_string">"First qcode is SEEK_NEXT_COL and second INCLUDE_AND_SEEK_NEXT_ROW"</span>,
+<a class="jxr_linenumber" name="285" href="#285">285</a>         3, scanner.count.get());
+<a class="jxr_linenumber" name="286" href="#286">286</a>     } <strong class="jxr_keyword">finally</strong> {
+<a class="jxr_linenumber" name="287" href="#287">287</a>       scanner.close();
+<a class="jxr_linenumber" name="288" href="#288">288</a>     }
+<a class="jxr_linenumber" name="289" href="#289">289</a>   }
+<a class="jxr_linenumber" name="290" href="#290">290</a> 
+<a class="jxr_linenumber" name="291" href="#291">291</a>   <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="292" href="#292">292</a> <em class="jxr_javadoccomment">   * Ensure that optimize does not cause the Get to do more seeking than required. Optimize</em>
+<a class="jxr_linenumber" name="293" href="#293">293</a> <em class="jxr_javadoccomment">   * (see HBASE-15392) was causing us to seek all Cells in a block when a Get Scan if the next block</em>
+<a class="jxr_linenumber" name="294" href="#294">294</a> <em class="jxr_javadoccomment">   * index/start key was a different row to the current one. A bug. We'd call next too often</em>
+<a class="jxr_linenumber" name="295" href="#295">295</a> <em class="jxr_javadoccomment">   * because we had to exhaust all Cells in the current row making us load the next block just to</em>
+<a class="jxr_linenumber" name="296" href="#296">296</a> <em class="jxr_javadoccomment">   * discard what we read there. This test is a little cryptic. Takes a bit of staring to figure</em>
+<a class="jxr_linenumber" name="297" href="#297">297</a> <em class="jxr_javadoccomment">   * what it up to.</em>
+<a class="jxr_linenumber" name=

<TRUNCATED>

[26/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html
index 1cc5963..e805311 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html
@@ -71,8 +71,8 @@
 <span class="sourceLineNo">063</span>  @Override<a name="line.63"></a>
 <span class="sourceLineNo">064</span>  public void cacheBlock(BlockCacheKey cacheKey, Cacheable buf, boolean inMemory,<a name="line.64"></a>
 <span class="sourceLineNo">065</span>      final boolean cacheDataInL1) {<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    boolean isMetaBlock = buf.getBlockType().getCategory() != BlockCategory.DATA;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    if (isMetaBlock || cacheDataInL1) {<a name="line.67"></a>
+<span class="sourceLineNo">066</span>    boolean metaBlock = buf.getBlockType().getCategory() != BlockCategory.DATA;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    if (metaBlock || cacheDataInL1) {<a name="line.67"></a>
 <span class="sourceLineNo">068</span>      lruCache.cacheBlock(cacheKey, buf, inMemory, cacheDataInL1);<a name="line.68"></a>
 <span class="sourceLineNo">069</span>    } else {<a name="line.69"></a>
 <span class="sourceLineNo">070</span>      l2Cache.cacheBlock(cacheKey, buf, inMemory, false);<a name="line.70"></a>
@@ -89,190 +89,187 @@
 <span class="sourceLineNo">081</span>      boolean repeat, boolean updateCacheMetrics) {<a name="line.81"></a>
 <span class="sourceLineNo">082</span>    // TODO: is there a hole here, or just awkwardness since in the lruCache getBlock<a name="line.82"></a>
 <span class="sourceLineNo">083</span>    // we end up calling l2Cache.getBlock.<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    if (lruCache.containsBlock(cacheKey)) {<a name="line.84"></a>
-<span class="sourceLineNo">085</span>      return lruCache.getBlock(cacheKey, caching, repeat, updateCacheMetrics);<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    }<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    Cacheable result = l2Cache.getBlock(cacheKey, caching, repeat, updateCacheMetrics);<a name="line.87"></a>
+<span class="sourceLineNo">084</span>    return lruCache.containsBlock(cacheKey)?<a name="line.84"></a>
+<span class="sourceLineNo">085</span>        lruCache.getBlock(cacheKey, caching, repeat, updateCacheMetrics):<a name="line.85"></a>
+<span class="sourceLineNo">086</span>        l2Cache.getBlock(cacheKey, caching, repeat, updateCacheMetrics);<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  }<a name="line.87"></a>
 <span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>    return result;<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">092</span>  @Override<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  public boolean evictBlock(BlockCacheKey cacheKey) {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    return lruCache.evictBlock(cacheKey) || l2Cache.evictBlock(cacheKey);<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>  @Override<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    return lruCache.evictBlocksByHfileName(hfileName)<a name="line.99"></a>
-<span class="sourceLineNo">100</span>        + l2Cache.evictBlocksByHfileName(hfileName);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  }<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>  @Override<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  public CacheStats getStats() {<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    return this.combinedCacheStats;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Override<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public void shutdown() {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    lruCache.shutdown();<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    l2Cache.shutdown();<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  @Override<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  public long size() {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    return lruCache.size() + l2Cache.size();<a name="line.116"></a>
-<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>  @Override<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public long getFreeSize() {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    return lruCache.getFreeSize() + l2Cache.getFreeSize();<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>  @Override<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  public long getCurrentSize() {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    return lruCache.getCurrentSize() + l2Cache.getCurrentSize();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  @Override<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  public long getBlockCount() {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    return lruCache.getBlockCount() + l2Cache.getBlockCount();<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>  public static class CombinedCacheStats extends CacheStats {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    private final CacheStats lruCacheStats;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    private final CacheStats bucketCacheStats;<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>    CombinedCacheStats(CacheStats lbcStats, CacheStats fcStats) {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      super("CombinedBlockCache");<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      this.lruCacheStats = lbcStats;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      this.bucketCacheStats = fcStats;<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>    @Override<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    public long getRequestCount() {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      return lruCacheStats.getRequestCount()<a name="line.146"></a>
-<span class="sourceLineNo">147</span>          + bucketCacheStats.getRequestCount();<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>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public long getRequestCachingCount() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      return lruCacheStats.getRequestCachingCount()<a name="line.152"></a>
-<span class="sourceLineNo">153</span>          + bucketCacheStats.getRequestCachingCount();<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>    @Override<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    public long getMissCount() {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      return lruCacheStats.getMissCount() + bucketCacheStats.getMissCount();<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>    @Override<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    public long getPrimaryMissCount() {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      return lruCacheStats.getPrimaryMissCount() + bucketCacheStats.getPrimaryMissCount();<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>    @Override<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    public long getMissCachingCount() {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      return lruCacheStats.getMissCachingCount()<a name="line.168"></a>
-<span class="sourceLineNo">169</span>          + bucketCacheStats.getMissCachingCount();<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>    @Override<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    public long getHitCount() {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      return lruCacheStats.getHitCount() + bucketCacheStats.getHitCount();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>    @Override<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    public long getPrimaryHitCount() {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      return lruCacheStats.getPrimaryHitCount() + bucketCacheStats.getPrimaryHitCount();<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    @Override<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    public long getHitCachingCount() {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      return lruCacheStats.getHitCachingCount()<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          + bucketCacheStats.getHitCachingCount();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    @Override<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    public long getEvictionCount() {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      return lruCacheStats.getEvictionCount()<a name="line.189"></a>
-<span class="sourceLineNo">190</span>          + bucketCacheStats.getEvictionCount();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>    @Override<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    public long getEvictedCount() {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      return lruCacheStats.getEvictedCount()<a name="line.195"></a>
-<span class="sourceLineNo">196</span>          + bucketCacheStats.getEvictedCount();<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>    @Override<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    public long getPrimaryEvictedCount() {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      return lruCacheStats.getPrimaryEvictedCount()<a name="line.201"></a>
-<span class="sourceLineNo">202</span>          + bucketCacheStats.getPrimaryEvictedCount();<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>    @Override<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    public void rollMetricsPeriod() {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      lruCacheStats.rollMetricsPeriod();<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      bucketCacheStats.rollMetricsPeriod();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    <a name="line.210"></a>
-<span class="sourceLineNo">211</span>    @Override<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    public long getFailedInserts() {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      return lruCacheStats.getFailedInserts() + bucketCacheStats.getFailedInserts();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    }<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>    @Override<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public long getSumHitCountsPastNPeriods() {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      return lruCacheStats.getSumHitCountsPastNPeriods()<a name="line.218"></a>
-<span class="sourceLineNo">219</span>          + bucketCacheStats.getSumHitCountsPastNPeriods();<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>    @Override<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public long getSumRequestCountsPastNPeriods() {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      return lruCacheStats.getSumRequestCountsPastNPeriods()<a name="line.224"></a>
-<span class="sourceLineNo">225</span>          + bucketCacheStats.getSumRequestCountsPastNPeriods();<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    <a name="line.227"></a>
-<span class="sourceLineNo">228</span>    @Override<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    public long getSumHitCachingCountsPastNPeriods() {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      return lruCacheStats.getSumHitCachingCountsPastNPeriods()<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          + bucketCacheStats.getSumHitCachingCountsPastNPeriods();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    @Override<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    public long getSumRequestCachingCountsPastNPeriods() {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      return lruCacheStats.getSumRequestCachingCountsPastNPeriods()<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          + bucketCacheStats.getSumRequestCachingCountsPastNPeriods();<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>  @Override<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  public Iterator&lt;CachedBlock&gt; iterator() {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    return new BlockCachesIterator(getBlockCaches());<a name="line.243"></a>
-<span class="sourceLineNo">244</span>  }<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Override<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  public BlockCache[] getBlockCaches() {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return new BlockCache [] {this.lruCache, this.l2Cache};<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>  @Override<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  public void setMaxSize(long size) {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    this.lruCache.setMaxSize(size);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>  @Override<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  public void returnBlock(BlockCacheKey cacheKey, Cacheable block) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    // A noop<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    this.lruCache.returnBlock(cacheKey, block);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    this.l2Cache.returnBlock(cacheKey, block);<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>  @VisibleForTesting<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public int getRefCount(BlockCacheKey cacheKey) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    return ((BucketCache) this.l2Cache).getRefCount(cacheKey);<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">089</span>  @Override<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  public boolean evictBlock(BlockCacheKey cacheKey) {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    return lruCache.evictBlock(cacheKey) || l2Cache.evictBlock(cacheKey);<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>  @Override<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    return lruCache.evictBlocksByHfileName(hfileName)<a name="line.96"></a>
+<span class="sourceLineNo">097</span>        + l2Cache.evictBlocksByHfileName(hfileName);<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>  @Override<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  public CacheStats getStats() {<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    return this.combinedCacheStats;<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>  @Override<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  public void shutdown() {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    lruCache.shutdown();<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    l2Cache.shutdown();<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  @Override<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public long size() {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    return lruCache.size() + l2Cache.size();<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  }<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  @Override<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  public long getFreeSize() {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    return lruCache.getFreeSize() + l2Cache.getFreeSize();<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>  @Override<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  public long getCurrentSize() {<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    return lruCache.getCurrentSize() + l2Cache.getCurrentSize();<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>  @Override<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public long getBlockCount() {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    return lruCache.getBlockCount() + l2Cache.getBlockCount();<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 class CombinedCacheStats extends CacheStats {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    private final CacheStats lruCacheStats;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    private final CacheStats bucketCacheStats;<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>    CombinedCacheStats(CacheStats lbcStats, CacheStats fcStats) {<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      super("CombinedBlockCache");<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      this.lruCacheStats = lbcStats;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      this.bucketCacheStats = fcStats;<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 long getRequestCount() {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      return lruCacheStats.getRequestCount()<a name="line.143"></a>
+<span class="sourceLineNo">144</span>          + bucketCacheStats.getRequestCount();<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>    @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    public long getRequestCachingCount() {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return lruCacheStats.getRequestCachingCount()<a name="line.149"></a>
+<span class="sourceLineNo">150</span>          + bucketCacheStats.getRequestCachingCount();<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>    @Override<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    public long getMissCount() {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      return lruCacheStats.getMissCount() + bucketCacheStats.getMissCount();<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 long getPrimaryMissCount() {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      return lruCacheStats.getPrimaryMissCount() + bucketCacheStats.getPrimaryMissCount();<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
+<span class="sourceLineNo">162</span><a name="line.162"></a>
+<span class="sourceLineNo">163</span>    @Override<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    public long getMissCachingCount() {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      return lruCacheStats.getMissCachingCount()<a name="line.165"></a>
+<span class="sourceLineNo">166</span>          + bucketCacheStats.getMissCachingCount();<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>    @Override<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    public long getHitCount() {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      return lruCacheStats.getHitCount() + bucketCacheStats.getHitCount();<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    }<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>    @Override<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    public long getPrimaryHitCount() {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      return lruCacheStats.getPrimaryHitCount() + bucketCacheStats.getPrimaryHitCount();<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    public long getHitCachingCount() {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      return lruCacheStats.getHitCachingCount()<a name="line.180"></a>
+<span class="sourceLineNo">181</span>          + bucketCacheStats.getHitCachingCount();<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    }<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 long getEvictionCount() {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      return lruCacheStats.getEvictionCount()<a name="line.186"></a>
+<span class="sourceLineNo">187</span>          + bucketCacheStats.getEvictionCount();<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>    @Override<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    public long getEvictedCount() {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      return lruCacheStats.getEvictedCount()<a name="line.192"></a>
+<span class="sourceLineNo">193</span>          + bucketCacheStats.getEvictedCount();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    @Override<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public long getPrimaryEvictedCount() {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      return lruCacheStats.getPrimaryEvictedCount()<a name="line.198"></a>
+<span class="sourceLineNo">199</span>          + bucketCacheStats.getPrimaryEvictedCount();<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>    @Override<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    public void rollMetricsPeriod() {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      lruCacheStats.rollMetricsPeriod();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      bucketCacheStats.rollMetricsPeriod();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    <a name="line.207"></a>
+<span class="sourceLineNo">208</span>    @Override<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    public long getFailedInserts() {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      return lruCacheStats.getFailedInserts() + bucketCacheStats.getFailedInserts();<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>    @Override<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    public long getSumHitCountsPastNPeriods() {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      return lruCacheStats.getSumHitCountsPastNPeriods()<a name="line.215"></a>
+<span class="sourceLineNo">216</span>          + bucketCacheStats.getSumHitCountsPastNPeriods();<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    }<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    <a name="line.218"></a>
+<span class="sourceLineNo">219</span>    @Override<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    public long getSumRequestCountsPastNPeriods() {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      return lruCacheStats.getSumRequestCountsPastNPeriods()<a name="line.221"></a>
+<span class="sourceLineNo">222</span>          + bucketCacheStats.getSumRequestCountsPastNPeriods();<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    <a name="line.224"></a>
+<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    public long getSumHitCachingCountsPastNPeriods() {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      return lruCacheStats.getSumHitCachingCountsPastNPeriods()<a name="line.227"></a>
+<span class="sourceLineNo">228</span>          + bucketCacheStats.getSumHitCachingCountsPastNPeriods();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    public long getSumRequestCachingCountsPastNPeriods() {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return lruCacheStats.getSumRequestCachingCountsPastNPeriods()<a name="line.233"></a>
+<span class="sourceLineNo">234</span>          + bucketCacheStats.getSumRequestCachingCountsPastNPeriods();<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>  @Override<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  public Iterator&lt;CachedBlock&gt; iterator() {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    return new BlockCachesIterator(getBlockCaches());<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>  @Override<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public BlockCache[] getBlockCaches() {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    return new BlockCache [] {this.lruCache, this.l2Cache};<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  }<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  @Override<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  public void setMaxSize(long size) {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    this.lruCache.setMaxSize(size);<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>  @Override<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  public void returnBlock(BlockCacheKey cacheKey, Cacheable block) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    // A noop<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    this.lruCache.returnBlock(cacheKey, block);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    this.l2Cache.returnBlock(cacheKey, block);<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>  @VisibleForTesting<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  public int getRefCount(BlockCacheKey cacheKey) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    return ((BucketCache) this.l2Cache).getRefCount(cacheKey);<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileWriterImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileWriterImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileWriterImpl.html
index 1a63d02..3830603 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileWriterImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/HFileWriterImpl.html
@@ -424,7 +424,7 @@
 <span class="sourceLineNo">416</span>    // No opportunity for optimization. Just return right key.<a name="line.416"></a>
 <span class="sourceLineNo">417</span>    return right;<a name="line.417"></a>
 <span class="sourceLineNo">418</span>  }<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  <a name="line.419"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
 <span class="sourceLineNo">420</span>  /**<a name="line.420"></a>
 <span class="sourceLineNo">421</span>   * @param leftArray<a name="line.421"></a>
 <span class="sourceLineNo">422</span>   * @param leftOffset<a name="line.422"></a>


[36/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.ReplicaResultState.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.ReplicaResultState.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.ReplicaResultState.html
index ed7bc7f..e65df71 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.ReplicaResultState.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.ReplicaResultState.html
@@ -1198,681 +1198,699 @@
 <span class="sourceLineNo">1190</span>        byte[] row = e.getValue().iterator().next().getAction().getRow();<a name="line.1190"></a>
 <span class="sourceLineNo">1191</span>        // Do not use the exception for updating cache because it might be coming from<a name="line.1191"></a>
 <span class="sourceLineNo">1192</span>        // any of the regions in the MultiAction.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        if (tableName != null) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>          connection.updateCachedLocations(tableName, regionName, row,<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>              ClientExceptionsUtil.isMetaClearingException(t) ? null : t, server);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>        for (Action&lt;Row&gt; action : e.getValue()) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          Retry retry = manageError(<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>              action.getOriginalIndex(), action.getAction(), canRetry, t, server);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (retry == Retry.YES) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            toReplay.add(action);<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            ++stopped;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>          } else {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            ++failed;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>          }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>        }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>      }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      if (toReplay.isEmpty()) {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>        logNoResubmit(server, numAttempt, rsActions.size(), t, failed, stopped);<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>      } else {<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        resubmit(server, toReplay, numAttempt, rsActions.size(), t);<a name="line.1213"></a>
+<span class="sourceLineNo">1193</span>        try {<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          if (tableName != null) {<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>            connection.updateCachedLocations(tableName, regionName, row,<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>              ClientExceptionsUtil.isMetaClearingException(t) ? null : t, server);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>          }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        } catch (Throwable ex) {<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>          // That should never happen, but if it did, we want to make sure<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          // we still process errors<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>          LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        for (Action&lt;Row&gt; action : e.getValue()) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          Retry retry = manageError(<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              action.getOriginalIndex(), action.getAction(), canRetry, t, server);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>          if (retry == Retry.YES) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>            toReplay.add(action);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>            ++stopped;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>            ++failed;<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
 <span class="sourceLineNo">1214</span>      }<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>     * Log as much info as possible, and, if there is something to replay,<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     * submit it again after a back off sleep.<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>     */<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    private void resubmit(ServerName oldServer, List&lt;Action&lt;Row&gt;&gt; toReplay,<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        int numAttempt, int failureCount, Throwable throwable) {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      // We have something to replay. We're going to sleep a little before.<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // We have two contradicting needs here:<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      //  1) We want to get the new location after having slept, as it may change.<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      //  2) We want to take into account the location when calculating the sleep time.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      //  3) If all this is just because the response needed to be chunked try again FAST.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      // It should be possible to have some heuristics to take the right decision. Short term,<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>      //  we go for one.<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      boolean retryImmediately = throwable instanceof RetryImmediatelyException;<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      int nextAttemptNumber = retryImmediately ? numAttempt : numAttempt + 1;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      long backOffTime = retryImmediately ? 0 :<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          errorsByServer.calculateBackoffTime(oldServer, pause);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>      if (numAttempt &gt; startLogErrorsCnt) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        // We use this value to have some logs when we have multiple failures, but not too many<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        //  logs, as errors are to be expected when a region moves, splits and so on<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        LOG.info(createLog(numAttempt, failureCount, toReplay.size(),<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>            oldServer, throwable, backOffTime, true, null, -1, -1));<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      try {<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>        if (backOffTime &gt; 0) {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>          Thread.sleep(backOffTime);<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>        }<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      } catch (InterruptedException e) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>        LOG.warn("#" + id + ", not sent: " + toReplay.size() + " operations, " + oldServer, e);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>        Thread.currentThread().interrupt();<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        return;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>      groupAndSendMultiAction(toReplay, nextAttemptNumber);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    private void logNoResubmit(ServerName oldServer, int numAttempt,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        int failureCount, Throwable throwable, int failed, int stopped) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      if (failureCount != 0 || numAttempt &gt; startLogErrorsCnt + 1) {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>        String timeStr = new Date(errorsByServer.getStartTrackingTime()).toString();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>        String logMessage = createLog(numAttempt, failureCount, 0, oldServer,<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>            throwable, -1, false, timeStr, failed, stopped);<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>        if (failed != 0) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>          // Only log final failures as warning<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>          LOG.warn(logMessage);<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        } else {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>          LOG.info(logMessage);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>        }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    }<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    /**<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>     * Called when we receive the result of a server query.<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>     *<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>     * @param multiAction    - the multiAction we sent<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>     * @param server       - the location. It's used as a server name.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>     * @param responses      - the response, if any<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>     * @param numAttempt     - the attempt<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>     */<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    private void receiveMultiAction(MultiAction&lt;Row&gt; multiAction,<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>        ServerName server, MultiResponse responses, int numAttempt) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>       assert responses != null;<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span><a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      // Success or partial success<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      // Analyze detailed results. We can still have individual failures to be redo.<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      // two specific throwables are managed:<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      //  - DoNotRetryIOException: we continue to retry for other actions<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      //  - RegionMovedException: we update the cache with the new region location<a name="line.1286"></a>
+<span class="sourceLineNo">1215</span><a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      if (toReplay.isEmpty()) {<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>        logNoResubmit(server, numAttempt, rsActions.size(), t, failed, stopped);<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>        resubmit(server, toReplay, numAttempt, rsActions.size(), t);<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    }<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>     * Log as much info as possible, and, if there is something to replay,<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>     * submit it again after a back off sleep.<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    private void resubmit(ServerName oldServer, List&lt;Action&lt;Row&gt;&gt; toReplay,<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        int numAttempt, int failureCount, Throwable throwable) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>      // We have something to replay. We're going to sleep a little before.<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      // We have two contradicting needs here:<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>      //  1) We want to get the new location after having slept, as it may change.<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>      //  2) We want to take into account the location when calculating the sleep time.<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      //  3) If all this is just because the response needed to be chunked try again FAST.<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      // It should be possible to have some heuristics to take the right decision. Short term,<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      //  we go for one.<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      boolean retryImmediately = throwable instanceof RetryImmediatelyException;<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>      int nextAttemptNumber = retryImmediately ? numAttempt : numAttempt + 1;<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      long backOffTime = retryImmediately ? 0 :<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          errorsByServer.calculateBackoffTime(oldServer, pause);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      if (numAttempt &gt; startLogErrorsCnt) {<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>        // We use this value to have some logs when we have multiple failures, but not too many<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>        //  logs, as errors are to be expected when a region moves, splits and so on<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>        LOG.info(createLog(numAttempt, failureCount, toReplay.size(),<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>            oldServer, throwable, backOffTime, true, null, -1, -1));<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      }<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span><a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      try {<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>        if (backOffTime &gt; 0) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>          Thread.sleep(backOffTime);<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>        }<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      } catch (InterruptedException e) {<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>        LOG.warn("#" + id + ", not sent: " + toReplay.size() + " operations, " + oldServer, e);<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>        Thread.currentThread().interrupt();<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>        return;<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span><a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      groupAndSendMultiAction(toReplay, nextAttemptNumber);<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    private void logNoResubmit(ServerName oldServer, int numAttempt,<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        int failureCount, Throwable throwable, int failed, int stopped) {<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>      if (failureCount != 0 || numAttempt &gt; startLogErrorsCnt + 1) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>        String timeStr = new Date(errorsByServer.getStartTrackingTime()).toString();<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>        String logMessage = createLog(numAttempt, failureCount, 0, oldServer,<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>            throwable, -1, false, timeStr, failed, stopped);<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>        if (failed != 0) {<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          // Only log final failures as warning<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          LOG.warn(logMessage);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>        } else {<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>          LOG.info(logMessage);<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>        }<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    }<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span><a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>    /**<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>     * Called when we receive the result of a server query.<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>     *<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>     * @param multiAction    - the multiAction we sent<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>     * @param server       - the location. It's used as a server name.<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>     * @param responses      - the response, if any<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>     * @param numAttempt     - the attempt<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>     */<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    private void receiveMultiAction(MultiAction&lt;Row&gt; multiAction,<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        ServerName server, MultiResponse responses, int numAttempt) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>       assert responses != null;<a name="line.1286"></a>
 <span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      List&lt;Action&lt;Row&gt;&gt; toReplay = new ArrayList&lt;Action&lt;Row&gt;&gt;();<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      Throwable throwable = null;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      int failureCount = 0;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      boolean canRetry = true;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span><a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      Map&lt;byte[], MultiResponse.RegionResult&gt; results = responses.getResults();<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      updateStats(server, results);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      int failed = 0, stopped = 0;<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      // Go by original action.<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      for (Map.Entry&lt;byte[], List&lt;Action&lt;Row&gt;&gt;&gt; regionEntry : multiAction.actions.entrySet()) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        byte[] regionName = regionEntry.getKey();<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>        Map&lt;Integer, Object&gt; regionResults = results.get(regionName) == null<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>            ?  null : results.get(regionName).result;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        if (regionResults == null) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>          if (!responses.getExceptions().containsKey(regionName)) {<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>            LOG.error("Server sent us neither results nor exceptions for "<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>                + Bytes.toStringBinary(regionName));<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>            responses.getExceptions().put(regionName, new RuntimeException("Invalid response"));<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>          }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>          continue;<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>        }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>        boolean regionFailureRegistered = false;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>        for (Action&lt;Row&gt; sentAction : regionEntry.getValue()) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>          Object result = regionResults.get(sentAction.getOriginalIndex());<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>          // Failure: retry if it's make sense else update the errors lists<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>          if (result == null || result instanceof Throwable) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>            Row row = sentAction.getAction();<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>            throwable = ClientExceptionsUtil.findException(result);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>            // Register corresponding failures once per server/once per region.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>            if (!regionFailureRegistered) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>              regionFailureRegistered = true;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>              connection.updateCachedLocations(<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>                  tableName, regionName, row.getRow(), result, server);<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>            }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>            if (failureCount == 0) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>              errorsByServer.reportServerError(server);<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>              // We determine canRetry only once for all calls, after reporting server failure.<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>              canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            }<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            ++failureCount;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>            Retry retry = manageError(sentAction.getOriginalIndex(), row,<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>                canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, (Throwable) result, server);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>            if (retry == Retry.YES) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>              toReplay.add(sentAction);<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>            } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>              ++stopped;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>            } else {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>              ++failed;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>            }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>          } else {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>            if (callback != null) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>              try {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>                //noinspection unchecked<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>                // TODO: would callback expect a replica region name if it gets one?<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>                this.callback.update(regionName, sentAction.getAction().getRow(), (CResult) result);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>              } catch (Throwable t) {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>                LOG.error("User callback threw an exception for "<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>                    + Bytes.toStringBinary(regionName) + ", ignoring", t);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>              }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>            }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>            setResult(sentAction, result);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>          }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>        }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      }<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span><a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      // The failures global to a region. We will use for multiAction we sent previously to find the<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      //   actions to replay.<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      for (Map.Entry&lt;byte[], Throwable&gt; throwableEntry : responses.getExceptions().entrySet()) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>        throwable = throwableEntry.getValue();<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>        byte[] region = throwableEntry.getKey();<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        List&lt;Action&lt;Row&gt;&gt; actions = multiAction.actions.get(region);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>        if (actions == null || actions.isEmpty()) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          throw new IllegalStateException("Wrong response for the region: " +<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>              HRegionInfo.encodeRegionName(region));<a name="line.1362"></a>
+<span class="sourceLineNo">1288</span>      // Success or partial success<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>      // Analyze detailed results. We can still have individual failures to be redo.<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      // two specific throwables are managed:<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      //  - DoNotRetryIOException: we continue to retry for other actions<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      //  - RegionMovedException: we update the cache with the new region location<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span><a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      List&lt;Action&lt;Row&gt;&gt; toReplay = new ArrayList&lt;Action&lt;Row&gt;&gt;();<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      Throwable throwable = null;<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      int failureCount = 0;<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      boolean canRetry = true;<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span><a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      Map&lt;byte[], MultiResponse.RegionResult&gt; results = responses.getResults();<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      updateStats(server, results);<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span><a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      int failed = 0, stopped = 0;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>      // Go by original action.<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>      for (Map.Entry&lt;byte[], List&lt;Action&lt;Row&gt;&gt;&gt; regionEntry : multiAction.actions.entrySet()) {<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>        byte[] regionName = regionEntry.getKey();<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>        Map&lt;Integer, Object&gt; regionResults = results.get(regionName) == null<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>            ?  null : results.get(regionName).result;<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>        if (regionResults == null) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>          if (!responses.getExceptions().containsKey(regionName)) {<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>            LOG.error("Server sent us neither results nor exceptions for "<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>                + Bytes.toStringBinary(regionName));<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>            responses.getExceptions().put(regionName, new RuntimeException("Invalid response"));<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>          }<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>          continue;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>        }<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        boolean regionFailureRegistered = false;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        for (Action&lt;Row&gt; sentAction : regionEntry.getValue()) {<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>          Object result = regionResults.get(sentAction.getOriginalIndex());<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>          // Failure: retry if it's make sense else update the errors lists<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>          if (result == null || result instanceof Throwable) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>            Row row = sentAction.getAction();<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>            throwable = ClientExceptionsUtil.findException(result);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>            // Register corresponding failures once per server/once per region.<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>            if (!regionFailureRegistered) {<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>              regionFailureRegistered = true;<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>              try {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>                connection.updateCachedLocations(<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>                  tableName, regionName, row.getRow(), result, server);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>              } catch (Throwable ex) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>                // That should never happen, but if it did, we want to make sure<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>                // we still process errors<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>                LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>              }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>            }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>            if (failureCount == 0) {<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>              errorsByServer.reportServerError(server);<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>              // We determine canRetry only once for all calls, after reporting server failure.<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>              canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>            }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>            ++failureCount;<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>            Retry retry = manageError(sentAction.getOriginalIndex(), row,<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>                canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, (Throwable) result, server);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>            if (retry == Retry.YES) {<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>              toReplay.add(sentAction);<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>            } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>              ++stopped;<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>            } else {<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>              ++failed;<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>            }<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>          } else {<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>            if (callback != null) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>              try {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>                //noinspection unchecked<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>                // TODO: would callback expect a replica region name if it gets one?<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>                this.callback.update(regionName, sentAction.getAction().getRow(), (CResult) result);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>              } catch (Throwable t) {<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>                LOG.error("User callback threw an exception for "<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>                    + Bytes.toStringBinary(regionName) + ", ignoring", t);<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>            setResult(sentAction, result);<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>          }<a name="line.1362"></a>
 <span class="sourceLineNo">1363</span>        }<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        if (failureCount == 0) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>          errorsByServer.reportServerError(server);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>          canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>        }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        if (null == tableName &amp;&amp; ClientExceptionsUtil.isMetaClearingException(throwable)) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>          // For multi-actions, we don't have a table name, but we want to make sure to clear the<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>          // cache in case there were location-related exceptions. We don't to clear the cache<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>          // for every possible exception that comes through, however.<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>          connection.clearCaches(server);<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        } else {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>          connection.updateCachedLocations(<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>              tableName, region, actions.get(0).getAction().getRow(), throwable, server);<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>        }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        failureCount += actions.size();<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span><a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>        for (Action&lt;Row&gt; action : actions) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>          Row row = action.getAction();<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          Retry retry = manageError(action.getOriginalIndex(), row,<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>              canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, throwable, server);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>          if (retry == Retry.YES) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>            toReplay.add(action);<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>            ++stopped;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>          } else {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>            ++failed;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>          }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        }<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (toReplay.isEmpty()) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        logNoResubmit(server, numAttempt, failureCount, throwable, failed, stopped);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      } else {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>        resubmit(server, toReplay, numAttempt, failureCount, throwable);<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    private String createLog(int numAttempt, int failureCount, int replaySize, ServerName sn,<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        Throwable error, long backOffTime, boolean willRetry, String startTime,<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>        int failed, int stopped) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      StringBuilder sb = new StringBuilder();<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      sb.append("#").append(id).append(", table=").append(tableName).append(", ")<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>        .append("attempt=").append(numAttempt)<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>        .append("/").append(numTries).append(" ");<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span><a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      if (failureCount &gt; 0 || error != null){<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>        sb.append("failed=").append(failureCount).append("ops").append(", last exception: ").<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>            append(error == null ? "null" : error);<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>      } else {<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        sb.append("succeeded");<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      }<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span><a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      sb.append(" on ").append(sn).append(", tracking started ").append(startTime);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span><a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      if (willRetry) {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        sb.append(", retrying after=").append(backOffTime).append("ms").<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>            append(", replay=").append(replaySize).append("ops");<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      } else if (failureCount &gt; 0) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        if (stopped &gt; 0) {<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          sb.append("; not retrying ").append(stopped).append(" due to success from other replica");<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>        }<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        if (failed &gt; 0) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          sb.append("; not retrying ").append(failed).append(" - final failure");<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>        }<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span><a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span><a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      return sb.toString();<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
+<span class="sourceLineNo">1364</span>      }<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span><a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      // The failures global to a region. We will use for multiAction we sent previously to find the<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>      //   actions to replay.<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      for (Map.Entry&lt;byte[], Throwable&gt; throwableEntry : responses.getExceptions().entrySet()) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        throwable = throwableEntry.getValue();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>        byte[] region = throwableEntry.getKey();<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>        List&lt;Action&lt;Row&gt;&gt; actions = multiAction.actions.get(region);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>        if (actions == null || actions.isEmpty()) {<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>          throw new IllegalStateException("Wrong response for the region: " +<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>              HRegionInfo.encodeRegionName(region));<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        }<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span><a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        if (failureCount == 0) {<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>          errorsByServer.reportServerError(server);<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>          canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>        }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>        if (null == tableName &amp;&amp; ClientExceptionsUtil.isMetaClearingException(throwable)) {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>          // For multi-actions, we don't have a table name, but we want to make sure to clear the<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>          // cache in case there were location-related exceptions. We don't to clear the cache<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>          // for every possible exception that comes through, however.<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>          connection.clearCaches(server);<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>        } else {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>          try {<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>            connection.updateCachedLocations(<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>              tableName, region, actions.get(0).getAction().getRow(), throwable, server);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          } catch (Throwable ex) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>            // That should never happen, but if it did, we want to make sure<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            // we still process errors<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>            LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          }<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        failureCount += actions.size();<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span><a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>        for (Action&lt;Row&gt; action : actions) {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>          Row row = action.getAction();<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>          Retry retry = manageError(action.getOriginalIndex(), row,<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>              canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, throwable, server);<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>          if (retry == Retry.YES) {<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>            toReplay.add(action);<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>            ++stopped;<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>          } else {<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>            ++failed;<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>          }<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        }<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      }<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>      if (toReplay.isEmpty()) {<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>        logNoResubmit(server, numAttempt, failureCount, throwable, failed, stopped);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>      } else {<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>        resubmit(server, toReplay, numAttempt, failureCount, throwable);<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>      }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span><a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    private String createLog(int numAttempt, int failureCount, int replaySize, ServerName sn,<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>        Throwable error, long backOffTime, boolean willRetry, String startTime,<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>        int failed, int stopped) {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      StringBuilder sb = new StringBuilder();<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>      sb.append("#").append(id).append(", table=").append(tableName).append(", ")<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>        .append("attempt=").append(numAttempt)<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>        .append("/").append(numTries).append(" ");<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span><a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      if (failureCount &gt; 0 || error != null){<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>        sb.append("failed=").append(failureCount).append("ops").append(", last exception: ").<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>            append(error == null ? "null" : error);<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      } else {<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>        sb.append("succeeded");<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>      }<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>     * Sets the non-error result from a particular action.<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>     * @param action Action (request) that the server responded to.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>     * @param result The result.<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>     */<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    private void setResult(Action&lt;Row&gt; action, Object result) {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      if (result == null) {<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        throw new RuntimeException("Result cannot be null");<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      }<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      ReplicaResultState state = null;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      boolean isStale = !RegionReplicaUtil.isDefaultReplica(action.getReplicaId());<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      int index = action.getOriginalIndex();<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      if (results == null) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        decActionCounter(index);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        return; // Simple case, no replica requests.<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      }<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      state = trySetResultSimple(index, action.getAction(), false, result, null, isStale);<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      if (state == null) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        return; // Simple case, no replica requests.<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      // At this point we know that state is set to replica tracking class.<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>      // It could be that someone else is also looking at it; however, we know there can<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      // only be one state object, and only one thread can set callCount to 0. Other threads<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>      // will either see state with callCount 0 after locking it; or will not see state at all<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      // we will replace it with the result.<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      synchronized (state) {<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>        if (state.callCount == 0) {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>          return; // someone already set the result<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>        }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        state.callCount = 0;<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>      }<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>      synchronized (replicaResultLock) {<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>        if (results[index] != state) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>          throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>        }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        results[index] = result;<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>      }<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span><a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      decActionCounter(index);<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    }<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span><a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>    /**<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>     * Sets the error from a particular action.<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>     * @param index Original action index.<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>     * @param row Original request.<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>     * @param throwable The resulting error.<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>     * @param server The source server.<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>     */<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>    private void setError(int index, Row row, Throwable throwable, ServerName server) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      ReplicaResultState state = null;<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>      if (results == null) {<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>        // Note that we currently cannot have replica requests with null results. So it shouldn't<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>        // happen that multiple replica calls will call dAC for same actions with results == null.<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        // Only one call per action should be present in this case.<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        errors.add(throwable, row, server);<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>        decActionCounter(index);<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>        return; // Simple case, no replica requests.<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>      }<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>      state = trySetResultSimple(index, row, true, throwable, server, false);<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>      if (state == null) {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>        return; // Simple case, no replica requests.<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>      }<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>      BatchErrors target = null; // Error will be added to final errors, or temp replica errors.<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      boolean isActionDone = false;<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>      synchronized (state) {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>        switch (state.callCount) {<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>          case 0: return; // someone already set the result<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>          case 1: { // All calls failed, we are the last error.<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>            target = errors;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>            isActionDone = true;<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>            break;<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>          }<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>          default: {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>            assert state.callCount &gt; 1;<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>            if (state.replicaErrors == null) {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>              state.replicaErrors = new BatchErrors();<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>            }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>            target = state.replicaErrors;<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>            break;<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>        --state.callCount;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      target.add(throwable, row, server);<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>      if (isActionDone) {<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        if (state.replicaErrors != null) { // last call, no need to lock<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>          errors.merge(state.replicaErrors);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>        }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>        // See setResult for explanations.<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>        synchronized (replicaResultLock) {<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>          if (results[index] != state) {<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>            throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>          }<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>          results[index] = throwable;<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>        }<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>        decActionCounter(index);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      }<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    }<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span><a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    /**<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>     * Checks if the action is complete; used on error to prevent needless retries.<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>     * Does not synchronize, assuming element index/field accesses are atomic.<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>     * This is an opportunistic optimization check, doesn't have to be strict.<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>     * @param index Original action index.<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>     * @param row Original request.<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>     */<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    private boolean isActionComplete(int index, Row row) {<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      if (!isReplicaGet(row)) return false;<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      Object resObj = results[index];<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      return (resObj != null) &amp;&amp; (!(resObj instanceof ReplicaResultState)<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>          || ((ReplicaResultState)resObj).callCount == 0);<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>     * Tries to set the result or error for a particular action as if there were no replica calls.<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>     * @return null if successful; replica state if there were in fact replica calls.<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>     */<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    private ReplicaResultState trySetResultSimple(int index, Row row, boolean isError,<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>        Object result, ServerName server, boolean isFromReplica) {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      Object resObj = null;<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      if (!isReplicaGet(row)) {<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>        if (isFromReplica) {<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>          throw new AssertionError("Unexpected stale result for " + row);<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        }<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        results[index] = result;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>      } else {<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>        synchronized (replicaResultLock) {<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          resObj = results[index];<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>          if (resObj == null) {<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>            if (isFromReplica) {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>              throw new AssertionError("Unexpected stale result for " + row);<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>            }<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>            results[index] = result;<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>          }<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>        }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>      }<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span><a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>      ReplicaResultState rrs =<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>          (resObj instanceof ReplicaResultState) ? (ReplicaResultState)resObj : null;<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      if (rrs == null &amp;&amp; isError) {<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>        // The resObj is not replica state (null or already set).<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>        errors.add((Throwable)result, row, server);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>      }<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span><a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>      if (resObj == null) {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>        // resObj is null - no replica calls were made.<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>        decActionCounter(index);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>        return null;<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      }<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      return rrs;<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    }<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span><a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    private void decActionCounter(int index) {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>      long actionsRemaining = actionsInProgress.decrementAndGet();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      if (actionsRemaining &lt; 0) {<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>        String error = buildDetailedErrorMsg("Incorrect actions in progress", index);<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>        throw new AssertionError(error);<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      } else if (actionsRemaining == 0) {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>        synchronized (actionsInProgress) {<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>          actionsInProgress.notifyAll();<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>        }<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>      }<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span><a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>    private String buildDetailedErrorMsg(String string, int index) {<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>      StringBuilder error = new StringBuilder(128);<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>      error.append(string).append("; called for ").append(index).append(", actionsInProgress ")<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>          .append(actionsInProgress.get()).append("; replica gets: ");<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>      if (replicaGetIndices != null) {<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>        for (int i = 0; i &lt; replicaGetIndices.length; ++i) {<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>          error.append(replicaGetIndices[i]).append(", ");<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>        }<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>      } else {<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>        error.append(hasAnyReplicaGets ? "all" : "none");<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>      }<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      error.append("; results ");<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      if (results != null) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>        for (int i = 0; i &lt; results.length; ++i) {<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>          Object o = results[i];<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          error.append(((o == null) ? "null" : o.toString())).append(", ");<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>        }<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>      }<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      return error.toString();<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    }<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span><a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    @Override<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    public void waitUntilDone() throws InterruptedIOException {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      try {<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>        waitUntilDone(Long.MAX_VALUE);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>      } catch (InterruptedException iex) {<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        throw new InterruptedIOException(iex.getMessage());<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>      } finally {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>        if (callsInProgress != null) {<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>          for (PayloadCarryingServerCallable clb : callsInProgress) {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>            clb.cancel();<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>          }<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>      }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>    }<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span><a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    private boolean waitUntilDone(long cutoff) throws InterruptedException {<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>      boolean hasWait = cutoff != Long.MAX_VALUE;<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>      long lastLog = EnvironmentEdgeManager.currentTime();<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>      long currentInProgress;<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>      while (0 != (currentInProgress = actionsInProgress.get())) {<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>        long now = EnvironmentEdgeManager.currentTime();<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>        if (hasWait &amp;&amp; (now * 1000L) &gt; cutoff) {<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>          return false;<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>        }<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>        if (!hasWait) { // Only log if wait is infinite.<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>          if (now &gt; lastLog + 10000) {<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>            lastLog = now;<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>            LOG.info("#" + id + ", waiting for " + currentInProgress + "  actions to finish");<a name="line.1645"></a>
+<span class="sourceLineNo">1433</span>      sb.append(" on ").append(sn).append(", tracking started ").append(startTime);<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span><a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      if (willRetry) {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>        sb.append(", retrying after=").append(backOffTime).append("ms").<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>            append(", replay=").append(replaySize).append("ops");<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>      } else if (failureCount &gt; 0) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>        if (stopped &gt; 0) {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>          sb.append("; not retrying ").append(stopped).append(" due to success from other replica");<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        if (failed &gt; 0) {<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>          sb.append("; not retrying ").append(failed).append(" - final failure");<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>        }<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><a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      return sb.toString();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>    }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span><a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>    /**<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>     * Sets the non-error result from a particular action.<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>     * @param action Action (request) that the server responded to.<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>     * @param result The result.<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>     */<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    private void setResult(Action&lt;Row&gt; action, Object result) {<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      if (result == null) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>        throw new RuntimeException("Result cannot be null");<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>      ReplicaResultState state = null;<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>      boolean isStale = !RegionReplicaUtil.isDefaultReplica(action.getReplicaId());<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      int index = action.getOriginalIndex();<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>      if (results == null) {<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>        decActionCounter(index);<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>        return; // Simple case, no replica requests.<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>      }<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>      state = trySetResultSimple(index, action.getAction(), false, result, null, isStale);<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      if (state == null) {<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>        return; // Simple case, no replica requests.<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>      }<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>      // At this point we know that state is set to replica tracking class.<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>      // It could be that someone else is also looking at it; however, we know there can<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      // only be one state object, and only one thread can set callCount to 0. Other threads<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      // will either see state with callCount 0 after locking it; or will not see state at all<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>      // we will replace it with the result.<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>      synchronized (state) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>        if (state.callCount == 0) {<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>          return; // someone already set the result<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>        state.callCount = 0;<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      }<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      synchronized (replicaResultLock) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>        if (results[index] != state) {<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>          throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>        }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>        results[index] = result;<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>      decActionCounter(index);<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    }<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span><a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    /**<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>     * Sets the error from a particular action.<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>     * @param index Original action index.<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>     * @param row Original request.<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>     * @param throwable The resulting error.<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>     * @param server The source server.<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>     */<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    private void setError(int index, Row row, Throwable throwable, ServerName server) {<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      ReplicaResultState state = null;<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>      if (results == null) {<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>        // Note that we currently cannot have replica requests with null results. So it shouldn't<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>        // happen that multiple replica calls will call dAC for same actions with results == null.<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>        // Only one call per action should be present in this case.<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>        errors.add(throwable, row, server);<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>        decActionCounter(index);<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>        return; // Simple case, no replica requests.<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>      }<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>      state = trySetResultSimple(index, row, true, throwable, server, false);<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      if (state == null) {<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>        return; // Simple case, no replica requests.<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>      }<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      BatchErrors target = null; // Error will be added to final errors, or temp replica errors.<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>      boolean isActionDone = false;<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>      synchronized (state) {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>        switch (state.callCount) {<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>          case 0: return; // someone already set the result<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>          case 1: { // All calls failed, we are the last error.<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>            target = errors;<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>            isActionDone = true;<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>            break;<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>          }<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          default: {<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>            assert state.callCount &gt; 1;<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>            if (state.replicaErrors == null) {<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>              state.replicaErrors = new BatchErrors();<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>            }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>            target = state.replicaErrors;<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>            break;<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>          }<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>        }<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>        --state.callCount;<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>      }<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span>      target.add(throwable, row, server);<a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>      if (isActionDone) {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>        if (state.replicaErrors != null) { // last call, no need to lock<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>          errors.merge(state.replicaErrors);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>        }<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>        // See setResult for explanations.<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>        synchronized (replicaResultLock) {<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>          if (results[index] != state) {<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>            throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>          }<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>          results[index] = throwable;<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>        }<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>        decActionCounter(index);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>      }<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>    }<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span><a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>    /**<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>     * Checks if the action is complete; used on error to prevent needless retries.<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>     * Does not synchronize, assuming element index/field accesses are atomic.<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>     * This is an opportunistic optimization check, doesn't have to be strict.<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>     * @param index Original action index.<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>     * @param row Original request.<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>     */<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    private boolean isActionComplete(int index, Row row) {<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>      if (!isReplicaGet(row)) return false;<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>      Object resObj = results[index];<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>      return (resObj != null) &amp;&amp; (!(resObj instanceof ReplicaResultState)<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>          || ((ReplicaResultState)resObj).callCount == 0);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    }<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span><a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>    /**<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>     * Tries to set the result or error for a particular action as if there were no replica calls.<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>     * @return null if successful; replica state if there were in fact replica calls.<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>     */<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>    private ReplicaResultState trySetResultSimple(int index, Row row, boolean isError,<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>        Object result, ServerName server, boolean isFromReplica) {<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>      Object resObj = null;<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      if (!isReplicaGet(row)) {<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>        if (isFromReplica) {<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>          throw new AssertionError("Unexpected stale result for " + row);<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>        }<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>        results[index] = result;<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>      } else {<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>        synchronized (replicaResultLock) {<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>          resObj = results[index];<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>          if (resObj == null) {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>            if (isFromReplica) {<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>              throw new AssertionError("Unexpected stale result for " + row);<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>            }<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>            results[index] = result;<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>          }<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>        }<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>      }<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span><a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>      ReplicaResultState rrs =<a name="line.1588"></a>
+<span class="sourceLineNo">1589</sp

<TRUNCATED>

[07/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
index 1f46d03..8d76e1e 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
@@ -65,367 +65,366 @@
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.io.compress.GzipCodec;<a name="line.58"></a>
 <span class="sourceLineNo">059</span>import org.apache.hadoop.util.StringUtils;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.http.ConnectionClosedException;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.Assert;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.junit.Test;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>import com.google.common.collect.ImmutableList;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import com.google.common.collect.Lists;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import com.google.protobuf.BlockingRpcChannel;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import com.google.protobuf.BlockingService;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import com.google.protobuf.Message;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import com.google.protobuf.RpcController;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import com.google.protobuf.ServiceException;<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> * Some basic ipc tests.<a name="line.74"></a>
-<span class="sourceLineNo">075</span> */<a name="line.75"></a>
-<span class="sourceLineNo">076</span>public abstract class AbstractTestIPC {<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private static final Log LOG = LogFactory.getLog(AbstractTestIPC.class);<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private static byte[] CELL_BYTES = Bytes.toBytes("xyz");<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  private static KeyValue CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, CELL_BYTES);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  static byte[] BIG_CELL_BYTES = new byte[10 * 1024];<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  static KeyValue BIG_CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, BIG_CELL_BYTES);<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  static final Configuration CONF = HBaseConfiguration.create();<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  // We are using the test TestRpcServiceProtos generated classes and Service because they are<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  // available and basic with methods like 'echo', and ping. Below we make a blocking service<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  // by passing in implementation of blocking interface. We use this service in all tests that<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  // follow.<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  static final BlockingService SERVICE =<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      TestRpcServiceProtos.TestProtobufRpcProto<a name="line.90"></a>
-<span class="sourceLineNo">091</span>          .newReflectiveBlockingService(new TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface() {<a name="line.91"></a>
-<span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>            @Override<a name="line.93"></a>
-<span class="sourceLineNo">094</span>            public EmptyResponseProto ping(RpcController controller, EmptyRequestProto request)<a name="line.94"></a>
-<span class="sourceLineNo">095</span>                throws ServiceException {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>              return null;<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>            @Override<a name="line.99"></a>
-<span class="sourceLineNo">100</span>            public EmptyResponseProto error(RpcController controller, EmptyRequestProto request)<a name="line.100"></a>
-<span class="sourceLineNo">101</span>                throws ServiceException {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>              return null;<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>            @Override<a name="line.105"></a>
-<span class="sourceLineNo">106</span>            public EchoResponseProto echo(RpcController controller, EchoRequestProto request)<a name="line.106"></a>
-<span class="sourceLineNo">107</span>                throws ServiceException {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>              if (controller instanceof PayloadCarryingRpcController) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>                PayloadCarryingRpcController pcrc = (PayloadCarryingRpcController) controller;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>                // If cells, scan them to check we are able to iterate what we were given and since<a name="line.110"></a>
-<span class="sourceLineNo">111</span>                // this is<a name="line.111"></a>
-<span class="sourceLineNo">112</span>                // an echo, just put them back on the controller creating a new block. Tests our<a name="line.112"></a>
-<span class="sourceLineNo">113</span>                // block<a name="line.113"></a>
-<span class="sourceLineNo">114</span>                // building.<a name="line.114"></a>
-<span class="sourceLineNo">115</span>                CellScanner cellScanner = pcrc.cellScanner();<a name="line.115"></a>
-<span class="sourceLineNo">116</span>                List&lt;Cell&gt; list = null;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>                if (cellScanner != null) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>                  list = new ArrayList&lt;Cell&gt;();<a name="line.118"></a>
-<span class="sourceLineNo">119</span>                  try {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>                    while (cellScanner.advance()) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>                      list.add(cellScanner.current());<a name="line.121"></a>
-<span class="sourceLineNo">122</span>                    }<a name="line.122"></a>
-<span class="sourceLineNo">123</span>                  } catch (IOException e) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>                    throw new ServiceException(e);<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>                cellScanner = CellUtil.createCellScanner(list);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>                ((PayloadCarryingRpcController) controller).setCellScanner(cellScanner);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>              }<a name="line.129"></a>
-<span class="sourceLineNo">130</span>              return EchoResponseProto.newBuilder().setMessage(request.getMessage()).build();<a name="line.130"></a>
-<span class="sourceLineNo">131</span>            }<a name="line.131"></a>
-<span class="sourceLineNo">132</span>          });<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  /**<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   * Instance of server. We actually don't do anything speical in here so could just use<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * HBaseRpcServer directly.<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   */<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  static class TestRpcServer extends RpcServer {<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    TestRpcServer() throws IOException {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      this(new FifoRpcScheduler(CONF, 1), CONF);<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>    TestRpcServer(Configuration conf) throws IOException {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      this(new FifoRpcScheduler(conf, 1), conf);<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>    TestRpcServer(RpcScheduler scheduler, Configuration conf) throws IOException {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      super(null, "testRpcServer", Lists<a name="line.149"></a>
-<span class="sourceLineNo">150</span>          .newArrayList(new BlockingServiceAndInterface(SERVICE, null)), new InetSocketAddress(<a name="line.150"></a>
-<span class="sourceLineNo">151</span>          "localhost", 0), conf, scheduler);<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<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    public Pair&lt;Message, CellScanner&gt; call(BlockingService service, MethodDescriptor md,<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        Message param, CellScanner cellScanner, long receiveTime, MonitoredRPCHandler status)<a name="line.156"></a>
-<span class="sourceLineNo">157</span>        throws IOException {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      return super.call(service, md, param, cellScanner, receiveTime, status);<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><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  protected abstract AbstractRpcClient createRpcClientNoCodec(Configuration conf);<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>   * Ensure we do not HAVE TO HAVE a codec.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @throws InterruptedException<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @throws IOException<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  @Test<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public void testNoCodec() throws InterruptedException, IOException {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    Configuration conf = HBaseConfiguration.create();<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    AbstractRpcClient client = createRpcClientNoCodec(conf);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    TestRpcServer rpcServer = new TestRpcServer();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    try {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      rpcServer.start();<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      final String message = "hello";<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(message).build();<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      if (address == null) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        throw new IOException("Listener channel is closed");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      Pair&lt;Message, CellScanner&gt; r =<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          client.call(null, md, param, md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.184"></a>
-<span class="sourceLineNo">185</span>              new MetricsConnection.CallStats());<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      assertTrue(r.getSecond() == null);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      // Silly assertion that the message is in the returned pb.<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      assertTrue(r.getFirst().toString().contains(message));<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    } finally {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      client.close();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      rpcServer.stop();<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>  protected abstract AbstractRpcClient createRpcClient(Configuration conf);<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>  /**<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * It is hard to verify the compression is actually happening under the wraps. Hope that if<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * unsupported, we'll get an exception out of some time (meantime, have to trace it manually to<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * confirm that compression is happening down in the client and server).<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   * @throws IOException<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   * @throws InterruptedException<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   * @throws SecurityException<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   * @throws NoSuchMethodException<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   */<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  @Test<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  public void testCompressCellBlock() throws IOException, InterruptedException, SecurityException,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      NoSuchMethodException, ServiceException {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    Configuration conf = new Configuration(HBaseConfiguration.create());<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    conf.set("hbase.client.rpc.compressor", GzipCodec.class.getCanonicalName());<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    List&lt;Cell&gt; cells = new ArrayList&lt;Cell&gt;();<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    int count = 3;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    for (int i = 0; i &lt; count; i++) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      cells.add(CELL);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    AbstractRpcClient client = createRpcClient(conf);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    TestRpcServer rpcServer = new TestRpcServer();<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    try {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      rpcServer.start();<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      PayloadCarryingRpcController pcrc =<a name="line.222"></a>
-<span class="sourceLineNo">223</span>          new PayloadCarryingRpcController(CellUtil.createCellScanner(cells));<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      if (address == null) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        throw new IOException("Listener channel is closed");<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      }<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      Pair&lt;Message, CellScanner&gt; r =<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          client.call(pcrc, md, param, md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.229"></a>
-<span class="sourceLineNo">230</span>              new MetricsConnection.CallStats());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      int index = 0;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      while (r.getSecond().advance()) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        assertTrue(CELL.equals(r.getSecond().current()));<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        index++;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      }<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      assertEquals(count, index);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    } finally {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      client.close();<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      rpcServer.stop();<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>  protected abstract AbstractRpcClient createRpcClientRTEDuringConnectionSetup(Configuration conf)<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      throws IOException;<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Test<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  public void testRTEDuringConnectionSetup() throws Exception {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    Configuration conf = HBaseConfiguration.create();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    TestRpcServer rpcServer = new TestRpcServer();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    AbstractRpcClient client = createRpcClientRTEDuringConnectionSetup(conf);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    try {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      rpcServer.start();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      if (address == null) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        throw new IOException("Listener channel is closed");<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      client.call(null, md, param, null, User.getCurrent(), address,<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          new MetricsConnection.CallStats());<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      fail("Expected an exception to have been thrown!");<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    } catch (Exception e) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      LOG.info("Caught expected exception: " + e.toString());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      assertTrue(StringUtils.stringifyException(e).contains("Injected fault"));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    } finally {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      client.close();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      rpcServer.stop();<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /** Tests that the rpc scheduler is called when requests arrive. */<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  @Test<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  public void testRpcScheduler() throws IOException, InterruptedException {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    RpcScheduler scheduler = spy(new FifoRpcScheduler(CONF, 1));<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    RpcServer rpcServer = new TestRpcServer(scheduler, CONF);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    verify(scheduler).init((RpcScheduler.Context) anyObject());<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    AbstractRpcClient client = createRpcClient(CONF);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    try {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      rpcServer.start();<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      verify(scheduler).start();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      if (address == null) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IOException("Listener channel is closed");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        client.call(new PayloadCarryingRpcController(<a name="line.288"></a>
-<span class="sourceLineNo">289</span>            CellUtil.createCellScanner(ImmutableList.&lt;Cell&gt; of(CELL))), md, param,<a name="line.289"></a>
-<span class="sourceLineNo">290</span>            md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            new MetricsConnection.CallStats());<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      verify(scheduler, times(10)).dispatch((CallRunner) anyObject());<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    } finally {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      rpcServer.stop();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      verify(scheduler).stop();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /** Tests that the rpc scheduler is called when requests arrive. */<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  @Test<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  public void testRpcMaxRequestSize() throws IOException, InterruptedException {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    Configuration conf = new Configuration(CONF);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    conf.setInt(RpcServer.MAX_REQUEST_SIZE, 100);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    RpcServer rpcServer = new TestRpcServer(conf);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    AbstractRpcClient client = createRpcClient(conf);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    try {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      rpcServer.start();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      // set total RPC size bigger than 100 bytes<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello.hello.hello.hello."<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          + "hello.hello.hello.hello.hello.hello.hello.hello.hello.hello.hello.hello").build();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      if (address == null) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        throw new IOException("Listener channel is closed");<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      }<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      try {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>        client.call(new PayloadCarryingRpcController(<a name="line.318"></a>
-<span class="sourceLineNo">319</span>          CellUtil.createCellScanner(ImmutableList.&lt;Cell&gt; of(CELL))), md, param,<a name="line.319"></a>
-<span class="sourceLineNo">320</span>          md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.320"></a>
-<span class="sourceLineNo">321</span>          new MetricsConnection.CallStats());<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        fail("RPC should have failed because it exceeds max request size");<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      } catch(ConnectionClosingException | ConnectionClosedException ex) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        // pass<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    } finally {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      rpcServer.stop();<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">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /**<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * Instance of RpcServer that echoes client hostAddress back to client<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   */<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  static class TestRpcServer1 extends RpcServer {<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    private static BlockingInterface SERVICE1 =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        new TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface() {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          @Override<a name="line.338"></a>
-<span class="sourceLineNo">339</span>          public EmptyResponseProto ping(RpcController unused, EmptyRequestProto request)<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              throws ServiceException {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>            return EmptyResponseProto.newBuilder().build();<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>          @Override<a name="line.344"></a>
-<span class="sourceLineNo">345</span>          public EchoResponseProto echo(RpcController unused, EchoRequestProto request)<a name="line.345"></a>
-<span class="sourceLineNo">346</span>              throws ServiceException {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>            final InetAddress remoteAddr = TestRpcServer1.getRemoteAddress();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>            final String message = remoteAddr == null ? "NULL" : remoteAddr.getHostAddress();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>            return EchoResponseProto.newBuilder().setMessage(message).build();<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>          @Override<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          public EmptyResponseProto error(RpcController unused, EmptyRequestProto request)<a name="line.353"></a>
-<span class="sourceLineNo">354</span>              throws ServiceException {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>            throw new ServiceException("error", new IOException("error"));<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        };<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>    TestRpcServer1() throws IOException {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      this(new FifoRpcScheduler(CONF, 1));<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    TestRpcServer1(RpcScheduler scheduler) throws IOException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      super(null, "testRemoteAddressInCallObject", Lists<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          .newArrayList(new BlockingServiceAndInterface(TestRpcServiceProtos.TestProtobufRpcProto<a name="line.365"></a>
-<span class="sourceLineNo">366</span>              .newReflectiveBlockingService(SERVICE1), null)),<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          new InetSocketAddress("localhost", 0), CONF, scheduler);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>  }<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>  /**<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * Tests that the RpcServer creates &amp; dispatches CallRunner object to scheduler with non-null<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * remoteAddress set to its Call Object<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @throws ServiceException<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   */<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  public void testRpcServerForNotNullRemoteAddressInCallObject() throws IOException,<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      ServiceException {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final RpcScheduler scheduler = new FifoRpcScheduler(CONF, 1);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final TestRpcServer1 rpcServer = new TestRpcServer1(scheduler);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    final InetSocketAddress localAddr = new InetSocketAddress("localhost", 0);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    final AbstractRpcClient client =<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        new RpcClientImpl(CONF, HConstants.CLUSTER_ID_DEFAULT, localAddr, null);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    try {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      rpcServer.start();<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      final InetSocketAddress isa = rpcServer.getListenerAddress();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      if (isa == null) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        throw new IOException("Listener channel is closed");<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      final BlockingRpcChannel channel =<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          client.createBlockingRpcChannel(<a name="line.391"></a>
-<span class="sourceLineNo">392</span>            ServerName.valueOf(isa.getHostName(), isa.getPort(), System.currentTimeMillis()),<a name="line.392"></a>
-<span class="sourceLineNo">393</span>            User.getCurrent(), 0);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface stub =<a name="line.394"></a>
-<span class="sourceLineNo">395</span>          TestRpcServiceProtos.TestProtobufRpcProto.newBlockingStub(channel);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      final EchoRequestProto echoRequest =<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          EchoRequestProto.newBuilder().setMessage("GetRemoteAddress").build();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      final EchoResponseProto echoResponse = stub.echo(null, echoRequest);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      Assert.assertEquals(localAddr.getAddress().getHostAddress(), echoResponse.getMessage());<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    } finally {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      client.close();<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      rpcServer.stop();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
-<span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  @Test<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  public void testWrapException() throws Exception {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    AbstractRpcClient client =<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        (AbstractRpcClient) RpcClientFactory.createClient(CONF, "AbstractTestIPC");<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    final InetSocketAddress address = InetSocketAddress.createUnresolved("localhost", 0);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    assertTrue(client.wrapException(address, new ConnectException()) instanceof ConnectException);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    assertTrue(client.wrapException(address,<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      new SocketTimeoutException()) instanceof SocketTimeoutException);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    assertTrue(client.wrapException(address, new ConnectionClosingException(<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        "Test AbstractRpcClient#wrapException")) instanceof ConnectionClosingException);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    assertTrue(client<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        .wrapException(address, new CallTimeoutException("Test AbstractRpcClient#wrapException"))<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        .getCause() instanceof CallTimeoutException);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>}<a name="line.420"></a>
+<span class="sourceLineNo">060</span>import org.junit.Assert;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.junit.Test;<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>import com.google.common.collect.ImmutableList;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import com.google.common.collect.Lists;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import com.google.protobuf.BlockingRpcChannel;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import com.google.protobuf.BlockingService;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import com.google.protobuf.Message;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import com.google.protobuf.RpcController;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import com.google.protobuf.ServiceException;<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>/**<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * Some basic ipc tests.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>public abstract class AbstractTestIPC {<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private static final Log LOG = LogFactory.getLog(AbstractTestIPC.class);<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private static byte[] CELL_BYTES = Bytes.toBytes("xyz");<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private static KeyValue CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, CELL_BYTES);<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  static byte[] BIG_CELL_BYTES = new byte[10 * 1024];<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  static KeyValue BIG_CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, BIG_CELL_BYTES);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  static final Configuration CONF = HBaseConfiguration.create();<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  // We are using the test TestRpcServiceProtos generated classes and Service because they are<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  // available and basic with methods like 'echo', and ping. Below we make a blocking service<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  // by passing in implementation of blocking interface. We use this service in all tests that<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  // follow.<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  static final BlockingService SERVICE =<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      TestRpcServiceProtos.TestProtobufRpcProto<a name="line.89"></a>
+<span class="sourceLineNo">090</span>          .newReflectiveBlockingService(new TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface() {<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>            @Override<a name="line.92"></a>
+<span class="sourceLineNo">093</span>            public EmptyResponseProto ping(RpcController controller, EmptyRequestProto request)<a name="line.93"></a>
+<span class="sourceLineNo">094</span>                throws ServiceException {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>              return null;<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>            @Override<a name="line.98"></a>
+<span class="sourceLineNo">099</span>            public EmptyResponseProto error(RpcController controller, EmptyRequestProto request)<a name="line.99"></a>
+<span class="sourceLineNo">100</span>                throws ServiceException {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>              return null;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>            }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>            @Override<a name="line.104"></a>
+<span class="sourceLineNo">105</span>            public EchoResponseProto echo(RpcController controller, EchoRequestProto request)<a name="line.105"></a>
+<span class="sourceLineNo">106</span>                throws ServiceException {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>              if (controller instanceof PayloadCarryingRpcController) {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>                PayloadCarryingRpcController pcrc = (PayloadCarryingRpcController) controller;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>                // If cells, scan them to check we are able to iterate what we were given and since<a name="line.109"></a>
+<span class="sourceLineNo">110</span>                // this is<a name="line.110"></a>
+<span class="sourceLineNo">111</span>                // an echo, just put them back on the controller creating a new block. Tests our<a name="line.111"></a>
+<span class="sourceLineNo">112</span>                // block<a name="line.112"></a>
+<span class="sourceLineNo">113</span>                // building.<a name="line.113"></a>
+<span class="sourceLineNo">114</span>                CellScanner cellScanner = pcrc.cellScanner();<a name="line.114"></a>
+<span class="sourceLineNo">115</span>                List&lt;Cell&gt; list = null;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>                if (cellScanner != null) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>                  list = new ArrayList&lt;Cell&gt;();<a name="line.117"></a>
+<span class="sourceLineNo">118</span>                  try {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>                    while (cellScanner.advance()) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>                      list.add(cellScanner.current());<a name="line.120"></a>
+<span class="sourceLineNo">121</span>                    }<a name="line.121"></a>
+<span class="sourceLineNo">122</span>                  } catch (IOException e) {<a name="line.122"></a>
+<span class="sourceLineNo">123</span>                    throw new ServiceException(e);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>                  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>                }<a name="line.125"></a>
+<span class="sourceLineNo">126</span>                cellScanner = CellUtil.createCellScanner(list);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>                ((PayloadCarryingRpcController) controller).setCellScanner(cellScanner);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>              }<a name="line.128"></a>
+<span class="sourceLineNo">129</span>              return EchoResponseProto.newBuilder().setMessage(request.getMessage()).build();<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>  /**<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * Instance of server. We actually don't do anything speical in here so could just use<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   * HBaseRpcServer directly.<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   */<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static class TestRpcServer extends RpcServer {<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>    TestRpcServer() throws IOException {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      this(new FifoRpcScheduler(CONF, 1), CONF);<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>    TestRpcServer(Configuration conf) throws IOException {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      this(new FifoRpcScheduler(conf, 1), conf);<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>    TestRpcServer(RpcScheduler scheduler, Configuration conf) throws IOException {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      super(null, "testRpcServer", Lists<a name="line.148"></a>
+<span class="sourceLineNo">149</span>          .newArrayList(new BlockingServiceAndInterface(SERVICE, null)), new InetSocketAddress(<a name="line.149"></a>
+<span class="sourceLineNo">150</span>          "localhost", 0), conf, scheduler);<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>    @Override<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    public Pair&lt;Message, CellScanner&gt; call(BlockingService service, MethodDescriptor md,<a name="line.154"></a>
+<span class="sourceLineNo">155</span>        Message param, CellScanner cellScanner, long receiveTime, MonitoredRPCHandler status)<a name="line.155"></a>
+<span class="sourceLineNo">156</span>        throws IOException {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      return super.call(service, md, param, cellScanner, receiveTime, status);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    }<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>  protected abstract AbstractRpcClient createRpcClientNoCodec(Configuration conf);<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>   * Ensure we do not HAVE TO HAVE a codec.<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   * @throws InterruptedException<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * @throws IOException<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   */<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  @Test<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public void testNoCodec() throws InterruptedException, IOException {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    Configuration conf = HBaseConfiguration.create();<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    AbstractRpcClient client = createRpcClientNoCodec(conf);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    TestRpcServer rpcServer = new TestRpcServer();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    try {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      rpcServer.start();<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      final String message = "hello";<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(message).build();<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      if (address == null) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        throw new IOException("Listener channel is closed");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      }<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      Pair&lt;Message, CellScanner&gt; r =<a name="line.182"></a>
+<span class="sourceLineNo">183</span>          client.call(null, md, param, md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.183"></a>
+<span class="sourceLineNo">184</span>              new MetricsConnection.CallStats());<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      assertTrue(r.getSecond() == null);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      // Silly assertion that the message is in the returned pb.<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      assertTrue(r.getFirst().toString().contains(message));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    } finally {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      client.close();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      rpcServer.stop();<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    }<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>  protected abstract AbstractRpcClient createRpcClient(Configuration conf);<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>  /**<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * It is hard to verify the compression is actually happening under the wraps. Hope that if<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * unsupported, we'll get an exception out of some time (meantime, have to trace it manually to<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * confirm that compression is happening down in the client and server).<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * @throws IOException<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * @throws InterruptedException<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * @throws SecurityException<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * @throws NoSuchMethodException<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  @Test<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  public void testCompressCellBlock() throws IOException, InterruptedException, SecurityException,<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      NoSuchMethodException, ServiceException {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    Configuration conf = new Configuration(HBaseConfiguration.create());<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    conf.set("hbase.client.rpc.compressor", GzipCodec.class.getCanonicalName());<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    List&lt;Cell&gt; cells = new ArrayList&lt;Cell&gt;();<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    int count = 3;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    for (int i = 0; i &lt; count; i++) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      cells.add(CELL);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    }<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    AbstractRpcClient client = createRpcClient(conf);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    TestRpcServer rpcServer = new TestRpcServer();<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    try {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      rpcServer.start();<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      PayloadCarryingRpcController pcrc =<a name="line.221"></a>
+<span class="sourceLineNo">222</span>          new PayloadCarryingRpcController(CellUtil.createCellScanner(cells));<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      if (address == null) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        throw new IOException("Listener channel is closed");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      Pair&lt;Message, CellScanner&gt; r =<a name="line.227"></a>
+<span class="sourceLineNo">228</span>          client.call(pcrc, md, param, md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>              new MetricsConnection.CallStats());<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      int index = 0;<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      while (r.getSecond().advance()) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        assertTrue(CELL.equals(r.getSecond().current()));<a name="line.232"></a>
+<span class="sourceLineNo">233</span>        index++;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      assertEquals(count, index);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    } finally {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      client.close();<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      rpcServer.stop();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    }<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>  protected abstract AbstractRpcClient createRpcClientRTEDuringConnectionSetup(Configuration conf)<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      throws IOException;<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  @Test<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  public void testRTEDuringConnectionSetup() throws Exception {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    Configuration conf = HBaseConfiguration.create();<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    TestRpcServer rpcServer = new TestRpcServer();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    AbstractRpcClient client = createRpcClientRTEDuringConnectionSetup(conf);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    try {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      rpcServer.start();<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      if (address == null) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        throw new IOException("Listener channel is closed");<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      client.call(null, md, param, null, User.getCurrent(), address,<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          new MetricsConnection.CallStats());<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      fail("Expected an exception to have been thrown!");<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    } catch (Exception e) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      LOG.info("Caught expected exception: " + e.toString());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      assertTrue(StringUtils.stringifyException(e).contains("Injected fault"));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    } finally {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      client.close();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      rpcServer.stop();<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>  /** Tests that the rpc scheduler is called when requests arrive. */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  @Test<a name="line.271"></a>
+<span class="sourceLineNo">272</span>  public void testRpcScheduler() throws IOException, InterruptedException {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    RpcScheduler scheduler = spy(new FifoRpcScheduler(CONF, 1));<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    RpcServer rpcServer = new TestRpcServer(scheduler, CONF);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    verify(scheduler).init((RpcScheduler.Context) anyObject());<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    AbstractRpcClient client = createRpcClient(CONF);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    try {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      rpcServer.start();<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      verify(scheduler).start();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      if (address == null) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        throw new IOException("Listener channel is closed");<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      }<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        client.call(new PayloadCarryingRpcController(<a name="line.287"></a>
+<span class="sourceLineNo">288</span>            CellUtil.createCellScanner(ImmutableList.&lt;Cell&gt; of(CELL))), md, param,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>            md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.289"></a>
+<span class="sourceLineNo">290</span>            new MetricsConnection.CallStats());<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      }<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      verify(scheduler, times(10)).dispatch((CallRunner) anyObject());<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    } finally {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      rpcServer.stop();<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      verify(scheduler).stop();<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><a name="line.298"></a>
+<span class="sourceLineNo">299</span>  /** Tests that the rpc scheduler is called when requests arrive. */<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  @Test<a name="line.300"></a>
+<span class="sourceLineNo">301</span>  public void testRpcMaxRequestSize() throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    Configuration conf = new Configuration(CONF);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    conf.setInt(RpcServer.MAX_REQUEST_SIZE, 100);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    RpcServer rpcServer = new TestRpcServer(conf);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    AbstractRpcClient client = createRpcClient(conf);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    try {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      rpcServer.start();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      // set total RPC size bigger than 100 bytes<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello.hello.hello.hello."<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          + "hello.hello.hello.hello.hello.hello.hello.hello.hello.hello.hello.hello").build();<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      if (address == null) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>        throw new IOException("Listener channel is closed");<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      try {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>        client.call(new PayloadCarryingRpcController(<a name="line.317"></a>
+<span class="sourceLineNo">318</span>          CellUtil.createCellScanner(ImmutableList.&lt;Cell&gt; of(CELL))), md, param,<a name="line.318"></a>
+<span class="sourceLineNo">319</span>          md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.319"></a>
+<span class="sourceLineNo">320</span>          new MetricsConnection.CallStats());<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        fail("RPC should have failed because it exceeds max request size");<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      } catch(IOException ex) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        // pass<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      }<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    } finally {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      rpcServer.stop();<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">330</span>  /**<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * Instance of RpcServer that echoes client hostAddress back to client<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   */<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  static class TestRpcServer1 extends RpcServer {<a name="line.333"></a>
+<span class="sourceLineNo">334</span><a name="line.334"></a>
+<span class="sourceLineNo">335</span>    private static BlockingInterface SERVICE1 =<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        new TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface() {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          @Override<a name="line.337"></a>
+<span class="sourceLineNo">338</span>          public EmptyResponseProto ping(RpcController unused, EmptyRequestProto request)<a name="line.338"></a>
+<span class="sourceLineNo">339</span>              throws ServiceException {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>            return EmptyResponseProto.newBuilder().build();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>          }<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>          @Override<a name="line.343"></a>
+<span class="sourceLineNo">344</span>          public EchoResponseProto echo(RpcController unused, EchoRequestProto request)<a name="line.344"></a>
+<span class="sourceLineNo">345</span>              throws ServiceException {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>            final InetAddress remoteAddr = TestRpcServer1.getRemoteAddress();<a name="line.346"></a>
+<span class="sourceLineNo">347</span>            final String message = remoteAddr == null ? "NULL" : remoteAddr.getHostAddress();<a name="line.347"></a>
+<span class="sourceLineNo">348</span>            return EchoResponseProto.newBuilder().setMessage(message).build();<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 EmptyResponseProto error(RpcController unused, EmptyRequestProto request)<a name="line.352"></a>
+<span class="sourceLineNo">353</span>              throws ServiceException {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>            throw new ServiceException("error", new IOException("error"));<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><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    TestRpcServer1() throws IOException {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      this(new FifoRpcScheduler(CONF, 1));<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    TestRpcServer1(RpcScheduler scheduler) throws IOException {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      super(null, "testRemoteAddressInCallObject", Lists<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          .newArrayList(new BlockingServiceAndInterface(TestRpcServiceProtos.TestProtobufRpcProto<a name="line.364"></a>
+<span class="sourceLineNo">365</span>              .newReflectiveBlockingService(SERVICE1), null)),<a name="line.365"></a>
+<span class="sourceLineNo">366</span>          new InetSocketAddress("localhost", 0), CONF, scheduler);<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><a name="line.369"></a>
+<span class="sourceLineNo">370</span>  /**<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   * Tests that the RpcServer creates &amp; dispatches CallRunner object to scheduler with non-null<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   * remoteAddress set to its Call Object<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   * @throws ServiceException<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   */<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  @Test<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  public void testRpcServerForNotNullRemoteAddressInCallObject() throws IOException,<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      ServiceException {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    final RpcScheduler scheduler = new FifoRpcScheduler(CONF, 1);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    final TestRpcServer1 rpcServer = new TestRpcServer1(scheduler);<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    final InetSocketAddress localAddr = new InetSocketAddress("localhost", 0);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    final AbstractRpcClient client =<a name="line.381"></a>
+<span class="sourceLineNo">382</span>        new RpcClientImpl(CONF, HConstants.CLUSTER_ID_DEFAULT, localAddr, null);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    try {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      rpcServer.start();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      final InetSocketAddress isa = rpcServer.getListenerAddress();<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      if (isa == null) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        throw new IOException("Listener channel is closed");<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      final BlockingRpcChannel channel =<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          client.createBlockingRpcChannel(<a name="line.390"></a>
+<span class="sourceLineNo">391</span>            ServerName.valueOf(isa.getHostName(), isa.getPort(), System.currentTimeMillis()),<a name="line.391"></a>
+<span class="sourceLineNo">392</span>            User.getCurrent(), 0);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface stub =<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          TestRpcServiceProtos.TestProtobufRpcProto.newBlockingStub(channel);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      final EchoRequestProto echoRequest =<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          EchoRequestProto.newBuilder().setMessage("GetRemoteAddress").build();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      final EchoResponseProto echoResponse = stub.echo(null, echoRequest);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      Assert.assertEquals(localAddr.getAddress().getHostAddress(), echoResponse.getMessage());<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    } finally {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      client.close();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      rpcServer.stop();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
+<span class="sourceLineNo">404</span><a name="line.404"></a>
+<span class="sourceLineNo">405</span>  @Test<a name="line.405"></a>
+<span class="sourceLineNo">406</span>  public void testWrapException() throws Exception {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    AbstractRpcClient client =<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        (AbstractRpcClient) RpcClientFactory.createClient(CONF, "AbstractTestIPC");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    final InetSocketAddress address = InetSocketAddress.createUnresolved("localhost", 0);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    assertTrue(client.wrapException(address, new ConnectException()) instanceof ConnectException);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    assertTrue(client.wrapException(address,<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      new SocketTimeoutException()) instanceof SocketTimeoutException);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    assertTrue(client.wrapException(address, new ConnectionClosingException(<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        "Test AbstractRpcClient#wrapException")) instanceof ConnectionClosingException);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    assertTrue(client<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        .wrapException(address, new CallTimeoutException("Test AbstractRpcClient#wrapException"))<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        .getCause() instanceof CallTimeoutException);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>  }<a name="line.418"></a>
+<span class="sourceLineNo">419</span>}<a name="line.419"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html
index a990fcc..baff969 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html
@@ -30,20 +30,20 @@
 <span class="sourceLineNo">022</span>import java.util.ArrayList;<a name="line.22"></a>
 <span class="sourceLineNo">023</span>import java.util.List;<a name="line.23"></a>
 <span class="sourceLineNo">024</span><a name="line.24"></a>
-<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.CellComparator;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.KeyValue;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.util.CollectionBackedScanner;<a name="line.27"></a>
-<span class="sourceLineNo">028</span><a name="line.28"></a>
-<span class="sourceLineNo">029</span>/**<a name="line.29"></a>
-<span class="sourceLineNo">030</span> * A fixture that implements and presents a KeyValueScanner.<a name="line.30"></a>
-<span class="sourceLineNo">031</span> * It takes a list of key/values which is then sorted according<a name="line.31"></a>
-<span class="sourceLineNo">032</span> * to the provided comparator, and then the whole thing pretends<a name="line.32"></a>
-<span class="sourceLineNo">033</span> * to be a store file scanner.<a name="line.33"></a>
-<span class="sourceLineNo">034</span> */<a name="line.34"></a>
-<span class="sourceLineNo">035</span>public class KeyValueScanFixture extends CollectionBackedScanner {<a name="line.35"></a>
-<span class="sourceLineNo">036</span>  public KeyValueScanFixture(CellComparator comparator,<a name="line.36"></a>
-<span class="sourceLineNo">037</span>                             KeyValue... incData) {<a name="line.37"></a>
-<span class="sourceLineNo">038</span>    super(comparator, incData);<a name="line.38"></a>
+<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.Cell;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.CellComparator;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.KeyValue;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.util.CollectionBackedScanner;<a name="line.28"></a>
+<span class="sourceLineNo">029</span><a name="line.29"></a>
+<span class="sourceLineNo">030</span>/**<a name="line.30"></a>
+<span class="sourceLineNo">031</span> * A fixture that implements and presents a KeyValueScanner.<a name="line.31"></a>
+<span class="sourceLineNo">032</span> * It takes a list of key/values which is then sorted according<a name="line.32"></a>
+<span class="sourceLineNo">033</span> * to the provided comparator, and then the whole thing pretends<a name="line.33"></a>
+<span class="sourceLineNo">034</span> * to be a store file scanner.<a name="line.34"></a>
+<span class="sourceLineNo">035</span> */<a name="line.35"></a>
+<span class="sourceLineNo">036</span>public class KeyValueScanFixture extends CollectionBackedScanner {<a name="line.36"></a>
+<span class="sourceLineNo">037</span>  public KeyValueScanFixture(CellComparator comparator, Cell... cells) {<a name="line.37"></a>
+<span class="sourceLineNo">038</span>    super(comparator, cells);<a name="line.38"></a>
 <span class="sourceLineNo">039</span>  }<a name="line.39"></a>
 <span class="sourceLineNo">040</span><a name="line.40"></a>
 <span class="sourceLineNo">041</span>  public static List&lt;KeyValueScanner&gt; scanFixture(KeyValue[] ... kvArrays) {<a name="line.41"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestKeyValueScanFixture.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestKeyValueScanFixture.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestKeyValueScanFixture.html
index a639d5f..20b919c 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestKeyValueScanFixture.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestKeyValueScanFixture.html
@@ -54,35 +54,34 @@
 <span class="sourceLineNo">046</span>        KeyValueTestUtil.create("RowB", "family", "qf1",<a name="line.46"></a>
 <span class="sourceLineNo">047</span>            10, KeyValue.Type.Put, "value-10")<a name="line.47"></a>
 <span class="sourceLineNo">048</span>    };<a name="line.48"></a>
-<span class="sourceLineNo">049</span>    KeyValueScanner scan = new KeyValueScanFixture(<a name="line.49"></a>
-<span class="sourceLineNo">050</span>        CellComparator.COMPARATOR, kvs);<a name="line.50"></a>
-<span class="sourceLineNo">051</span><a name="line.51"></a>
-<span class="sourceLineNo">052</span>    KeyValue kv = KeyValueUtil.createFirstOnRow(Bytes.toBytes("RowA"));<a name="line.52"></a>
-<span class="sourceLineNo">053</span>    // should seek to this:<a name="line.53"></a>
-<span class="sourceLineNo">054</span>    assertTrue(scan.seek(kv));<a name="line.54"></a>
-<span class="sourceLineNo">055</span>    Cell res = scan.peek();<a name="line.55"></a>
-<span class="sourceLineNo">056</span>    assertEquals(kvs[0], res);<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>    kv = KeyValueUtil.createFirstOnRow(Bytes.toBytes("RowB"));<a name="line.58"></a>
-<span class="sourceLineNo">059</span>    assertTrue(scan.seek(kv));<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    res = scan.peek();<a name="line.60"></a>
-<span class="sourceLineNo">061</span>    assertEquals(kvs[2], res);<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>    // ensure we pull things out properly:<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    kv = KeyValueUtil.createFirstOnRow(Bytes.toBytes("RowA"));<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    assertTrue(scan.seek(kv));<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    assertEquals(kvs[0], scan.peek());<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    assertEquals(kvs[0], scan.next());<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    assertEquals(kvs[1], scan.peek());<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    assertEquals(kvs[1], scan.next());<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    assertEquals(kvs[2], scan.peek());<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    assertEquals(kvs[2], scan.next());<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    assertEquals(null, scan.peek());<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    assertEquals(null, scan.next());<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>}<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
+<span class="sourceLineNo">049</span>    KeyValueScanner scan = new KeyValueScanFixture(CellComparator.COMPARATOR, kvs);<a name="line.49"></a>
+<span class="sourceLineNo">050</span><a name="line.50"></a>
+<span class="sourceLineNo">051</span>    KeyValue kv = KeyValueUtil.createFirstOnRow(Bytes.toBytes("RowA"));<a name="line.51"></a>
+<span class="sourceLineNo">052</span>    // should seek to this:<a name="line.52"></a>
+<span class="sourceLineNo">053</span>    assertTrue(scan.seek(kv));<a name="line.53"></a>
+<span class="sourceLineNo">054</span>    Cell res = scan.peek();<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    assertEquals(kvs[0], res);<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>    kv = KeyValueUtil.createFirstOnRow(Bytes.toBytes("RowB"));<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    assertTrue(scan.seek(kv));<a name="line.58"></a>
+<span class="sourceLineNo">059</span>    res = scan.peek();<a name="line.59"></a>
+<span class="sourceLineNo">060</span>    assertEquals(kvs[2], res);<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>    // ensure we pull things out properly:<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    kv = KeyValueUtil.createFirstOnRow(Bytes.toBytes("RowA"));<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    assertTrue(scan.seek(kv));<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    assertEquals(kvs[0], scan.peek());<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    assertEquals(kvs[0], scan.next());<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    assertEquals(kvs[1], scan.peek());<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    assertEquals(kvs[1], scan.next());<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    assertEquals(kvs[2], scan.peek());<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    assertEquals(kvs[2], scan.next());<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    assertEquals(null, scan.peek());<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    assertEquals(null, scan.next());<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>}<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
 
 
 


[47/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/client/AsyncProcess.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/AsyncProcess.html b/devapidocs/org/apache/hadoop/hbase/client/AsyncProcess.html
index 7f77657..2dd2991 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/AsyncProcess.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/AsyncProcess.html
@@ -956,7 +956,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>updateStats</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1683">updateStats</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;server,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1701">updateStats</a>(<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/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="../../../../../org/apache/hadoop/hbase/client/MultiResponse.RegionResult.html" title="class in org.apache.hadoop.hbase.client">MultiResponse.RegionResult</a>&gt;&nbsp;results)</pre>
 </li>
 </ul>
@@ -966,7 +966,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createAsyncRequestFuture</h4>
-<pre>protected&nbsp;&lt;CResult&gt;&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html" title="class in org.apache.hadoop.hbase.client">AsyncProcess.AsyncRequestFutureImpl</a>&lt;CResult&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1699">createAsyncRequestFuture</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>protected&nbsp;&lt;CResult&gt;&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html" title="class in org.apache.hadoop.hbase.client">AsyncProcess.AsyncRequestFutureImpl</a>&lt;CResult&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1717">createAsyncRequestFuture</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/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Action.html" title="class in org.apache.hadoop.hbase.client">Action</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;&gt;&nbsp;actions,
                                                                               long&nbsp;nonceGroup,
                                                                               <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,
@@ -983,7 +983,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createAsyncRequestFuture</h4>
-<pre>protected&nbsp;&lt;CResult&gt;&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html" title="class in org.apache.hadoop.hbase.client">AsyncProcess.AsyncRequestFutureImpl</a>&lt;CResult&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1710">createAsyncRequestFuture</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>protected&nbsp;&lt;CResult&gt;&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html" title="class in org.apache.hadoop.hbase.client">AsyncProcess.AsyncRequestFutureImpl</a>&lt;CResult&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1728">createAsyncRequestFuture</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/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Action.html" title="class in org.apache.hadoop.hbase.client">Action</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;&gt;&nbsp;actions,
                                                                               long&nbsp;nonceGroup,
                                                                               <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,
@@ -998,7 +998,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createCallable</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MultiServerCallable.html" title="class in org.apache.hadoop.hbase.client">MultiServerCallable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1721">createCallable</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;server,
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MultiServerCallable.html" title="class in org.apache.hadoop.hbase.client">MultiServerCallable</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1739">createCallable</a>(<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/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                       <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/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;&nbsp;multi)</pre>
 <div class="block">Create a callable. Isolated to be easily overridden in the tests.</div>
@@ -1010,7 +1010,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createCaller</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RpcRetryingCaller.html" title="interface in org.apache.hadoop.hbase.client">RpcRetryingCaller</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/MultiResponse.html" title="class in org.apache.hadoop.hbase.client">MultiResponse</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1730">createCaller</a>(<a href="../../../../../org/apache/hadoop/hbase/client/PayloadCarryingServerCallable.html" title="class in org.apache.hadoop.hbase.client">PayloadCarryingServerCallable</a>&nbsp;callable)</pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RpcRetryingCaller.html" title="interface in org.apache.hadoop.hbase.client">RpcRetryingCaller</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/MultiResponse.html" title="class in org.apache.hadoop.hbase.client">MultiResponse</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1748">createCaller</a>(<a href="../../../../../org/apache/hadoop/hbase/client/PayloadCarryingServerCallable.html" title="class in org.apache.hadoop.hbase.client">PayloadCarryingServerCallable</a>&nbsp;callable)</pre>
 <div class="block">Create a caller. Isolated to be easily overridden in the tests.</div>
 </li>
 </ul>
@@ -1020,7 +1020,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>waitUntilDone</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1736">waitUntilDone</a>()
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1754">waitUntilDone</a>()
              throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/InterruptedIOException.html?is-external=true" title="class or interface in java.io">InterruptedIOException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/io/InterruptedIOException.html?is-external=true" title="class or interface in java.io">InterruptedIOException</a></code></dd></dl>
@@ -1032,7 +1032,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>waitForMaximumCurrentTasks</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1741">waitForMaximumCurrentTasks</a>(int&nbsp;max)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1759">waitForMaximumCurrentTasks</a>(int&nbsp;max)
                                  throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/InterruptedIOException.html?is-external=true" title="class or interface in java.io">InterruptedIOException</a></pre>
 <div class="block">Wait until the async does not have more than max tasks in progress.</div>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -1045,7 +1045,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>hasError</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1771">hasError</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1789">hasError</a>()</pre>
 <div class="block">Only used w/useGlobalErrors ctor argument, for HTable backward compat.</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>Whether there were any errors in any request since the last time
           <a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.html#waitForAllPreviousOpsAndReset(java.util.List)"><code>waitForAllPreviousOpsAndReset(List)</code></a> was called, or AP was created.</dd></dl>
@@ -1057,7 +1057,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>waitForAllPreviousOpsAndReset</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RetriesExhaustedWithDetailsException.html" title="class in org.apache.hadoop.hbase.client">RetriesExhaustedWithDetailsException</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1784">waitForAllPreviousOpsAndReset</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/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;&nbsp;failedRows)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RetriesExhaustedWithDetailsException.html" title="class in org.apache.hadoop.hbase.client">RetriesExhaustedWithDetailsException</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1802">waitForAllPreviousOpsAndReset</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/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;&nbsp;failedRows)
                                                                    throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/InterruptedIOException.html?is-external=true" title="class or interface in java.io">InterruptedIOException</a></pre>
 <div class="block">Only used w/useGlobalErrors ctor argument, for HTable backward compat.
  Waits for all previous operations to finish, and returns errors and (optionally)
@@ -1076,7 +1076,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>incTaskCounters</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1801">incTaskCounters</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;regions,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1819">incTaskCounters</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;regions,
                    <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</pre>
 <div class="block">increment the tasks counters for a given set of regions. MT safe.</div>
 </li>
@@ -1087,7 +1087,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>decTaskCounters</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1827">decTaskCounters</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;regions,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1845">decTaskCounters</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;regions,
                    <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn)</pre>
 <div class="block">Decrements the counters for a given region and the region server. MT Safe.</div>
 </li>
@@ -1098,7 +1098,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createServerErrorTracker</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.ServerErrorTracker.html" title="class in org.apache.hadoop.hbase.client">ConnectionImplementation.ServerErrorTracker</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1847">createServerErrorTracker</a>()</pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.ServerErrorTracker.html" title="class in org.apache.hadoop.hbase.client">ConnectionImplementation.ServerErrorTracker</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1865">createServerErrorTracker</a>()</pre>
 <div class="block">Creates the server error tracker to use inside process.
  Currently, to preserve the main assumption about current retries, and to work well with
  the retry-limit-based calculation, the calculation is local per Process object.
@@ -1112,7 +1112,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>isReplicaGet</h4>
-<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1852">isReplicaGet</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&nbsp;row)</pre>
+<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1870">isReplicaGet</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&nbsp;row)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html b/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html
index c7f20bd..2b91413 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html
@@ -99,7 +99,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.69">MetricsConnection.CallStats</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.70">MetricsConnection.CallStats</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">A container class for collecting details about the RPC call as it percolates.</div>
 </li>
@@ -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>requestSizeBytes</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.70">requestSizeBytes</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.71">requestSizeBytes</a></pre>
 </li>
 </ul>
 <a name="responseSizeBytes">
@@ -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>responseSizeBytes</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.71">responseSizeBytes</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.72">responseSizeBytes</a></pre>
 </li>
 </ul>
 <a name="startTime">
@@ -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>startTime</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.72">startTime</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.73">startTime</a></pre>
 </li>
 </ul>
 <a name="callTimeMs">
@@ -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>callTimeMs</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.73">callTimeMs</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.74">callTimeMs</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>MetricsConnection.CallStats</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.69">MetricsConnection.CallStats</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.70">MetricsConnection.CallStats</a>()</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>getRequestSizeBytes</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.75">getRequestSizeBytes</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.76">getRequestSizeBytes</a>()</pre>
 </li>
 </ul>
 <a name="setRequestSizeBytes(long)">
@@ -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>setRequestSizeBytes</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.79">setRequestSizeBytes</a>(long&nbsp;requestSizeBytes)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.80">setRequestSizeBytes</a>(long&nbsp;requestSizeBytes)</pre>
 </li>
 </ul>
 <a name="getResponseSizeBytes()">
@@ -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>getResponseSizeBytes</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.83">getResponseSizeBytes</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.84">getResponseSizeBytes</a>()</pre>
 </li>
 </ul>
 <a name="setResponseSizeBytes(long)">
@@ -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>setResponseSizeBytes</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.87">setResponseSizeBytes</a>(long&nbsp;responseSizeBytes)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.88">setResponseSizeBytes</a>(long&nbsp;responseSizeBytes)</pre>
 </li>
 </ul>
 <a name="getStartTime()">
@@ -325,7 +325,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getStartTime</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.91">getStartTime</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.92">getStartTime</a>()</pre>
 </li>
 </ul>
 <a name="setStartTime(long)">
@@ -334,7 +334,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setStartTime</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.95">setStartTime</a>(long&nbsp;startTime)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.96">setStartTime</a>(long&nbsp;startTime)</pre>
 </li>
 </ul>
 <a name="getCallTimeMs()">
@@ -343,7 +343,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getCallTimeMs</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.99">getCallTimeMs</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.100">getCallTimeMs</a>()</pre>
 </li>
 </ul>
 <a name="setCallTimeMs(long)">
@@ -352,7 +352,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>setCallTimeMs</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.103">setCallTimeMs</a>(long&nbsp;callTimeMs)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html#line.104">setCallTimeMs</a>(long&nbsp;callTimeMs)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html b/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html
index 525619f..2af50e2 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html
@@ -99,7 +99,7 @@
 </dl>
 <hr>
 <br>
-<pre>protected static final class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.109">MetricsConnection.CallTracker</a>
+<pre>protected static final class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.110">MetricsConnection.CallTracker</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>
@@ -214,7 +214,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>name</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/client/MetricsConnection.CallTracker.html#line.110">name</a></pre>
+<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/client/MetricsConnection.CallTracker.html#line.111">name</a></pre>
 </li>
 </ul>
 <a name="callTimer">
@@ -223,7 +223,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>callTimer</h4>
-<pre>final&nbsp;com.codahale.metrics.Timer <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html#line.111">callTimer</a></pre>
+<pre>final&nbsp;com.codahale.metrics.Timer <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html#line.112">callTimer</a></pre>
 </li>
 </ul>
 <a name="reqHist">
@@ -232,7 +232,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>reqHist</h4>
-<pre>final&nbsp;com.codahale.metrics.Histogram <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html#line.112">reqHist</a></pre>
+<pre>final&nbsp;com.codahale.metrics.Histogram <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html#line.113">reqHist</a></pre>
 </li>
 </ul>
 <a name="respHist">
@@ -241,7 +241,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>respHist</h4>
-<pre>final&nbsp;com.codahale.metrics.Histogram <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html#line.113">respHist</a></pre>
+<pre>final&nbsp;com.codahale.metrics.Histogram <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html#line.114">respHist</a></pre>
 </li>
 </ul>
 </li>
@@ -258,7 +258,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>MetricsConnection.CallTracker</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html#line.115">MetricsConnection.CallTracker</a>(com.codahale.metrics.MetricRegistry&nbsp;registry,
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html#line.116">MetricsConnection.CallTracker</a>(com.codahale.metrics.MetricRegistry&nbsp;registry,
                              <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;name,
                              <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;subName,
                              <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;scope)</pre>
@@ -270,7 +270,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MetricsConnection.CallTracker</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html#line.129">MetricsConnection.CallTracker</a>(com.codahale.metrics.MetricRegistry&nbsp;registry,
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html#line.130">MetricsConnection.CallTracker</a>(com.codahale.metrics.MetricRegistry&nbsp;registry,
                              <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;name,
                              <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;scope)</pre>
 </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>updateRpc</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html#line.133">updateRpc</a>(<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallStats</a>&nbsp;stats)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html#line.134">updateRpc</a>(<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallStats</a>&nbsp;stats)</pre>
 </li>
 </ul>
 <a name="toString()">
@@ -298,7 +298,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/client/MetricsConnection.CallTracker.html#line.140">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/client/MetricsConnection.CallTracker.html#line.141">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/f30982bd/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html b/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html
index c983df1..5722f21 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html
@@ -91,7 +91,7 @@
 </dl>
 <hr>
 <br>
-<pre>private static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.237">MetricsConnection.NewMetric</a>&lt;T&gt;</pre>
+<pre>private static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.238">MetricsConnection.NewMetric</a>&lt;T&gt;</pre>
 <div class="block">A lambda for dispatching to the appropriate metric factory method</div>
 </li>
 </ul>
@@ -138,7 +138,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>newMetric</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html" title="type parameter in MetricsConnection.NewMetric">T</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html#line.238">newMetric</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;clazz,
+<pre><a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html" title="type parameter in MetricsConnection.NewMetric">T</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html#line.239">newMetric</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;clazz,
           <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;name,
           <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;scope)</pre>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html b/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html
index dd1696e..6d57d54 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html
@@ -99,7 +99,7 @@
 </dl>
 <hr>
 <br>
-<pre>protected static class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.145">MetricsConnection.RegionStats</a>
+<pre>protected static class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.146">MetricsConnection.RegionStats</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>
@@ -196,7 +196,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>name</h4>
-<pre>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/client/MetricsConnection.RegionStats.html#line.146">name</a></pre>
+<pre>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/client/MetricsConnection.RegionStats.html#line.147">name</a></pre>
 </li>
 </ul>
 <a name="memstoreLoadHist">
@@ -205,7 +205,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>memstoreLoadHist</h4>
-<pre>final&nbsp;com.codahale.metrics.Histogram <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html#line.147">memstoreLoadHist</a></pre>
+<pre>final&nbsp;com.codahale.metrics.Histogram <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html#line.148">memstoreLoadHist</a></pre>
 </li>
 </ul>
 <a name="heapOccupancyHist">
@@ -214,7 +214,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>heapOccupancyHist</h4>
-<pre>final&nbsp;com.codahale.metrics.Histogram <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html#line.148">heapOccupancyHist</a></pre>
+<pre>final&nbsp;com.codahale.metrics.Histogram <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html#line.149">heapOccupancyHist</a></pre>
 </li>
 </ul>
 </li>
@@ -231,7 +231,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MetricsConnection.RegionStats</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html#line.150">MetricsConnection.RegionStats</a>(com.codahale.metrics.MetricRegistry&nbsp;registry,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html#line.151">MetricsConnection.RegionStats</a>(com.codahale.metrics.MetricRegistry&nbsp;registry,
                              <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;name)</pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>update</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html#line.158">update</a>(org.apache.hadoop.hbase.protobuf.generated.ClientProtos.RegionLoadStats&nbsp;regionStatistics)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html#line.159">update</a>(org.apache.hadoop.hbase.protobuf.generated.ClientProtos.RegionLoadStats&nbsp;regionStatistics)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html b/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html
index daf28f6..77e0391 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html
@@ -99,7 +99,7 @@
 </dl>
 <hr>
 <br>
-<pre>protected static class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.165">MetricsConnection.RunnerStats</a>
+<pre>protected static class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.166">MetricsConnection.RunnerStats</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>
@@ -203,7 +203,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>normalRunners</h4>
-<pre>final&nbsp;com.codahale.metrics.Counter <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html#line.166">normalRunners</a></pre>
+<pre>final&nbsp;com.codahale.metrics.Counter <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html#line.167">normalRunners</a></pre>
 </li>
 </ul>
 <a name="delayRunners">
@@ -212,7 +212,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>delayRunners</h4>
-<pre>final&nbsp;com.codahale.metrics.Counter <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html#line.167">delayRunners</a></pre>
+<pre>final&nbsp;com.codahale.metrics.Counter <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html#line.168">delayRunners</a></pre>
 </li>
 </ul>
 <a name="delayIntevalHist">
@@ -221,7 +221,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>delayIntevalHist</h4>
-<pre>final&nbsp;com.codahale.metrics.Histogram <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html#line.168">delayIntevalHist</a></pre>
+<pre>final&nbsp;com.codahale.metrics.Histogram <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html#line.169">delayIntevalHist</a></pre>
 </li>
 </ul>
 </li>
@@ -238,7 +238,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MetricsConnection.RunnerStats</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html#line.170">MetricsConnection.RunnerStats</a>(com.codahale.metrics.MetricRegistry&nbsp;registry)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html#line.171">MetricsConnection.RunnerStats</a>(com.codahale.metrics.MetricRegistry&nbsp;registry)</pre>
 </li>
 </ul>
 </li>
@@ -255,7 +255,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>incrNormalRunners</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html#line.179">incrNormalRunners</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html#line.180">incrNormalRunners</a>()</pre>
 </li>
 </ul>
 <a name="incrDelayRunners()">
@@ -264,7 +264,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>incrDelayRunners</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html#line.183">incrDelayRunners</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html#line.184">incrDelayRunners</a>()</pre>
 </li>
 </ul>
 <a name="updateDelayInterval(long)">
@@ -273,7 +273,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>updateDelayInterval</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html#line.187">updateDelayInterval</a>(long&nbsp;interval)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html#line.188">updateDelayInterval</a>(long&nbsp;interval)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.html b/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.html
index 037df63..eb2a78c 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/MetricsConnection.html
@@ -308,6 +308,10 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html" title="interface in org.apache.hadoop.hbase.client">MetricsConnection.NewMetric</a>&lt;com.codahale.metrics.Timer&gt;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.html#timerFactory">timerFactory</a></strong></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>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="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.html#UNKNOWN_EXCEPTION">UNKNOWN_EXCEPTION</a></strong></code>&nbsp;</td>
+</tr>
 </table>
 </li>
 </ul>
@@ -526,13 +530,23 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.client.MetricsConnection.CACHE_BASE">Constant Field Values</a></dd></dl>
 </li>
 </ul>
+<a name="UNKNOWN_EXCEPTION">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>UNKNOWN_EXCEPTION</h4>
+<pre>private static 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/client/MetricsConnection.html#line.66">UNKNOWN_EXCEPTION</a></pre>
+<dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.client.MetricsConnection.UNKNOWN_EXCEPTION">Constant Field Values</a></dd></dl>
+</li>
+</ul>
 <a name="CLIENT_SVC">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>CLIENT_SVC</h4>
-<pre>private static 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/client/MetricsConnection.html#line.66">CLIENT_SVC</a></pre>
+<pre>private static 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/client/MetricsConnection.html#line.67">CLIENT_SVC</a></pre>
 </li>
 </ul>
 <a name="serverStats">
@@ -541,7 +555,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>serverStats</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</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/concurrent/ConcurrentMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentMap</a>&lt;byte[],<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.RegionStats</a>&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.193">serverStats</a></pre>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</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/concurrent/ConcurrentMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentMap</a>&lt;byte[],<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.RegionStats</a>&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.194">serverStats</a></pre>
 </li>
 </ul>
 <a name="CAPACITY">
@@ -550,7 +564,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>CAPACITY</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.242">CAPACITY</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.243">CAPACITY</a></pre>
 <div class="block">Anticipated number of metric entries</div>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.client.MetricsConnection.CAPACITY">Constant Field Values</a></dd></dl>
 </li>
@@ -561,7 +575,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>LOAD_FACTOR</h4>
-<pre>private static final&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.244">LOAD_FACTOR</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.245">LOAD_FACTOR</a></pre>
 <div class="block">Default load factor from <a href="http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html?is-external=true#DEFAULT_LOAD_FACTOR" title="class or interface in java.util"><code>HashMap.DEFAULT_LOAD_FACTOR</code></a></div>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.client.MetricsConnection.LOAD_FACTOR">Constant Field Values</a></dd></dl>
 </li>
@@ -572,7 +586,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>CONCURRENCY_LEVEL</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.249">CONCURRENCY_LEVEL</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.250">CONCURRENCY_LEVEL</a></pre>
 <div class="block">Anticipated number of concurrent accessor threads, from
  <a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html#getBatchPool()"><code>ConnectionImplementation.getBatchPool()</code></a></div>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.client.MetricsConnection.CONCURRENCY_LEVEL">Constant Field Values</a></dd></dl>
@@ -584,7 +598,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>registry</h4>
-<pre>private final&nbsp;com.codahale.metrics.MetricRegistry <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.251">registry</a></pre>
+<pre>private final&nbsp;com.codahale.metrics.MetricRegistry <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.252">registry</a></pre>
 </li>
 </ul>
 <a name="reporter">
@@ -593,7 +607,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>reporter</h4>
-<pre>private final&nbsp;com.codahale.metrics.JmxReporter <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.252">reporter</a></pre>
+<pre>private final&nbsp;com.codahale.metrics.JmxReporter <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.253">reporter</a></pre>
 </li>
 </ul>
 <a name="scope">
@@ -602,7 +616,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>scope</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/client/MetricsConnection.html#line.253">scope</a></pre>
+<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/client/MetricsConnection.html#line.254">scope</a></pre>
 </li>
 </ul>
 <a name="timerFactory">
@@ -611,7 +625,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>timerFactory</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html" title="interface in org.apache.hadoop.hbase.client">MetricsConnection.NewMetric</a>&lt;com.codahale.metrics.Timer&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.255">timerFactory</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html" title="interface in org.apache.hadoop.hbase.client">MetricsConnection.NewMetric</a>&lt;com.codahale.metrics.Timer&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.256">timerFactory</a></pre>
 </li>
 </ul>
 <a name="histogramFactory">
@@ -620,7 +634,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>histogramFactory</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html" title="interface in org.apache.hadoop.hbase.client">MetricsConnection.NewMetric</a>&lt;com.codahale.metrics.Histogram&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.261">histogramFactory</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html" title="interface in org.apache.hadoop.hbase.client">MetricsConnection.NewMetric</a>&lt;com.codahale.metrics.Histogram&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.262">histogramFactory</a></pre>
 </li>
 </ul>
 <a name="counterFactory">
@@ -629,7 +643,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>counterFactory</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html" title="interface in org.apache.hadoop.hbase.client">MetricsConnection.NewMetric</a>&lt;com.codahale.metrics.Counter&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.267">counterFactory</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html" title="interface in org.apache.hadoop.hbase.client">MetricsConnection.NewMetric</a>&lt;com.codahale.metrics.Counter&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.268">counterFactory</a></pre>
 </li>
 </ul>
 <a name="metaCacheHits">
@@ -638,7 +652,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>metaCacheHits</h4>
-<pre>protected final&nbsp;com.codahale.metrics.Counter <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.275">metaCacheHits</a></pre>
+<pre>protected final&nbsp;com.codahale.metrics.Counter <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.276">metaCacheHits</a></pre>
 </li>
 </ul>
 <a name="metaCacheMisses">
@@ -647,7 +661,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>metaCacheMisses</h4>
-<pre>protected final&nbsp;com.codahale.metrics.Counter <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.276">metaCacheMisses</a></pre>
+<pre>protected final&nbsp;com.codahale.metrics.Counter <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.277">metaCacheMisses</a></pre>
 </li>
 </ul>
 <a name="getTracker">
@@ -656,7 +670,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>getTracker</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.277">getTracker</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.278">getTracker</a></pre>
 </li>
 </ul>
 <a name="scanTracker">
@@ -665,7 +679,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>scanTracker</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.278">scanTracker</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.279">scanTracker</a></pre>
 </li>
 </ul>
 <a name="appendTracker">
@@ -674,7 +688,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>appendTracker</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.279">appendTracker</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.280">appendTracker</a></pre>
 </li>
 </ul>
 <a name="deleteTracker">
@@ -683,7 +697,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteTracker</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.280">deleteTracker</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.281">deleteTracker</a></pre>
 </li>
 </ul>
 <a name="incrementTracker">
@@ -692,7 +706,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>incrementTracker</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.281">incrementTracker</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.282">incrementTracker</a></pre>
 </li>
 </ul>
 <a name="putTracker">
@@ -701,7 +715,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>putTracker</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.282">putTracker</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.283">putTracker</a></pre>
 </li>
 </ul>
 <a name="multiTracker">
@@ -710,7 +724,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>multiTracker</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.283">multiTracker</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.284">multiTracker</a></pre>
 </li>
 </ul>
 <a name="runnerStats">
@@ -719,7 +733,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>runnerStats</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.RunnerStats</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.284">runnerStats</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.RunnerStats</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.285">runnerStats</a></pre>
 </li>
 </ul>
 <a name="metaCacheNumClearServer">
@@ -728,7 +742,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>metaCacheNumClearServer</h4>
-<pre>private final&nbsp;com.codahale.metrics.Counter <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.285">metaCacheNumClearServer</a></pre>
+<pre>private final&nbsp;com.codahale.metrics.Counter <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.286">metaCacheNumClearServer</a></pre>
 </li>
 </ul>
 <a name="metaCacheNumClearRegion">
@@ -737,7 +751,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>metaCacheNumClearRegion</h4>
-<pre>private final&nbsp;com.codahale.metrics.Counter <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.286">metaCacheNumClearRegion</a></pre>
+<pre>private final&nbsp;com.codahale.metrics.Counter <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.287">metaCacheNumClearRegion</a></pre>
 </li>
 </ul>
 <a name="rpcTimers">
@@ -746,7 +760,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>rpcTimers</h4>
-<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentMap</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>,com.codahale.metrics.Timer&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.293">rpcTimers</a></pre>
+<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentMap</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>,com.codahale.metrics.Timer&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.294">rpcTimers</a></pre>
 </li>
 </ul>
 <a name="rpcHistograms">
@@ -755,7 +769,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>rpcHistograms</h4>
-<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentMap</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>,com.codahale.metrics.Histogram&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.295">rpcHistograms</a></pre>
+<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentMap</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>,com.codahale.metrics.Histogram&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.296">rpcHistograms</a></pre>
 </li>
 </ul>
 <a name="cacheDroppingExceptions">
@@ -764,7 +778,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cacheDroppingExceptions</h4>
-<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentMap</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>,com.codahale.metrics.Counter&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.298">cacheDroppingExceptions</a></pre>
+<pre>private final&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentMap</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>,com.codahale.metrics.Counter&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.299">cacheDroppingExceptions</a></pre>
 </li>
 </ul>
 </li>
@@ -781,7 +795,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MetricsConnection</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.301">MetricsConnection</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html" title="class in org.apache.hadoop.hbase.client">ConnectionImplementation</a>&nbsp;conn)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.302">MetricsConnection</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ConnectionImplementation.html" title="class in org.apache.hadoop.hbase.client">ConnectionImplementation</a>&nbsp;conn)</pre>
 </li>
 </ul>
 </li>
@@ -798,7 +812,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>updateServerStats</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.196">updateServerStats</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.197">updateServerStats</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                      byte[]&nbsp;regionName,
                      <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;r)</pre>
 </li>
@@ -809,7 +823,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>updateRegionStats</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.210">updateRegionStats</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.211">updateRegionStats</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                      byte[]&nbsp;regionName,
                      org.apache.hadoop.hbase.protobuf.generated.ClientProtos.RegionLoadStats&nbsp;stats)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrackable.html#updateRegionStats(org.apache.hadoop.hbase.ServerName,%20byte[],%20org.apache.hadoop.hbase.protobuf.generated.ClientProtos.RegionLoadStats)">StatisticTrackable</a></code></strong></div>
@@ -826,7 +840,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.340">shutdown</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.341">shutdown</a>()</pre>
 </li>
 </ul>
 <a name="newCallStats()">
@@ -835,7 +849,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>newCallStats</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallStats</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.345">newCallStats</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallStats</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.346">newCallStats</a>()</pre>
 <div class="block">Produce an instance of <a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html" title="class in org.apache.hadoop.hbase.client"><code>MetricsConnection.CallStats</code></a> for clients to attach to RPCs.</div>
 </li>
 </ul>
@@ -845,7 +859,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>incrMetaCacheHit</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.351">incrMetaCacheHit</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.352">incrMetaCacheHit</a>()</pre>
 <div class="block">Increment the number of meta cache hits.</div>
 </li>
 </ul>
@@ -855,7 +869,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>incrMetaCacheMiss</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.356">incrMetaCacheMiss</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.357">incrMetaCacheMiss</a>()</pre>
 <div class="block">Increment the number of meta cache misses.</div>
 </li>
 </ul>
@@ -865,7 +879,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>incrMetaCacheNumClearServer</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.361">incrMetaCacheNumClearServer</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.362">incrMetaCacheNumClearServer</a>()</pre>
 <div class="block">Increment the number of meta cache drops requested for entire RegionServer.</div>
 </li>
 </ul>
@@ -875,7 +889,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>incrMetaCacheNumClearRegion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.366">incrMetaCacheNumClearRegion</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.367">incrMetaCacheNumClearRegion</a>()</pre>
 <div class="block">Increment the number of meta cache drops requested for individual region.</div>
 </li>
 </ul>
@@ -885,7 +899,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>incrNormalRunners</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.371">incrNormalRunners</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.372">incrNormalRunners</a>()</pre>
 <div class="block">Increment the number of normal runner counts.</div>
 </li>
 </ul>
@@ -895,7 +909,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>incrDelayRunners</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.376">incrDelayRunners</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.377">incrDelayRunners</a>()</pre>
 <div class="block">Increment the number of delay runner counts.</div>
 </li>
 </ul>
@@ -905,7 +919,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>updateDelayInterval</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.381">updateDelayInterval</a>(long&nbsp;interval)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.382">updateDelayInterval</a>(long&nbsp;interval)</pre>
 <div class="block">Update delay interval of delay runner.</div>
 </li>
 </ul>
@@ -915,7 +929,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetric</h4>
-<pre>private&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.388">getMetric</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;key,
+<pre>private&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.389">getMetric</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;key,
               <a href="http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentMap</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>,T&gt;&nbsp;map,
               <a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html" title="interface in org.apache.hadoop.hbase.client">MetricsConnection.NewMetric</a>&lt;T&gt;&nbsp;factory)</pre>
 <div class="block">Get a metric for <code>key</code> from <code>map</code>, or create it with <code>factory</code>.</div>
@@ -927,7 +941,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>updateRpcGeneric</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.399">updateRpcGeneric</a>(com.google.protobuf.Descriptors.MethodDescriptor&nbsp;method,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.400">updateRpcGeneric</a>(com.google.protobuf.Descriptors.MethodDescriptor&nbsp;method,
                     <a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallStats</a>&nbsp;stats)</pre>
 <div class="block">Update call stats for non-critical-path methods</div>
 </li>
@@ -938,7 +952,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockList">
 <li class="blockList">
 <h4>updateRpc</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.410">updateRpc</a>(com.google.protobuf.Descriptors.MethodDescriptor&nbsp;method,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.411">updateRpc</a>(com.google.protobuf.Descriptors.MethodDescriptor&nbsp;method,
              com.google.protobuf.Message&nbsp;param,
              <a href="../../../../../org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection.CallStats</a>&nbsp;stats)</pre>
 <div class="block">Report RPC context to metrics system.</div>
@@ -950,7 +964,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/StatisticTrack
 <ul class="blockListLast">
 <li class="blockList">
 <h4>incrCacheDroppingExceptions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.466">incrCacheDroppingExceptions</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;exception)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/MetricsConnection.html#line.467">incrCacheDroppingExceptions</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;exception)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 2c3fb3d..3dc82b5 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -395,13 +395,13 @@
 <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/Admin.MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">Admin.MasterSwitchType</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>
+<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/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/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">TableState.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Admin.MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">Admin.MasterSwitchType</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/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/AsyncProcess.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="strong">AsyncProcess.Retry</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.CreateAsyncCallback.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.CreateAsyncCallback.html b/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.CreateAsyncCallback.html
index d8c9d46..ac8347e 100644
--- a/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.CreateAsyncCallback.html
+++ b/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.CreateAsyncCallback.html
@@ -124,7 +124,7 @@ implements org.apache.zookeeper.AsyncCallback.StringCallback</pre>
 <!--   -->
 </a>
 <h3>Nested classes/interfaces inherited from interface&nbsp;org.apache.zookeeper.AsyncCallback</h3>
-<code>org.apache.zookeeper.AsyncCallback.ACLCallback, org.apache.zookeeper.AsyncCallback.Children2Callback, org.apache.zookeeper.AsyncCallback.ChildrenCallback, org.apache.zookeeper.AsyncCallback.DataCallback, org.apache.zookeeper.AsyncCallback.StatCallback, org.apache.zookeeper.AsyncCallback.StringCallback, org.apache.zookeeper.AsyncCallback.VoidCallback</code></li>
+<code>org.apache.zookeeper.AsyncCallback.ACLCallback, org.apache.zookeeper.AsyncCallback.Children2Callback, org.apache.zookeeper.AsyncCallback.ChildrenCallback, org.apache.zookeeper.AsyncCallback.DataCallback, org.apache.zookeeper.AsyncCallback.MultiCallback, org.apache.zookeeper.AsyncCallback.StatCallback, org.apache.zookeeper.AsyncCallback.StringCallback, org.apache.zookeeper.AsyncCallback.VoidCallback</code></li>
 </ul>
 </li>
 </ul>


[45/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html b/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html
index 53eb6dc..9fa12cd 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.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 class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.82">AsyncRpcChannel</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.83">AsyncRpcChannel</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">Netty RPC channel</div>
 </li>
@@ -212,7 +212,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected static <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;org.apache.hadoop.hbase.protobuf.generated.AuthenticationProtos.TokenIdentifier.Kind,org.apache.hadoop.security.token.TokenSelector&lt;? extends org.apache.hadoop.security.token.TokenIdentifier&gt;&gt;</code></td>
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#tokenHandlers">tokenHandlers</a></strong></code>&nbsp;</td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#TOKEN_HANDDLERS">TOKEN_HANDDLERS</a></strong></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
@@ -286,58 +286,61 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 </td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#close0(java.lang.Throwable)">close0</a></strong>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;e)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>private io.netty.channel.ChannelFuture</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#connect(io.netty.bootstrap.Bootstrap)">connect</a></strong>(io.netty.bootstrap.Bootstrap&nbsp;bootstrap)</code>
 <div class="block">Connect to channel</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/ipc/AsyncRpcChannel.html#createPreamble(io.netty.buffer.ByteBuf,%20org.apache.hadoop.hbase.security.AuthMethod)">createPreamble</a></strong>(io.netty.buffer.ByteBuf&nbsp;byteBuf,
                             <a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security">AuthMethod</a>&nbsp;authMethod)</code>
 <div class="block">Create connection preamble</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/ipc/AsyncRpcChannel.html#equals(java.lang.Object)">equals</a></strong>(<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;obj)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#getConnectionHashCode()">getConnectionHashCode</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/security/SaslClientHandler.html" title="class in org.apache.hadoop.hbase.security">SaslClientHandler</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#getSaslHandler(org.apache.hadoop.security.UserGroupInformation,%20io.netty.bootstrap.Bootstrap)">getSaslHandler</a></strong>(org.apache.hadoop.security.UserGroupInformation&nbsp;realTicket,
                             io.netty.bootstrap.Bootstrap&nbsp;bootstrap)</code>
 <div class="block">Get SASL handler</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/ipc/AsyncRpcChannel.html#handleSaslConnectionFailure(int,%20java.lang.Throwable,%20org.apache.hadoop.security.UserGroupInformation)">handleSaslConnectionFailure</a></strong>(int&nbsp;currRetries,
                                                       <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;ex,
                                                       org.apache.hadoop.security.UserGroupInformation&nbsp;user)</code>
-<div class="block">If multiple clients with the same principal try to connect
- to the same server at the same time, the server assumes a
- replay attack is in progress.</div>
+<div class="block">If multiple clients with the same principal try to connect to the same server at the same time,
+ the server assumes a replay attack is in progress.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#hashCode()">hashCode</a></strong>()</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/ipc/AsyncRpcChannel.html#isAlive()">isAlive</a></strong>()</code>
 <div class="block">Check if the connection is alive</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncCall.html" title="class in org.apache.hadoop.hbase.ipc">AsyncCall</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#removePendingCall(int)">removePendingCall</a></strong>(int&nbsp;id)</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/ipc/AsyncRpcChannel.html#retryOrClose(io.netty.bootstrap.Bootstrap,%20int,%20long,%20java.lang.Throwable)">retryOrClose</a></strong>(io.netty.bootstrap.Bootstrap&nbsp;bootstrap,
                         int&nbsp;failureCount,
@@ -346,35 +349,35 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <div class="block">Retry to connect or close</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/ipc/AsyncRpcChannel.html#setupAuthorization()">setupAuthorization</a></strong>()</code>
 <div class="block">Set up server authorization</div>
 </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/ipc/AsyncRpcChannel.html#shouldAuthenticateOverKrb()">shouldAuthenticateOverKrb</a></strong>()</code>
 <div class="block">Check if user should authenticate over Kerberos</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/ipc/AsyncRpcChannel.html#startHBaseConnection(io.netty.channel.Channel)">startHBaseConnection</a></strong>(io.netty.channel.Channel&nbsp;ch)</code>
 <div class="block">Start HBase connection</div>
 </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/ipc/AsyncRpcChannel.html#toString()">toString</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private io.netty.channel.ChannelFuture</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#writeChannelHeader(io.netty.channel.Channel)">writeChannelHeader</a></strong>(io.netty.channel.Channel&nbsp;channel)</code>
 <div class="block">Write the channel header</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/ipc/AsyncRpcChannel.html#writeRequest(org.apache.hadoop.hbase.ipc.AsyncCall)">writeRequest</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncCall.html" title="class in org.apache.hadoop.hbase.ipc">AsyncCall</a>&nbsp;call)</code>
 <div class="block">Write request to channel</div>
@@ -408,7 +411,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <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/ipc/AsyncRpcChannel.html#line.83">LOG</a></pre>
+<pre>private static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.84">LOG</a></pre>
 </li>
 </ul>
 <a name="MAX_SASL_RETRIES">
@@ -417,17 +420,17 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>MAX_SASL_RETRIES</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.85">MAX_SASL_RETRIES</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.86">MAX_SASL_RETRIES</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.ipc.AsyncRpcChannel.MAX_SASL_RETRIES">Constant Field Values</a></dd></dl>
 </li>
 </ul>
-<a name="tokenHandlers">
+<a name="TOKEN_HANDDLERS">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>tokenHandlers</h4>
-<pre>protected static 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;org.apache.hadoop.hbase.protobuf.generated.AuthenticationProtos.TokenIdentifier.Kind,org.apache.hadoop.security.token.TokenSelector&lt;? extends org.apache.hadoop.security.token.TokenIdentifier&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.88">tokenHandlers</a></pre>
+<h4>TOKEN_HANDDLERS</h4>
+<pre>protected static 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;org.apache.hadoop.hbase.protobuf.generated.AuthenticationProtos.TokenIdentifier.Kind,org.apache.hadoop.security.token.TokenSelector&lt;? extends org.apache.hadoop.security.token.TokenIdentifier&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.88">TOKEN_HANDDLERS</a></pre>
 </li>
 </ul>
 <a name="client">
@@ -436,7 +439,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>client</h4>
-<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcClient.html" title="class in org.apache.hadoop.hbase.ipc">AsyncRpcClient</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.95">client</a></pre>
+<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcClient.html" title="class in org.apache.hadoop.hbase.ipc">AsyncRpcClient</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.96">client</a></pre>
 </li>
 </ul>
 <a name="channel">
@@ -445,7 +448,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>channel</h4>
-<pre>private&nbsp;io.netty.channel.Channel <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.99">channel</a></pre>
+<pre>private&nbsp;io.netty.channel.Channel <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.100">channel</a></pre>
 </li>
 </ul>
 <a name="name">
@@ -454,7 +457,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>name</h4>
-<pre><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/ipc/AsyncRpcChannel.html#line.101">name</a></pre>
+<pre><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/ipc/AsyncRpcChannel.html#line.102">name</a></pre>
 </li>
 </ul>
 <a name="ticket">
@@ -463,7 +466,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>ticket</h4>
-<pre>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/AsyncRpcChannel.html#line.102">ticket</a></pre>
+<pre>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/AsyncRpcChannel.html#line.103">ticket</a></pre>
 </li>
 </ul>
 <a name="serviceName">
@@ -472,7 +475,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>serviceName</h4>
-<pre>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/ipc/AsyncRpcChannel.html#line.103">serviceName</a></pre>
+<pre>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/ipc/AsyncRpcChannel.html#line.104">serviceName</a></pre>
 </li>
 </ul>
 <a name="address">
@@ -481,7 +484,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>address</h4>
-<pre>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/AsyncRpcChannel.html#line.104">address</a></pre>
+<pre>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/AsyncRpcChannel.html#line.105">address</a></pre>
 </li>
 </ul>
 <a name="failureCounter">
@@ -490,7 +493,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>failureCounter</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.106">failureCounter</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.107">failureCounter</a></pre>
 </li>
 </ul>
 <a name="useSasl">
@@ -499,7 +502,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>useSasl</h4>
-<pre>boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.108">useSasl</a></pre>
+<pre>boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.109">useSasl</a></pre>
 </li>
 </ul>
 <a name="authMethod">
@@ -508,7 +511,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>authMethod</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security">AuthMethod</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.109">authMethod</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security">AuthMethod</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.110">authMethod</a></pre>
 </li>
 </ul>
 <a name="reloginMaxBackoff">
@@ -517,7 +520,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>reloginMaxBackoff</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.110">reloginMaxBackoff</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.111">reloginMaxBackoff</a></pre>
 </li>
 </ul>
 <a name="token">
@@ -526,7 +529,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>token</h4>
-<pre>private&nbsp;org.apache.hadoop.security.token.Token&lt;? extends org.apache.hadoop.security.token.TokenIdentifier&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.111">token</a></pre>
+<pre>private&nbsp;org.apache.hadoop.security.token.Token&lt;? extends org.apache.hadoop.security.token.TokenIdentifier&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.112">token</a></pre>
 </li>
 </ul>
 <a name="serverPrincipal">
@@ -535,7 +538,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>serverPrincipal</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/ipc/AsyncRpcChannel.html#line.112">serverPrincipal</a></pre>
+<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/ipc/AsyncRpcChannel.html#line.113">serverPrincipal</a></pre>
 </li>
 </ul>
 <a name="pendingCalls">
@@ -597,7 +600,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AsyncRpcChannel</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.138">AsyncRpcChannel</a>(io.netty.bootstrap.Bootstrap&nbsp;bootstrap,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.137">AsyncRpcChannel</a>(io.netty.bootstrap.Bootstrap&nbsp;bootstrap,
                <a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcClient.html" title="class in org.apache.hadoop.hbase.ipc">AsyncRpcClient</a>&nbsp;client,
                <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;ticket,
                <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;serviceName,
@@ -620,7 +623,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>connect</h4>
-<pre>private&nbsp;io.netty.channel.ChannelFuture&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.161">connect</a>(io.netty.bootstrap.Bootstrap&nbsp;bootstrap)</pre>
+<pre>private&nbsp;io.netty.channel.ChannelFuture&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.156">connect</a>(io.netty.bootstrap.Bootstrap&nbsp;bootstrap)</pre>
 <div class="block">Connect to channel</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>bootstrap</code> - to connect to</dd>
 <dt><span class="strong">Returns:</span></dt><dd>future of connection</dd></dl>
@@ -632,7 +635,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>startHBaseConnection</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.215">startHBaseConnection</a>(io.netty.channel.Channel&nbsp;ch)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.209">startHBaseConnection</a>(io.netty.channel.Channel&nbsp;ch)</pre>
 <div class="block">Start HBase connection</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>ch</code> - channel to start connection on</dd></dl>
 </li>
@@ -643,7 +646,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getSaslHandler</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/SaslClientHandler.html" title="class in org.apache.hadoop.hbase.security">SaslClientHandler</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.248">getSaslHandler</a>(org.apache.hadoop.security.UserGroupInformation&nbsp;realTicket,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/security/SaslClientHandler.html" title="class in org.apache.hadoop.hbase.security">SaslClientHandler</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.242">getSaslHandler</a>(org.apache.hadoop.security.UserGroupInformation&nbsp;realTicket,
                                io.netty.bootstrap.Bootstrap&nbsp;bootstrap)
                                   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 SASL handler</div>
@@ -659,7 +662,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>retryOrClose</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.281">retryOrClose</a>(io.netty.bootstrap.Bootstrap&nbsp;bootstrap,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.275">retryOrClose</a>(io.netty.bootstrap.Bootstrap&nbsp;bootstrap,
                 int&nbsp;failureCount,
                 long&nbsp;timeout,
                 <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;e)</pre>
@@ -673,7 +676,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>callMethod</h4>
-<pre>public&nbsp;io.netty.util.concurrent.Promise&lt;com.google.protobuf.Message&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.303">callMethod</a>(com.google.protobuf.Descriptors.MethodDescriptor&nbsp;method,
+<pre>public&nbsp;io.netty.util.concurrent.Promise&lt;com.google.protobuf.Message&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.297">callMethod</a>(com.google.protobuf.Descriptors.MethodDescriptor&nbsp;method,
                                                                        <a href="../../../../../org/apache/hadoop/hbase/ipc/PayloadCarryingRpcController.html" title="class in org.apache.hadoop.hbase.ipc">PayloadCarryingRpcController</a>&nbsp;controller,
                                                                        com.google.protobuf.Message&nbsp;request,
                                                                        com.google.protobuf.Message&nbsp;responsePrototype,
@@ -688,7 +691,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>removePendingCall</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncCall.html" title="class in org.apache.hadoop.hbase.ipc">AsyncCall</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.346">removePendingCall</a>(int&nbsp;id)</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncCall.html" title="class in org.apache.hadoop.hbase.ipc">AsyncCall</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.337">removePendingCall</a>(int&nbsp;id)</pre>
 </li>
 </ul>
 <a name="writeChannelHeader(io.netty.channel.Channel)">
@@ -697,7 +700,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>writeChannelHeader</h4>
-<pre>private&nbsp;io.netty.channel.ChannelFuture&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.359">writeChannelHeader</a>(io.netty.channel.Channel&nbsp;channel)
+<pre>private&nbsp;io.netty.channel.ChannelFuture&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.349">writeChannelHeader</a>(io.netty.channel.Channel&nbsp;channel)
                                                    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">Write the channel header</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>channel</code> - to write to</dd>
@@ -712,7 +715,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>writeRequest</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.394">writeRequest</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncCall.html" title="class in org.apache.hadoop.hbase.ipc">AsyncCall</a>&nbsp;call)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.382">writeRequest</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncCall.html" title="class in org.apache.hadoop.hbase.ipc">AsyncCall</a>&nbsp;call)</pre>
 <div class="block">Write request to channel</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>call</code> - to write</dd></dl>
 </li>
@@ -723,7 +726,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setupAuthorization</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.442">setupAuthorization</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.429">setupAuthorization</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">Set up server authorization</div>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -736,7 +739,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>buildUserInfo</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.protobuf.generated.RPCProtos.UserInformation&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.492">buildUserInfo</a>(org.apache.hadoop.security.UserGroupInformation&nbsp;ugi,
+<pre>private&nbsp;org.apache.hadoop.hbase.protobuf.generated.RPCProtos.UserInformation&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.478">buildUserInfo</a>(org.apache.hadoop.security.UserGroupInformation&nbsp;ugi,
                                                                                  <a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security">AuthMethod</a>&nbsp;authMethod)</pre>
 <div class="block">Build the user information</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>ugi</code> - User Group Information</dd><dd><code>authMethod</code> - Authorization method</dd>
@@ -749,19 +752,28 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createPreamble</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.517">createPreamble</a>(io.netty.buffer.ByteBuf&nbsp;byteBuf,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.502">createPreamble</a>(io.netty.buffer.ByteBuf&nbsp;byteBuf,
                   <a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security">AuthMethod</a>&nbsp;authMethod)</pre>
 <div class="block">Create connection preamble</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>byteBuf</code> - to write to</dd><dd><code>authMethod</code> - to write</dd></dl>
 </li>
 </ul>
+<a name="close0(java.lang.Throwable)">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>close0</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.508">close0</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;e)</pre>
+</li>
+</ul>
 <a name="close(java.lang.Throwable)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.528">close</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;e)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.549">close</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;e)</pre>
 <div class="block">Close connection</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>e</code> - exception on close</dd></dl>
 </li>
@@ -772,7 +784,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanupCalls</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.575">cleanupCalls</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.568">cleanupCalls</a>()</pre>
 <div class="block">Clean up calls.</div>
 </li>
 </ul>
@@ -782,7 +794,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>isAlive</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.613">isAlive</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.603">isAlive</a>()</pre>
 <div class="block">Check if the connection is alive</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>true if alive</dd></dl>
 </li>
@@ -793,7 +805,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldAuthenticateOverKrb</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.623">shouldAuthenticateOverKrb</a>()
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.612">shouldAuthenticateOverKrb</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">Check if user should authenticate over Kerberos</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>true if should be authenticated over Kerberos</dd>
@@ -807,26 +819,22 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>handleSaslConnectionFailure</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.660">handleSaslConnectionFailure</a>(int&nbsp;currRetries,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.643">handleSaslConnectionFailure</a>(int&nbsp;currRetries,
                                <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;ex,
                                org.apache.hadoop.security.UserGroupInformation&nbsp;user)
                                   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>,
                                          <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
-<div class="block">If multiple clients with the same principal try to connect
- to the same server at the same time, the server assumes a
- replay attack is in progress. This is a feature of kerberos.
- In order to work around this, what is done is that the client
- backs off randomly and tries to initiate the connection
- again.
- The other problem is to do with ticket expiry. To handle that,
- a relogin is attempted.
+<div class="block">If multiple clients with the same principal try to connect to the same server at the same time,
+ the server assumes a replay attack is in progress. This is a feature of kerberos. In order to
+ work around this, what is done is that the client backs off randomly and tries to initiate the
+ connection again. The other problem is to do with ticket expiry. To handle that, a relogin is
+ attempted.
  <p>
- The retry logic is governed by the <a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#shouldAuthenticateOverKrb()"><code>shouldAuthenticateOverKrb()</code></a>
- method. In case when the user doesn't have valid credentials, we don't
- need to retry (from cache or ticket). In such cases, it is prudent to
- throw a runtime exception when we receive a SaslException from the
- underlying authentication implementation, so there is no retry from
- other high level (for eg, HCM or HBaseAdmin).
+ The retry logic is governed by the <a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#shouldAuthenticateOverKrb()"><code>shouldAuthenticateOverKrb()</code></a> method. In case when the
+ user doesn't have valid credentials, we don't need to retry (from cache or ticket). In such
+ cases, it is prudent to throw a runtime exception when we receive a SaslException from the
+ underlying authentication implementation, so there is no retry from other high level (for eg,
+ HCM or HBaseAdmin).
  </p></div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>currRetries</code> - retry count</dd><dd><code>ex</code> - exception describing fail</dd><dd><code>user</code> - which is trying to connect</dd>
 <dt><span class="strong">Throws:</span></dt>
@@ -840,7 +848,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getConnectionHashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.703">getConnectionHashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.683">getConnectionHashCode</a>()</pre>
 </li>
 </ul>
 <a name="hashCode()">
@@ -849,7 +857,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>hashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.708">hashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.688">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>
@@ -862,7 +870,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.713">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;obj)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.693">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;obj)</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>
@@ -875,7 +883,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/ipc/AsyncRpcChannel.html#line.723">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/ipc/AsyncRpcChannel.html#line.702">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/f30982bd/devapidocs/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html b/devapidocs/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html
index efc4f5c..5d3af8a 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html
@@ -92,6 +92,9 @@
 <li>io.netty.channel.ChannelInboundHandlerAdapter</li>
 <li>
 <ul class="inheritance">
+<li>io.netty.channel.SimpleChannelInboundHandler&lt;io.netty.buffer.ByteBuf&gt;</li>
+<li>
+<ul class="inheritance">
 <li>org.apache.hadoop.hbase.ipc.AsyncServerResponseHandler</li>
 </ul>
 </li>
@@ -100,6 +103,8 @@
 </ul>
 </li>
 </ul>
+</li>
+</ul>
 <div class="description">
 <ul class="blockList">
 <li class="blockList">
@@ -111,7 +116,7 @@
 <br>
 <pre><a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Private.html" title="annotation in org.apache.hadoop.hbase.classification">@InterfaceAudience.Private</a>
 public class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html#line.39">AsyncServerResponseHandler</a>
-extends io.netty.channel.ChannelInboundHandlerAdapter</pre>
+extends io.netty.channel.SimpleChannelInboundHandler&lt;io.netty.buffer.ByteBuf&gt;</pre>
 <div class="block">Handles Hbase responses</div>
 </li>
 </ul>
@@ -186,20 +191,36 @@ extends io.netty.channel.ChannelInboundHandlerAdapter</pre>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html#channelRead(io.netty.channel.ChannelHandlerContext,%20java.lang.Object)">channelRead</a></strong>(io.netty.channel.ChannelHandlerContext&nbsp;ctx,
-                      <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;msg)</code>&nbsp;</td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html#channelInactive(io.netty.channel.ChannelHandlerContext)">channelInactive</a></strong>(io.netty.channel.ChannelHandlerContext&nbsp;ctx)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>protected void</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html#channelRead0(io.netty.channel.ChannelHandlerContext,%20io.netty.buffer.ByteBuf)">channelRead0</a></strong>(io.netty.channel.ChannelHandlerContext&nbsp;ctx,
+                        io.netty.buffer.ByteBuf&nbsp;inBuffer)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>private org.apache.hadoop.ipc.RemoteException</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html#createRemoteException(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse)">createRemoteException</a></strong>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse&nbsp;e)</code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html#exceptionCaught(io.netty.channel.ChannelHandlerContext,%20java.lang.Throwable)">exceptionCaught</a></strong>(io.netty.channel.ChannelHandlerContext&nbsp;ctx,
+                              <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;cause)</code>&nbsp;</td>
+</tr>
 </table>
 <ul class="blockList">
+<li class="blockList"><a name="methods_inherited_from_class_io.netty.channel.SimpleChannelInboundHandler">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;io.netty.channel.SimpleChannelInboundHandler</h3>
+<code>acceptInboundMessage, channelRead</code></li>
+</ul>
+<ul class="blockList">
 <li class="blockList"><a name="methods_inherited_from_class_io.netty.channel.ChannelInboundHandlerAdapter">
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;io.netty.channel.ChannelInboundHandlerAdapter</h3>
-<code>channelActive, channelInactive, channelReadComplete, channelRegistered, channelUnregistered, channelWritabilityChanged, exceptionCaught, userEventTriggered</code></li>
+<code>channelActive, channelReadComplete, channelRegistered, channelUnregistered, channelWritabilityChanged, userEventTriggered</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods_inherited_from_class_io.netty.channel.ChannelHandlerAdapter">
@@ -259,7 +280,7 @@ extends io.netty.channel.ChannelInboundHandlerAdapter</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AsyncServerResponseHandler</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html#line.47">AsyncServerResponseHandler</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html" title="class in org.apache.hadoop.hbase.ipc">AsyncRpcChannel</a>&nbsp;channel)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html#line.46">AsyncServerResponseHandler</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html" title="class in org.apache.hadoop.hbase.ipc">AsyncRpcChannel</a>&nbsp;channel)</pre>
 <div class="block">Constructor</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>channel</code> - on which this response handler operates</dd></dl>
 </li>
@@ -272,20 +293,55 @@ extends io.netty.channel.ChannelInboundHandlerAdapter</pre>
 <!--   -->
 </a>
 <h3>Method Detail</h3>
-<a name="channelRead(io.netty.channel.ChannelHandlerContext, java.lang.Object)">
+<a name="channelRead0(io.netty.channel.ChannelHandlerContext, io.netty.buffer.ByteBuf)">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>channelRead0</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html#line.51">channelRead0</a>(io.netty.channel.ChannelHandlerContext&nbsp;ctx,
+                io.netty.buffer.ByteBuf&nbsp;inBuffer)
+                     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><strong>Specified by:</strong></dt>
+<dd><code>channelRead0</code>&nbsp;in class&nbsp;<code>io.netty.channel.SimpleChannelInboundHandler&lt;io.netty.buffer.ByteBuf&gt;</code></dd>
+<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>
+</li>
+</ul>
+<a name="exceptionCaught(io.netty.channel.ChannelHandlerContext, java.lang.Throwable)">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>exceptionCaught</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html#line.104">exceptionCaught</a>(io.netty.channel.ChannelHandlerContext&nbsp;ctx,
+                   <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;cause)
+                     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><strong>Specified by:</strong></dt>
+<dd><code>exceptionCaught</code>&nbsp;in interface&nbsp;<code>io.netty.channel.ChannelHandler</code></dd>
+<dt><strong>Specified by:</strong></dt>
+<dd><code>exceptionCaught</code>&nbsp;in interface&nbsp;<code>io.netty.channel.ChannelInboundHandler</code></dd>
+<dt><strong>Overrides:</strong></dt>
+<dd><code>exceptionCaught</code>&nbsp;in class&nbsp;<code>io.netty.channel.ChannelInboundHandlerAdapter</code></dd>
+<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>
+</li>
+</ul>
+<a name="channelInactive(io.netty.channel.ChannelHandlerContext)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>channelRead</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html#line.51">channelRead</a>(io.netty.channel.ChannelHandlerContext&nbsp;ctx,
-               <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;msg)
-                 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>
+<h4>channelInactive</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html#line.109">channelInactive</a>(io.netty.channel.ChannelHandlerContext&nbsp;ctx)
+                     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><strong>Specified by:</strong></dt>
-<dd><code>channelRead</code>&nbsp;in interface&nbsp;<code>io.netty.channel.ChannelInboundHandler</code></dd>
+<dd><code>channelInactive</code>&nbsp;in interface&nbsp;<code>io.netty.channel.ChannelInboundHandler</code></dd>
 <dt><strong>Overrides:</strong></dt>
-<dd><code>channelRead</code>&nbsp;in class&nbsp;<code>io.netty.channel.ChannelInboundHandlerAdapter</code></dd>
+<dd><code>channelInactive</code>&nbsp;in class&nbsp;<code>io.netty.channel.ChannelInboundHandlerAdapter</code></dd>
 <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>
 </li>
@@ -296,7 +352,7 @@ extends io.netty.channel.ChannelInboundHandlerAdapter</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>createRemoteException</h4>
-<pre>private&nbsp;org.apache.hadoop.ipc.RemoteException&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html#line.115">createRemoteException</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse&nbsp;e)</pre>
+<pre>private&nbsp;org.apache.hadoop.ipc.RemoteException&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html#line.117">createRemoteException</a>(org.apache.hadoop.hbase.protobuf.generated.RPCProtos.ExceptionResponse&nbsp;e)</pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>e</code> - Proto exception</dd>
 <dt><span class="strong">Returns:</span></dt><dd>RemoteException made from passed <code>e</code></dd></dl>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
index 7cd2152..4e418ac 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -106,11 +106,15 @@
 <ul>
 <li type="circle">io.netty.channel.ChannelInboundHandlerAdapter (implements io.netty.channel.ChannelInboundHandler)
 <ul>
+<li type="circle">io.netty.channel.SimpleChannelInboundHandler&lt;I&gt;
+<ul>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html" title="class in org.apache.hadoop.hbase.ipc"><span class="strong">AsyncServerResponseHandler</span></a></li>
 </ul>
 </li>
 </ul>
 </li>
+</ul>
+</li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/ConnectionId.html" title="class in org.apache.hadoop.hbase.ipc"><span class="strong">ConnectionId</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CoprocessorRpcChannel.html" title="class in org.apache.hadoop.hbase.ipc"><span class="strong">CoprocessorRpcChannel</span></a> (implements com.google.protobuf.BlockingRpcChannel, com.google.protobuf.RpcChannel)
 <ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 482ecc3..fe5a467 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -268,9 +268,9 @@
 <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/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="strong">RowCounter.RowCounterMapper.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/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/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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 7984197..4f93c9c 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -318,10 +318,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.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/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/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/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>
+<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/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="strong">SplitLogManager.ResubmitDirective</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
index a0a1bcc..aaf26d9 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -145,9 +145,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.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="strong">ServerProcedureInterface.ServerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/DisableTableProcedure.MarkRegionOfflineOpResult.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="strong">DisableTableProcedure.MarkRegionOfflineOpResult</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="strong">TableProcedureInterface.TableOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="strong">ServerProcedureInterface.ServerOperationType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 11c70f1..3094708 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -361,14 +361,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.<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/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/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/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/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/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/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>
+<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/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="strong">KeyValue.Type</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 667ab2a..7e204c8 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -173,8 +173,8 @@
 <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/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/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/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/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="strong">ThrottlingException.Type</span></a></li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/regionserver/KeyValueHeap.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/KeyValueHeap.html b/devapidocs/org/apache/hadoop/hbase/regionserver/KeyValueHeap.html
index 1c09727..e8c7db0 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/KeyValueHeap.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/KeyValueHeap.html
@@ -713,8 +713,9 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#getNextIndexedKey()">getNextIndexedKey</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a></code></dd>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/NonLazyKeyValueScanner.html#getNextIndexedKey()">getNextIndexedKey</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/NonLazyKeyValueScanner.html" title="class in org.apache.hadoop.hbase.regionserver">NonLazyKeyValueScanner</a></code></dd>
-<dt><span class="strong">Returns:</span></dt><dd>the next key in the index (the key to seek to the next block)
- if known, or null otherwise</dd></dl>
+<dt><span class="strong">Returns:</span></dt><dd>the next key in the index, usually the first key of next block OR a key that falls
+ between last key of current block and first key of next block..
+ see HFileWriterImpl#getMidpoint, or null if not known.</dd></dl>
 </li>
 </ul>
 <a name="shipped()">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html b/devapidocs/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html
index 478664e..3af75a7 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/KeyValueScanner.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/regionserver/KeyValueScanner.html#line.33">KeyValueScanner</a>
+public interface <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.36">KeyValueScanner</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.html" title="interface in org.apache.hadoop.hbase.regionserver">Shipper</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>
 <div class="block">Scanner that returns the next KeyValue.</div>
 </li>
@@ -268,7 +268,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.htm
 <ul class="blockListLast">
 <li class="blockList">
 <h4>NO_NEXT_INDEXED_KEY</h4>
-<pre>static final&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/KeyValueScanner.html#line.38">NO_NEXT_INDEXED_KEY</a></pre>
+<pre>static final&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/KeyValueScanner.html#line.41">NO_NEXT_INDEXED_KEY</a></pre>
 <div class="block">The byte array represents for NO_NEXT_INDEXED_KEY;
  The actual value is irrelevant because this is always compared by reference.</div>
 </li>
@@ -287,7 +287,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>peek</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.44">peek</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.47">peek</a>()</pre>
 <div class="block">Look at the next Cell in this scanner, but do not iterate scanner.</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>the next Cell</dd></dl>
 </li>
@@ -298,7 +298,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>next</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.50">next</a>()
+<pre><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.53">next</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">Return the next Cell in this scanner, iterating the scanner</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>the next Cell</dd>
@@ -312,7 +312,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>seek</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.57">seek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.60">seek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
              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">Seek the scanner at or after the specified KeyValue.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>key</code> - seek value</dd>
@@ -327,7 +327,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>reseek</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.67">reseek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.70">reseek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
                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">Reseek the scanner at or after the specified KeyValue.
  This method is guaranteed to seek at or after the required key only if the
@@ -345,7 +345,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getSequenceID</h4>
-<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.76">getSequenceID</a>()</pre>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.79">getSequenceID</a>()</pre>
 <div class="block">Get the sequence id associated with this KeyValueScanner. This is required
  for comparing multiple files to find out which one has the latest data.
  The default implementation for this would be to return 0. A file having
@@ -358,7 +358,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.81">close</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.84">close</a>()</pre>
 <div class="block">Close the KeyValue scanner.</div>
 <dl>
 <dt><strong>Specified by:</strong></dt>
@@ -374,7 +374,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldUseScanner</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.92">shouldUseScanner</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.95">shouldUseScanner</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                        <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a>&nbsp;store,
                        long&nbsp;oldestUnexpiredTS)</pre>
 <div class="block">Allows to filter out scanners (both StoreFile and memstore) that we don't
@@ -390,7 +390,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>requestSeek</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.106">requestSeek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv,
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.109">requestSeek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv,
                   boolean&nbsp;forward,
                   boolean&nbsp;useBloom)
                     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>
@@ -411,7 +411,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>realSeekDone</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.115">realSeekDone</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.118">realSeekDone</a>()</pre>
 <div class="block">We optimize our store scanners by checking the most recent store file
  first, so we sometimes pretend we have done a seek but delay it until the
  store scanner bubbles up to the top of the key-value heap. This method is
@@ -424,7 +424,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>enforceSeek</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.124">enforceSeek</a>()
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.127">enforceSeek</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">Does the real seek operation in case it was skipped by
  seekToRowCol(KeyValue, boolean) (TODO: Whats this?). Note that this function should
@@ -441,7 +441,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>isFileScanner</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.130">isFileScanner</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.133">isFileScanner</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>true if this is a file scanner. Otherwise a memory scanner is
          assumed.</dd></dl>
 </li>
@@ -452,7 +452,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>backwardSeek</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.145">backwardSeek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.148">backwardSeek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
                      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">Seek the scanner at or before the row of specified Cell, it firstly
  tries to seek the scanner at or after the specified Cell, return if
@@ -472,7 +472,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>seekToPreviousRow</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.154">seekToPreviousRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.157">seekToPreviousRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;key)
                           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">Seek the scanner at the first Cell of the row which is the previous row
  of specified key</div>
@@ -489,7 +489,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>seekToLastRow</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.163">seekToLastRow</a>()
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.166">seekToLastRow</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">Seek the scanner at the first KeyValue of last row</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>true if scanner has values left, false if the underlying data is
@@ -504,9 +504,10 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.htm
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getNextIndexedKey</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.169">getNextIndexedKey</a>()</pre>
-<dl><dt><span class="strong">Returns:</span></dt><dd>the next key in the index (the key to seek to the next block)
- if known, or null otherwise</dd></dl>
+<pre><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#line.173">getNextIndexedKey</a>()</pre>
+<dl><dt><span class="strong">Returns:</span></dt><dd>the next key in the index, usually the first key of next block OR a key that falls
+ between last key of current block and first key of next block..
+ see HFileWriterImpl#getMidpoint, or null if not known.</dd></dl>
 </li>
 </ul>
 </li>


[05/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html
index 50ed506..be50739 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html
@@ -28,593 +28,835 @@
 <span class="sourceLineNo">020</span>package org.apache.hadoop.hbase.regionserver;<a name="line.20"></a>
 <span class="sourceLineNo">021</span><a name="line.21"></a>
 <span class="sourceLineNo">022</span>import static org.apache.hadoop.hbase.regionserver.KeyValueScanFixture.scanFixture;<a name="line.22"></a>
-<span class="sourceLineNo">023</span><a name="line.23"></a>
-<span class="sourceLineNo">024</span>import java.io.IOException;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import java.util.ArrayList;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import java.util.Arrays;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import java.util.List;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.NavigableSet;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.TreeSet;<a name="line.29"></a>
-<span class="sourceLineNo">030</span><a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.conf.Configuration;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.CategoryBasedTimeout;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.Cell;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.CellComparator;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.HBaseConfiguration;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.HConstants;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.KeepDeletedCells;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.KeyValue;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.KeyValueTestUtil;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.util.EnvironmentEdge;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.junit.Assert;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.junit.Rule;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.junit.Test;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.junit.experimental.categories.Category;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.junit.rules.TestName;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.junit.rules.TestRule;<a name="line.51"></a>
-<span class="sourceLineNo">052</span><a name="line.52"></a>
-<span class="sourceLineNo">053</span>// Can't be small as it plays with EnvironmentEdgeManager<a name="line.53"></a>
-<span class="sourceLineNo">054</span>@Category({RegionServerTests.class, MediumTests.class})<a name="line.54"></a>
-<span class="sourceLineNo">055</span>public class TestStoreScanner {<a name="line.55"></a>
-<span class="sourceLineNo">056</span>  @Rule public TestName name = new TestName();<a name="line.56"></a>
-<span class="sourceLineNo">057</span>  @Rule public final TestRule timeout = CategoryBasedTimeout.builder().withTimeout(this.getClass()).<a name="line.57"></a>
-<span class="sourceLineNo">058</span>      withLookingForStuckThread(true).build();<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  private static final String CF_STR = "cf";<a name="line.59"></a>
-<span class="sourceLineNo">060</span>  final byte [] CF = Bytes.toBytes(CF_STR);<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  static Configuration CONF = HBaseConfiguration.create();<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  private ScanInfo scanInfo = new ScanInfo(CONF, CF, 0, Integer.MAX_VALUE,<a name="line.62"></a>
-<span class="sourceLineNo">063</span>      Long.MAX_VALUE, KeepDeletedCells.FALSE, 0, CellComparator.COMPARATOR);<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private ScanType scanType = ScanType.USER_SCAN;<a name="line.64"></a>
-<span class="sourceLineNo">065</span><a name="line.65"></a>
-<span class="sourceLineNo">066</span>  /*<a name="line.66"></a>
-<span class="sourceLineNo">067</span>   * Test utility for building a NavigableSet for scanners.<a name="line.67"></a>
-<span class="sourceLineNo">068</span>   * @param strCols<a name="line.68"></a>
-<span class="sourceLineNo">069</span>   * @return<a name="line.69"></a>
-<span class="sourceLineNo">070</span>   */<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  NavigableSet&lt;byte[]&gt; getCols(String ...strCols) {<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    NavigableSet&lt;byte[]&gt; cols = new TreeSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    for (String col : strCols) {<a name="line.73"></a>
-<span class="sourceLineNo">074</span>      byte[] bytes = Bytes.toBytes(col);<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      cols.add(bytes);<a name="line.75"></a>
-<span class="sourceLineNo">076</span>    }<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    return cols;<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>  @Test<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  public void testScanTimeRange() throws IOException {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    String r1 = "R1";<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    // returns only 1 of these 2 even though same timestamp<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    KeyValue [] kvs = new KeyValue[] {<a name="line.84"></a>
-<span class="sourceLineNo">085</span>        KeyValueTestUtil.create(r1, CF_STR, "a", 1, KeyValue.Type.Put, "dont-care"),<a name="line.85"></a>
-<span class="sourceLineNo">086</span>        KeyValueTestUtil.create(r1, CF_STR, "a", 2, KeyValue.Type.Put, "dont-care"),<a name="line.86"></a>
-<span class="sourceLineNo">087</span>        KeyValueTestUtil.create(r1, CF_STR, "a", 3, KeyValue.Type.Put, "dont-care"),<a name="line.87"></a>
-<span class="sourceLineNo">088</span>        KeyValueTestUtil.create(r1, CF_STR, "a", 4, KeyValue.Type.Put, "dont-care"),<a name="line.88"></a>
-<span class="sourceLineNo">089</span>        KeyValueTestUtil.create(r1, CF_STR, "a", 5, KeyValue.Type.Put, "dont-care"),<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    };<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    List&lt;KeyValueScanner&gt; scanners = Arrays.&lt;KeyValueScanner&gt;asList(<a name="line.91"></a>
-<span class="sourceLineNo">092</span>        new KeyValueScanner[] {<a name="line.92"></a>
-<span class="sourceLineNo">093</span>            new KeyValueScanFixture(CellComparator.COMPARATOR, kvs)<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    });<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    Scan scanSpec = new Scan(Bytes.toBytes(r1));<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    scanSpec.setTimeRange(0, 6);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    scanSpec.setMaxVersions();<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    List&lt;Cell&gt; results = null;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    try (StoreScanner scan =<a name="line.99"></a>
-<span class="sourceLineNo">100</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      results = new ArrayList&lt;Cell&gt;();<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      Assert.assertEquals(true, scan.next(results));<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      Assert.assertEquals(5, results.size());<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      Assert.assertEquals(kvs[kvs.length - 1], results.get(0));<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    }<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    // Scan limited TimeRange<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    scanSpec = new Scan(Bytes.toBytes(r1));<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    scanSpec.setTimeRange(1, 3);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    scanSpec.setMaxVersions();<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    try (StoreScanner scan =<a name="line.110"></a>
-<span class="sourceLineNo">111</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      results = new ArrayList&lt;Cell&gt;();<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      Assert.assertEquals(true, scan.next(results));<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      Assert.assertEquals(2, results.size());<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    }<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    // Another range.<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    scanSpec = new Scan(Bytes.toBytes(r1));<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    scanSpec.setTimeRange(5, 10);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    scanSpec.setMaxVersions();<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    try (StoreScanner scan =<a name="line.120"></a>
-<span class="sourceLineNo">121</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      results = new ArrayList&lt;Cell&gt;();<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      Assert.assertEquals(true, scan.next(results));<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      Assert.assertEquals(1, results.size());<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    }<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    // See how TimeRange and Versions interact.<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    // Another range.<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    scanSpec = new Scan(Bytes.toBytes(r1));<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    scanSpec.setTimeRange(0, 10);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    scanSpec.setMaxVersions(3);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    try (StoreScanner scan = new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"),<a name="line.131"></a>
-<span class="sourceLineNo">132</span>        scanners)) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      results = new ArrayList&lt;Cell&gt;();<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      Assert.assertEquals(true, scan.next(results));<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      Assert.assertEquals(3, results.size());<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    }<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>  @Test<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  public void testScanSameTimestamp() throws IOException {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    // returns only 1 of these 2 even though same timestamp<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    KeyValue [] kvs = new KeyValue[] {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.Put, "dont-care"),<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.Put, "dont-care"),<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    };<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    List&lt;KeyValueScanner&gt; scanners = Arrays.asList(<a name="line.146"></a>
-<span class="sourceLineNo">147</span>        new KeyValueScanner[] {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>            new KeyValueScanFixture(CellComparator.COMPARATOR, kvs)<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>    Scan scanSpec = new Scan(Bytes.toBytes("R1"));<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    // this only uses maxVersions (default=1) and TimeRange (default=all)<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    try (StoreScanner scan =<a name="line.153"></a>
-<span class="sourceLineNo">154</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      Assert.assertEquals(true, scan.next(results));<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      Assert.assertEquals(1, results.size());<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      Assert.assertEquals(kvs[0], results.get(0));<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><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  /*<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * Test test shows exactly how the matcher's return codes confuses the StoreScanner<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * and prevent it from doing the right thing.  Seeking once, then nexting twice<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * should return R1, then R2, but in this case it doesnt.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * TODO this comment makes no sense above. Appears to do the right thing.<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @throws IOException<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  @Test<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public void testWontNextToNext() throws IOException {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    // build the scan file:<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    KeyValue [] kvs = new KeyValue[] {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>        KeyValueTestUtil.create("R1", "cf", "a", 2, KeyValue.Type.Put, "dont-care"),<a name="line.173"></a>
-<span class="sourceLineNo">174</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.Put, "dont-care"),<a name="line.174"></a>
-<span class="sourceLineNo">175</span>        KeyValueTestUtil.create("R2", "cf", "a", 1, KeyValue.Type.Put, "dont-care")<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    };<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    Scan scanSpec = new Scan(Bytes.toBytes("R1"));<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    // this only uses maxVersions (default=1) and TimeRange (default=all)<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    try (StoreScanner scan =<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      scan.next(results);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      Assert.assertEquals(1, results.size());<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      Assert.assertEquals(kvs[0], results.get(0));<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      // should be ok...<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      // now scan _next_ again.<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      results.clear();<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      scan.next(results);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      Assert.assertEquals(1, results.size());<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      Assert.assertEquals(kvs[2], results.get(0));<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>      results.clear();<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      scan.next(results);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      Assert.assertEquals(0, results.size());<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><a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span>  @Test<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  public void testDeleteVersionSameTimestamp() throws IOException {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    KeyValue [] kvs = new KeyValue [] {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.Put, "dont-care"),<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.Delete, "dont-care"),<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    };<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    Scan scanSpec = new Scan(Bytes.toBytes("R1"));<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    try (StoreScanner scan =<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      Assert.assertFalse(scan.next(results));<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      Assert.assertEquals(0, results.size());<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    }<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>  /*<a name="line.217"></a>
-<span class="sourceLineNo">218</span>   * Test the case where there is a delete row 'in front of' the next row, the scanner<a name="line.218"></a>
-<span class="sourceLineNo">219</span>   * will move to the next row.<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   */<a name="line.220"></a>
-<span class="sourceLineNo">221</span>  @Test<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  public void testDeletedRowThenGoodRow() throws IOException {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    KeyValue [] kvs = new KeyValue [] {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.Put, "dont-care"),<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.Delete, "dont-care"),<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        KeyValueTestUtil.create("R2", "cf", "a", 20, KeyValue.Type.Put, "dont-care")<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    };<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    Scan scanSpec = new Scan(Bytes.toBytes("R1"));<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    try (StoreScanner scan =<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      Assert.assertEquals(true, scan.next(results));<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      Assert.assertEquals(0, results.size());<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>      Assert.assertEquals(true, scan.next(results));<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      Assert.assertEquals(1, results.size());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      Assert.assertEquals(kvs[2], results.get(0));<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span>      Assert.assertEquals(false, scan.next(results));<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>  public void testDeleteVersionMaskingMultiplePuts() throws IOException {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    long now = System.currentTimeMillis();<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    KeyValue [] kvs1 = new KeyValue[] {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        KeyValueTestUtil.create("R1", "cf", "a", now, KeyValue.Type.Put, "dont-care"),<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        KeyValueTestUtil.create("R1", "cf", "a", now, KeyValue.Type.Delete, "dont-care")<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    };<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    KeyValue [] kvs2 = new KeyValue[] {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        KeyValueTestUtil.create("R1", "cf", "a", now-500, KeyValue.Type.Put, "dont-care"),<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        KeyValueTestUtil.create("R1", "cf", "a", now-100, KeyValue.Type.Put, "dont-care"),<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        KeyValueTestUtil.create("R1", "cf", "a", now, KeyValue.Type.Put, "dont-care")<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    };<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs1, kvs2);<a name="line.255"></a>
-<span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>    try (StoreScanner scan = new StoreScanner(new Scan(Bytes.toBytes("R1")), scanInfo, scanType,<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        getCols("a"), scanners)) {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      // the two put at ts=now will be masked by the 1 delete, and<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      // since the scan default returns 1 version we'll return the newest<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      // key, which is kvs[2], now-100.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      Assert.assertEquals(true, scan.next(results));<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      Assert.assertEquals(1, results.size());<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      Assert.assertEquals(kvs2[1], results.get(0));<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>  public void testDeleteVersionsMixedAndMultipleVersionReturn() throws IOException {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    long now = System.currentTimeMillis();<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    KeyValue [] kvs1 = new KeyValue[] {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        KeyValueTestUtil.create("R1", "cf", "a", now, KeyValue.Type.Put, "dont-care"),<a name="line.271"></a>
-<span class="sourceLineNo">272</span>        KeyValueTestUtil.create("R1", "cf", "a", now, KeyValue.Type.Delete, "dont-care")<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    };<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    KeyValue [] kvs2 = new KeyValue[] {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>        KeyValueTestUtil.create("R1", "cf", "a", now-500, KeyValue.Type.Put, "dont-care"),<a name="line.275"></a>
-<span class="sourceLineNo">276</span>        KeyValueTestUtil.create("R1", "cf", "a", now+500, KeyValue.Type.Put, "dont-care"),<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        KeyValueTestUtil.create("R1", "cf", "a", now, KeyValue.Type.Put, "dont-care"),<a name="line.277"></a>
-<span class="sourceLineNo">278</span>        KeyValueTestUtil.create("R2", "cf", "z", now, KeyValue.Type.Put, "dont-care")<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    };<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs1, kvs2);<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>    Scan scanSpec = new Scan(Bytes.toBytes("R1")).setMaxVersions(2);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    try (StoreScanner scan = new StoreScanner(scanSpec, scanInfo, scanType,<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        getCols("a"), scanners)) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      Assert.assertEquals(true, scan.next(results));<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      Assert.assertEquals(2, results.size());<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      Assert.assertEquals(kvs2[1], results.get(0));<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      Assert.assertEquals(kvs2[0], results.get(1));<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><a name="line.292"></a>
-<span class="sourceLineNo">293</span>  @Test<a name="line.293"></a>
-<span class="sourceLineNo">294</span>  public void testWildCardOneVersionScan() throws IOException {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    KeyValue [] kvs = new KeyValue [] {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        KeyValueTestUtil.create("R1", "cf", "a", 2, KeyValue.Type.Put, "dont-care"),<a name="line.296"></a>
-<span class="sourceLineNo">297</span>        KeyValueTestUtil.create("R1", "cf", "b", 1, KeyValue.Type.Put, "dont-care"),<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.DeleteColumn, "dont-care"),<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    };<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    try (StoreScanner scan =<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        new StoreScanner(new Scan(Bytes.toBytes("R1")), scanInfo, scanType, null, scanners)) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      Assert.assertEquals(true, scan.next(results));<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      Assert.assertEquals(2, results.size());<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      Assert.assertEquals(kvs[0], results.get(0));<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      Assert.assertEquals(kvs[1], results.get(1));<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  }<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  @Test<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  public void testWildCardScannerUnderDeletes() throws IOException {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    KeyValue [] kvs = new KeyValue [] {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        KeyValueTestUtil.create("R1", "cf", "a", 2, KeyValue.Type.Put, "dont-care"), // inc<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        // orphaned delete column.<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.DeleteColumn, "dont-care"),<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        // column b<a name="line.317"></a>
-<span class="sourceLineNo">318</span>        KeyValueTestUtil.create("R1", "cf", "b", 2, KeyValue.Type.Put, "dont-care"), // inc<a name="line.318"></a>
-<span class="sourceLineNo">319</span>        KeyValueTestUtil.create("R1", "cf", "b", 1, KeyValue.Type.Put, "dont-care"), // inc<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        // column c<a name="line.320"></a>
-<span class="sourceLineNo">321</span>        KeyValueTestUtil.create("R1", "cf", "c", 10, KeyValue.Type.Delete, "dont-care"),<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        KeyValueTestUtil.create("R1", "cf", "c", 10, KeyValue.Type.Put, "dont-care"), // no<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        KeyValueTestUtil.create("R1", "cf", "c", 9, KeyValue.Type.Put, "dont-care"),  // inc<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        // column d<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        KeyValueTestUtil.create("R1", "cf", "d", 11, KeyValue.Type.Put, "dont-care"), // inc<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        KeyValueTestUtil.create("R1", "cf", "d", 10, KeyValue.Type.DeleteColumn, "dont-care"),<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        KeyValueTestUtil.create("R1", "cf", "d", 9, KeyValue.Type.Put, "dont-care"),  // no<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        KeyValueTestUtil.create("R1", "cf", "d", 8, KeyValue.Type.Put, "dont-care"),  // no<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>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    try (StoreScanner scan = new StoreScanner(new Scan().setMaxVersions(2),<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        scanInfo, scanType, null, scanners)) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      Assert.assertEquals(true, scan.next(results));<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      Assert.assertEquals(5, results.size());<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      Assert.assertEquals(kvs[0], results.get(0));<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      Assert.assertEquals(kvs[2], results.get(1));<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      Assert.assertEquals(kvs[3], results.get(2));<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      Assert.assertEquals(kvs[6], results.get(3));<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      Assert.assertEquals(kvs[7], results.get(4));<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>  @Test<a name="line.345"></a>
-<span class="sourceLineNo">346</span>  public void testDeleteFamily() throws IOException {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    KeyValue [] kvs = new KeyValue[] {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        KeyValueTestUtil.create("R1", "cf", "a", 100, KeyValue.Type.DeleteFamily, "dont-care"),<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        KeyValueTestUtil.create("R1", "cf", "b", 11, KeyValue.Type.Put, "dont-care"),<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        KeyValueTestUtil.create("R1", "cf", "c", 11, KeyValue.Type.Put, "dont-care"),<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        KeyValueTestUtil.create("R1", "cf", "d", 11, KeyValue.Type.Put, "dont-care"),<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        KeyValueTestUtil.create("R1", "cf", "e", 11, KeyValue.Type.Put, "dont-care"),<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        KeyValueTestUtil.create("R1", "cf", "e", 11, KeyValue.Type.DeleteColumn, "dont-care"),<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        KeyValueTestUtil.create("R1", "cf", "f", 11, KeyValue.Type.Put, "dont-care"),<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        KeyValueTestUtil.create("R1", "cf", "g", 11, KeyValue.Type.Put, "dont-care"),<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        KeyValueTestUtil.create("R1", "cf", "g", 11, KeyValue.Type.Delete, "dont-care"),<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        KeyValueTestUtil.create("R1", "cf", "h", 11, KeyValue.Type.Put, "dont-care"),<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        KeyValueTestUtil.create("R1", "cf", "i", 11, KeyValue.Type.Put, "dont-care"),<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        KeyValueTestUtil.create("R2", "cf", "a", 11, KeyValue.Type.Put, "dont-care"),<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    };<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.361"></a>
+<span class="sourceLineNo">023</span>import static org.junit.Assert.*;<a name="line.23"></a>
+<span class="sourceLineNo">024</span><a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.io.IOException;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.util.ArrayList;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.Arrays;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.List;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.NavigableSet;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.TreeSet;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.31"></a>
+<span class="sourceLineNo">032</span><a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.commons.logging.Log;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.commons.logging.LogFactory;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.conf.Configuration;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.CategoryBasedTimeout;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.Cell;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.CellComparator;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HBaseConfiguration;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HConstants;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.KeepDeletedCells;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.KeyValue;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.KeyValueTestUtil;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.Get;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.EnvironmentEdge;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.junit.Assert;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.junit.Rule;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.junit.Test;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.junit.experimental.categories.Category;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.junit.rules.TestName;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.rules.TestRule;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>// Can't be small as it plays with EnvironmentEdgeManager<a name="line.59"></a>
+<span class="sourceLineNo">060</span>@Category({RegionServerTests.class, MediumTests.class})<a name="line.60"></a>
+<span class="sourceLineNo">061</span>public class TestStoreScanner {<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static final Log LOG = LogFactory.getLog(TestStoreScanner.class);<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  @Rule public TestName name = new TestName();<a name="line.63"></a>
+<span class="sourceLineNo">064</span>  @Rule public final TestRule timeout = CategoryBasedTimeout.builder().withTimeout(this.getClass()).<a name="line.64"></a>
+<span class="sourceLineNo">065</span>      withLookingForStuckThread(true).build();<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  private static final String CF_STR = "cf";<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  private static final byte [] CF = Bytes.toBytes(CF_STR);<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  static Configuration CONF = HBaseConfiguration.create();<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  private ScanInfo scanInfo = new ScanInfo(CONF, CF, 0, Integer.MAX_VALUE,<a name="line.69"></a>
+<span class="sourceLineNo">070</span>      Long.MAX_VALUE, KeepDeletedCells.FALSE, 0, CellComparator.COMPARATOR);<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  private ScanType scanType = ScanType.USER_SCAN;<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>   * From here on down, we have a bunch of defines and specific CELL_GRID of Cells. The<a name="line.74"></a>
+<span class="sourceLineNo">075</span>   * CELL_GRID then has a Scanner that can fake out 'block' transitions. All this elaborate<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * setup is for tests that ensure we don't overread, and that the<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   * {@link StoreScanner#optimize(org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode,<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   * Cell)} is not overly enthusiastic.<a name="line.78"></a>
+<span class="sourceLineNo">079</span>   */<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private static final byte [] ZERO = new byte [] {'0'};<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private static final byte [] ZERO_POINT_ZERO = new byte [] {'0', '.', '0'};<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  private static final byte [] ONE = new byte [] {'1'};<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  private static final byte [] TWO = new byte [] {'2'};<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private static final byte [] TWO_POINT_TWO = new byte [] {'2', '.', '2'};<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  private static final byte [] THREE = new byte [] {'3'};<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  private static final byte [] FOUR = new byte [] {'4'};<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private static final byte [] FIVE = new byte [] {'5'};<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private static final byte [] VALUE = new byte [] {'v'};<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  private static final int CELL_GRID_BLOCK2_BOUNDARY = 4;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  private static final int CELL_GRID_BLOCK3_BOUNDARY = 11;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  private static final int CELL_GRID_BLOCK4_BOUNDARY = 15;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  private static final int CELL_GRID_BLOCK5_BOUNDARY = 19;<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>  /**<a name="line.94"></a>
+<span class="sourceLineNo">095</span>   * Five rows by four columns distinguished by column qualifier (column qualifier is one of the<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   * four rows... ONE, TWO, etc.). Exceptions are a weird row after TWO; it is TWO_POINT_TWO.<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   * And then row FOUR has five columns finishing w/ row FIVE having a single column.<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   * We will use this to test scan does the right thing as it<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   * we do Gets, StoreScanner#optimize, and what we do on (faked) block boundaries.<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   */<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  private static final Cell [] CELL_GRID = new Cell [] {<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    CellUtil.createCell(ONE, CF, ONE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    CellUtil.createCell(ONE, CF, TWO, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    CellUtil.createCell(ONE, CF, THREE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    CellUtil.createCell(ONE, CF, FOUR, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    // Offset 4 CELL_GRID_BLOCK2_BOUNDARY<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    CellUtil.createCell(TWO, CF, ONE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    CellUtil.createCell(TWO, CF, TWO, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    CellUtil.createCell(TWO, CF, THREE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    CellUtil.createCell(TWO, CF, FOUR, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    CellUtil.createCell(TWO_POINT_TWO, CF, ZERO, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    CellUtil.createCell(TWO_POINT_TWO, CF, ZERO_POINT_ZERO, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    CellUtil.createCell(TWO_POINT_TWO, CF, FIVE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    // Offset 11! CELL_GRID_BLOCK3_BOUNDARY<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    CellUtil.createCell(THREE, CF, ONE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    CellUtil.createCell(THREE, CF, TWO, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    CellUtil.createCell(THREE, CF, THREE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    CellUtil.createCell(THREE, CF, FOUR, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    // Offset 15 CELL_GRID_BLOCK4_BOUNDARY<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    CellUtil.createCell(FOUR, CF, ONE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    CellUtil.createCell(FOUR, CF, TWO, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    CellUtil.createCell(FOUR, CF, THREE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    CellUtil.createCell(FOUR, CF, FOUR, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    // Offset 19 CELL_GRID_BLOCK5_BOUNDARY<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    CellUtil.createCell(FOUR, CF, FIVE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    CellUtil.createCell(FIVE, CF, ZERO, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  };<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>   * A StoreScanner for our CELL_GRID above. Fakes the block transitions. Does counts of<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * calls to optimize and counts of when optimize actually did an optimize.<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   */<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  private static class CellGridStoreScanner extends StoreScanner {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    // Count of how often optimize is called and of how often it does an optimize.<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    final AtomicInteger count = new AtomicInteger(0);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    final AtomicInteger optimization = new AtomicInteger(0);<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>    CellGridStoreScanner(final Scan scan, ScanInfo scanInfo, ScanType scanType)<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    throws IOException {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      super(scan, scanInfo, scanType, scan.getFamilyMap().get(CF),<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        Arrays.&lt;KeyValueScanner&gt;asList(<a name="line.141"></a>
+<span class="sourceLineNo">142</span>          new KeyValueScanner[] {new KeyValueScanFixture(CellComparator.COMPARATOR, CELL_GRID)}));<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>    protected ScanQueryMatcher.MatchCode optimize(ScanQueryMatcher.MatchCode qcode, Cell cell) {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      count.incrementAndGet();<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      ScanQueryMatcher.MatchCode after = super.optimize(qcode, cell);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      LOG.info("Cell=" + cell + ", nextIndex=" + CellUtil.toString(getNextIndexedKey(), false) +<a name="line.148"></a>
+<span class="sourceLineNo">149</span>          ", before=" + qcode + ", after=" + after);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      if (qcode != after) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        optimization.incrementAndGet();<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      }<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      return after;<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>    @Override<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    public Cell getNextIndexedKey() {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      // Fake block boundaries by having index of next block change as we go through scan.<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return count.get() &gt; CELL_GRID_BLOCK4_BOUNDARY?<a name="line.159"></a>
+<span class="sourceLineNo">160</span>          CellUtil.createFirstOnRow(CELL_GRID[CELL_GRID_BLOCK5_BOUNDARY]):<a name="line.160"></a>
+<span class="sourceLineNo">161</span>            count.get() &gt; CELL_GRID_BLOCK3_BOUNDARY?<a name="line.161"></a>
+<span class="sourceLineNo">162</span>                CellUtil.createFirstOnRow(CELL_GRID[CELL_GRID_BLOCK4_BOUNDARY]):<a name="line.162"></a>
+<span class="sourceLineNo">163</span>                  count.get() &gt; CELL_GRID_BLOCK2_BOUNDARY?<a name="line.163"></a>
+<span class="sourceLineNo">164</span>                      CellUtil.createFirstOnRow(CELL_GRID[CELL_GRID_BLOCK3_BOUNDARY]):<a name="line.164"></a>
+<span class="sourceLineNo">165</span>                        CellUtil.createFirstOnRow(CELL_GRID[CELL_GRID_BLOCK2_BOUNDARY]);<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><a name="line.168"></a>
+<span class="sourceLineNo">169</span>  /*<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   * Test utility for building a NavigableSet for scanners.<a name="line.170"></a>
+<span class="sourceLineNo">171</span>   * @param strCols<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   * @return<a name="line.172"></a>
+<span class="sourceLineNo">173</span>   */<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  NavigableSet&lt;byte[]&gt; getCols(String ...strCols) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    NavigableSet&lt;byte[]&gt; cols = new TreeSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    for (String col : strCols) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      byte[] bytes = Bytes.toBytes(col);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      cols.add(bytes);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    }<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return cols;<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>  @Test<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  public void testFullRowGetDoesNotOverreadWhenRowInsideOneBlock() throws IOException {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    // Do a Get against row two. Row two is inside a block that starts with row TWO but ends with<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    // row TWO_POINT_TWO. We should read one block only.<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    Get get = new Get(TWO);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    Scan scan = new Scan(get);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    CellGridStoreScanner scanner = new CellGridStoreScanner(scan, this.scanInfo, this.scanType);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    try {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      while (scanner.next(results)) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>        continue;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      }<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      // Should be four results of column 1 (though there are 5 rows in the CELL_GRID -- the<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      // TWO_POINT_TWO row does not have a a column ONE.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      Assert.assertEquals(4, results.size());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      // We should have gone the optimize route 5 times totally... an INCLUDE for the four cells<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      // in the row plus the DONE on the end.<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      Assert.assertEquals(5, scanner.count.get());<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      // For a full row Get, there should be no opportunity for scanner optimization.<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      Assert.assertEquals(0, scanner.optimization.get());<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    } finally {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      scanner.close();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  }<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>  @Test<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  public void testFullRowSpansBlocks() throws IOException {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    // Do a Get against row FOUR. It spans two blocks.<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    Get get = new Get(FOUR);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    Scan scan = new Scan(get);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    CellGridStoreScanner scanner = new CellGridStoreScanner(scan, this.scanInfo, this.scanType);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    try {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      while (scanner.next(results)) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        continue;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      }<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      // Should be four results of column 1 (though there are 5 rows in the CELL_GRID -- the<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      // TWO_POINT_TWO row does not have a a column ONE.<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      Assert.assertEquals(5, results.size());<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      // We should have gone the optimize route 6 times totally... an INCLUDE for the five cells<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      // in the row plus the DONE on the end.<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      Assert.assertEquals(6, scanner.count.get());<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      // For a full row Get, there should be no opportunity for scanner optimization.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      Assert.assertEquals(0, scanner.optimization.get());<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    } finally {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      scanner.close();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>  /**<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * Test optimize in StoreScanner. Test that we skip to the next 'block' when we it makes sense<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * reading the block 'index'.<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @throws IOException<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  @Test<a name="line.237"></a>
+<span class="sourceLineNo">238</span>  public void testOptimize() throws IOException {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    Scan scan = new Scan();<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    // A scan that just gets the first qualifier on each row of the CELL_GRID<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    scan.addColumn(CF, ONE);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    CellGridStoreScanner scanner = new CellGridStoreScanner(scan, this.scanInfo, this.scanType);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    try {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      while (scanner.next(results)) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        continue;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      }<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      // Should be four results of column 1 (though there are 5 rows in the CELL_GRID -- the<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      // TWO_POINT_TWO row does not have a a column ONE.<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Assert.assertEquals(4, results.size());<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      for (Cell cell: results) {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        assertTrue(Bytes.equals(ONE, 0, ONE.length,<a name="line.252"></a>
+<span class="sourceLineNo">253</span>            cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()));<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      }<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      Assert.assertTrue("Optimize should do some optimizations", scanner.optimization.get() &gt; 0);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    } finally {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      scanner.close();<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>   * Ensure the optimize Scan method in StoreScanner does not get in the way of a Get doing minimum<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * work... seeking to start of block and then SKIPPING until we find the wanted Cell.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * This 'simple' scenario mimics case of all Cells fitting inside a single HFileBlock.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   * See HBASE-15392. This test is a little cryptic. Takes a bit of staring to figure what it up to.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>   * @throws IOException<a name="line.266"></a>
+<span class="sourceLineNo">267</span>   */<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  public void testOptimizeAndGet() throws IOException {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // First test a Get of two columns in the row R2. Every Get is a Scan. Get columns named<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    // R2 and R3.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    Get get = new Get(TWO);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    get.addColumn(CF, TWO);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    get.addColumn(CF, THREE);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    Scan scan = new Scan(get);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    CellGridStoreScanner scanner = new CellGridStoreScanner(scan, this.scanInfo, this.scanType);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    try {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // For a Get there should be no more next's after the first call.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      Assert.assertEquals(false, scanner.next(results));<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // Should be one result only.<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Assert.assertEquals(2, results.size());<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      // And we should have gone through optimize twice only.<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      Assert.assertEquals("First qcode is SEEK_NEXT_COL and second INCLUDE_AND_SEEK_NEXT_ROW",<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        3, scanner.count.get());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    } finally {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      scanner.close();<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>   * Ensure that optimize does not cause the Get to do more seeking than required. Optimize<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   * (see HBASE-15392) was causing us to seek all Cells in a block when a Get Scan if the next block<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * index/start key was a different row to the current one. A bug. We'd call next too often<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * because we had to exhaust all Cells in the current row making us load the next block just to<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * discard what we read there. This test is a little cryptic. Takes a bit of staring to figure<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * what it up to.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   * @throws IOException<a name="line.298"></a>
+<span class="sourceLineNo">299</span>   */<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  @Test<a name="line.300"></a>
+<span class="sourceLineNo">301</span>  public void testOptimizeAndGetWithFakedNextBlockIndexStart() throws IOException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    // First test a Get of second column in the row R2. Every Get is a Scan. Second column has a<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    // qualifier of R2.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    Get get = new Get(THREE);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    get.addColumn(CF, TWO);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    Scan scan = new Scan(get);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    CellGridStoreScanner scanner = new CellGridStoreScanner(scan, this.scanInfo, this.scanType);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    try {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      // For a Get there should be no more next's after the first call.<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      Assert.assertEquals(false, scanner.next(results));<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      // Should be one result only.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      Assert.assertEquals(1, results.size());<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      // And we should have gone through optimize twice only.<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      Assert.assertEquals("First qcode is SEEK_NEXT_COL and second INCLUDE_AND_SEEK_NEXT_ROW",<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        2, scanner.count.get());<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    } finally {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      scanner.close();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    }<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>  @Test<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  public void testScanTimeRange() throws IOException {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    String r1 = "R1";<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    // returns only 1 of these 2 even though same timestamp<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    KeyValue [] kvs = new KeyValue[] {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        KeyValueTestUtil.create(r1, CF_STR, "a", 1, KeyValue.Type.Put, "dont-care"),<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        KeyValueTestUtil.create(r1, CF_STR, "a", 2, KeyValue.Type.Put, "dont-care"),<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        KeyValueTestUtil.create(r1, CF_STR, "a", 3, KeyValue.Type.Put, "dont-care"),<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        KeyValueTestUtil.create(r1, CF_STR, "a", 4, KeyValue.Type.Put, "dont-care"),<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        KeyValueTestUtil.create(r1, CF_STR, "a", 5, KeyValue.Type.Put, "dont-care"),<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    };<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    List&lt;KeyValueScanner&gt; scanners = Arrays.&lt;KeyValueScanner&gt;asList(<a name="line.333"></a>
+<span class="sourceLineNo">334</span>        new KeyValueScanner[] {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>            new KeyValueScanFixture(CellComparator.COMPARATOR, kvs)<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    });<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    Scan scanSpec = new Scan(Bytes.toBytes(r1));<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    scanSpec.setTimeRange(0, 6);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    scanSpec.setMaxVersions();<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    List&lt;Cell&gt; results = null;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    try (StoreScanner scan =<a name="line.341"></a>
+<span class="sourceLineNo">342</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      results = new ArrayList&lt;Cell&gt;();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      Assert.assertEquals(true, scan.next(results));<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      Assert.assertEquals(5, results.size());<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      Assert.assertEquals(kvs[kvs.length - 1], results.get(0));<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    // Scan limited TimeRange<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    scanSpec = new Scan(Bytes.toBytes(r1));<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    scanSpec.setTimeRange(1, 3);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    scanSpec.setMaxVersions();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    try (StoreScanner scan =<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      results = new ArrayList&lt;Cell&gt;();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      Assert.assertEquals(true, scan.next(results));<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      Assert.assertEquals(2, results.size());<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    }<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    // Another range.<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    scanSpec = new Scan(Bytes.toBytes(r1));<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    scanSpec.setTimeRange(5, 10);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    scanSpec.setMaxVersions();<a name="line.361"></a>
 <span class="sourceLineNo">362</span>    try (StoreScanner scan =<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        new StoreScanner(new Scan().setMaxVersions(Integer.MAX_VALUE), scanInfo, scanType, null,<a name="line.363"></a>
-<span class="sourceLineNo">364</span>            scanners)) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      Assert.assertEquals(true, scan.next(results));<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      Assert.assertEquals(0, results.size());<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      Assert.assertEquals(true, scan.next(results));<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      Assert.assertEquals(1, results.size());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      Assert.assertEquals(kvs[kvs.length-1], results.get(0));<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>      Assert.assertEquals(false, scan.next(results));<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  public void testDeleteColumn() throws IOException {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    KeyValue [] kvs = new KeyValue[] {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>        KeyValueTestUtil.create("R1", "cf", "a", 10, KeyValue.Type.DeleteColumn, "dont-care"),<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        KeyValueTestUtil.create("R1", "cf", "a", 9, KeyValue.Type.Delete, "dont-care"),<a name="line.380"></a>
-<span class="sourceLineNo">381</span>        KeyValueTestUtil.create("R1", "cf", "a", 8, KeyValue.Type.Put, "dont-care"),<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        KeyValueTestUtil.create("R1", "cf", "b", 5, KeyValue.Type.Put, "dont-care")<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    };<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    try (StoreScanner scan = new StoreScanner(new Scan(), scanInfo, scanType, null,<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        scanners)) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      Assert.assertEquals(true, scan.next(results));<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      Assert.assertEquals(1, results.size());<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      Assert.assertEquals(kvs[3], results.get(0));<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    }<a name="line.391"></a>
-<span class="sourceLineNo">392</span>  }<a name="line.392"></a>
-<span class="sourceLineNo">393</span><a name="line.393"></a>
-<span class="sourceLineNo">394</span>  private static final  KeyValue [] kvs = new KeyValue[] {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        KeyValueTestUtil.create("R1", "cf", "a", 11, KeyValue.Type.Put, "dont-care"),<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        KeyValueTestUtil.create("R1", "cf", "b", 11, KeyValue.Type.Put, "dont-care"),<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        KeyValueTestUtil.create("R1", "cf", "c", 11, KeyValue.Type.Put, "dont-care"),<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        KeyValueTestUtil.create("R1", "cf", "d", 11, KeyValue.Type.Put, "dont-care"),<a name="line.398"></a>
-<span class="sourceLineNo">399</span>        KeyValueTestUtil.create("R1", "cf", "e", 11, KeyValue.Type.Put, "dont-care"),<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        KeyValueTestUtil.create("R1", "cf", "f", 11, KeyValue.Type.Put, "dont-care"),<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        KeyValueTestUtil.create("R1", "cf", "g", 11, KeyValue.Type.Put, "dont-care"),<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        KeyValueTestUtil.create("R1", "cf", "h", 11, KeyValue.Type.Put, "dont-care"),<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        KeyValueTestUtil.create("R1", "cf", "i", 11, KeyValue.Type.Put, "dont-care"),<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        KeyValueTestUtil.create("R2", "cf", "a", 11, KeyValue.Type.Put, "dont-care"),<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    };<a name="line.405"></a>
-<span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>  @Test<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public void testSkipColumn() throws IOException {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    try (StoreScanner scan =<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        new StoreScanner(new Scan(), scanInfo, scanType, getCols("a", "d"), scanners)) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      Assert.assertEquals(true, scan.next(results));<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      Assert.assertEquals(2, results.size());<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      Assert.assertEquals(kvs[0], results.get(0));<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      Assert.assertEquals(kvs[3], results.get(1));<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      results.clear();<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>      Assert.assertEquals(true, scan.next(results));<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      Assert.assertEquals(1, results.size());<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      Assert.assertEquals(kvs[kvs.length-1], results.get(0));<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>      results.clear();<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      Assert.assertEquals(false, scan.next(results));<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>  /*<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   * Test expiration of KeyValues in combination with a configured TTL for<a name="line.429"></a>
-<span class="sourceLineNo">430</span>   * a column family (as should be triggered in a major compaction).<a name="line.430"></a>
-<span class="sourceLineNo">431</span>   */<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  @Test<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  public void testWildCardTtlScan() throws IOException {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    long now = System.currentTimeMillis();<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    KeyValue [] kvs = new KeyValue[] {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        KeyValueTestUtil.create("R1", "cf", "a", now-1000, KeyValue.Type.Put, "dont-care"),<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        KeyValueTestUtil.create("R1", "cf", "b", now-10, KeyValue.Type.Put, "dont-care"),<a name="line.437"></a>
-<span class="sourceLineNo">438</span>        KeyValueTestUtil.create("R1", "cf", "c", now-200, KeyValue.Type.Put, "dont-care"),<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        KeyValueTestUtil.create("R1", "cf", "d", now-10000, KeyValue.Type.Put, "dont-care"),<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        KeyValueTestUtil.create("R2", "cf", "a", now, KeyValue.Type.Put, "dont-care"),<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        KeyValueTestUtil.create("R2", "cf", "b", now-10, KeyValue.Type.Put, "dont-care"),<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        KeyValueTestUtil.create("R2", "cf", "c", now-200, KeyValue.Type.Put, "dont-care"),<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        KeyValueTestUtil.create("R2", "cf", "c", now-1000, KeyValue.Type.Put, "dont-care")<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    };<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    Scan scan = new Scan();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    scan.setMaxVersions(1);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    ScanInfo scanInfo = new ScanInfo(CONF, CF, 0, 1, 500, KeepDeletedCells.FALSE, 0,<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        CellComparator.COMPARATOR);<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    ScanType scanType = ScanType.USER_SCAN;<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    try (StoreScanner scanner = new StoreScanner(scan, scanInfo, scanType, null, scanners)) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      Assert.assertEquals(true, scanner.next(results));<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      Assert.assertEquals(2, results.size());<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      Assert.assertEquals(kvs[1], results.get(0));<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      Assert.assertEquals(kvs[2], results.get(1));<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      results.clear();<a name="line.457"></a>
+<span class="sourceLineNo">363</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      results = new ArrayList&lt;Cell&gt;();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      Assert.assertEquals(true, scan.next(results));<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      Assert.assertEquals(1, results.size());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    // See how TimeRange and Versions interact.<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    // Another range.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    scanSpec = new Scan(Bytes.toBytes(r1));<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    scanSpec.setTimeRange(0, 10);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    scanSpec.setMaxVersions(3);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    try (StoreScanner scan = new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"),<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        scanners)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      results = new ArrayList&lt;Cell&gt;();<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      Assert.assertEquals(true, scan.next(results));<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      Assert.assertEquals(3, results.size());<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>  @Test<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public void testScanSameTimestamp() throws IOException {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    // returns only 1 of these 2 even though same timestamp<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    KeyValue [] kvs = new KeyValue[] {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.Put, "dont-care"),<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.Put, "dont-care"),<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    };<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    List&lt;KeyValueScanner&gt; scanners = Arrays.asList(<a name="line.388"></a>
+<span class="sourceLineNo">389</span>        new KeyValueScanner[] {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>            new KeyValueScanFixture(CellComparator.COMPARATOR, kvs)<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        });<a name="line.391"></a>
+<span class="sourceLineNo">392</span><a name="line.392"></a>
+<span class="sourceLineNo">393</span>    Scan scanSpec = new Scan(Bytes.toBytes("R1"));<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    // this only uses maxVersions (default=1) and TimeRange (default=all)<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    try (StoreScanner scan =<a name="line.395"></a>
+<span class="sourceLineNo">396</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      Assert.assertEquals(true, scan.next(results));<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      Assert.assertEquals(1, results.size());<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      Assert.assertEquals(kvs[0], results.get(0));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>  }<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>  /*<a name="line.404"></a>
+<span class="sourceLineNo">405</span>   * Test test shows exactly how the matcher's return codes confuses the StoreScanner<a name="line.405"></a>
+<span class="sourceLineNo">406</span>   * and prevent it from doing the right thing.  Seeking once, then nexting twice<a name="line.406"></a>
+<span class="sourceLineNo">407</span>   * should return R1, then R2, but in this case it doesnt.<a name="line.407"></a>
+<span class="sourceLineNo">408</span>   * TODO this comment makes no sense above. Appears to do the right thing.<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   * @throws IOException<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   */<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  @Test<a name="line.411"></a>
+<span class="sourceLineNo">412</span>  public void testWontNextToNext() throws IOException {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    // build the scan file:<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    KeyValue [] kvs = new KeyValue[] {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        KeyValueTestUtil.create("R1", "cf", "a", 2, KeyValue.Type.Put, "dont-care"),<a nam

<TRUNCATED>

[28/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.html
index 9e42ac9..054df6f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.html
@@ -71,411 +71,413 @@
 <span class="sourceLineNo">063</span>  private static final String MEMLOAD_BASE = "memstoreLoad_";<a name="line.63"></a>
 <span class="sourceLineNo">064</span>  private static final String HEAP_BASE = "heapOccupancy_";<a name="line.64"></a>
 <span class="sourceLineNo">065</span>  private static final String CACHE_BASE = "cacheDroppingExceptions_";<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  private static final String CLIENT_SVC = ClientService.getDescriptor().getName();<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  /** A container class for collecting details about the RPC call as it percolates. */<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  public static class CallStats {<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    private long requestSizeBytes = 0;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    private long responseSizeBytes = 0;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    private long startTime = 0;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    private long callTimeMs = 0;<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>    public long getRequestSizeBytes() {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      return requestSizeBytes;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    }<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public void setRequestSizeBytes(long requestSizeBytes) {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      this.requestSizeBytes = requestSizeBytes;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    }<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>    public long getResponseSizeBytes() {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      return responseSizeBytes;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    }<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>    public void setResponseSizeBytes(long responseSizeBytes) {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      this.responseSizeBytes = responseSizeBytes;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    }<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>    public long getStartTime() {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      return startTime;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>    public void setStartTime(long startTime) {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>      this.startTime = startTime;<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>    public long getCallTimeMs() {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      return callTimeMs;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    }<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>    public void setCallTimeMs(long callTimeMs) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      this.callTimeMs = callTimeMs;<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><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @VisibleForTesting<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  protected static final class CallTracker {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    private final String name;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    @VisibleForTesting final Timer callTimer;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    @VisibleForTesting final Histogram reqHist;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    @VisibleForTesting final Histogram respHist;<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    private CallTracker(MetricRegistry registry, String name, String subName, String scope) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      StringBuilder sb = new StringBuilder(CLIENT_SVC).append("_").append(name);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      if (subName != null) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        sb.append("(").append(subName).append(")");<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      }<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      this.name = sb.toString();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      this.callTimer = registry.timer(name(MetricsConnection.class,<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        DRTN_BASE + this.name, scope));<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      this.reqHist = registry.histogram(name(MetricsConnection.class,<a name="line.123"></a>
-<span class="sourceLineNo">124</span>        REQ_BASE + this.name, scope));<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      this.respHist = registry.histogram(name(MetricsConnection.class,<a name="line.125"></a>
-<span class="sourceLineNo">126</span>        RESP_BASE + this.name, scope));<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>    private CallTracker(MetricRegistry registry, String name, String scope) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      this(registry, name, null, scope);<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>    public void updateRpc(CallStats stats) {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      this.callTimer.update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      this.reqHist.update(stats.getRequestSizeBytes());<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      this.respHist.update(stats.getResponseSizeBytes());<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>    @Override<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    public String toString() {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      return "CallTracker:" + name;<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>  protected static class RegionStats {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    final String name;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    final Histogram memstoreLoadHist;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    final Histogram heapOccupancyHist;<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    public RegionStats(MetricRegistry registry, String name) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      this.name = name;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      this.memstoreLoadHist = registry.histogram(name(MetricsConnection.class,<a name="line.152"></a>
-<span class="sourceLineNo">153</span>          MEMLOAD_BASE + this.name));<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      this.heapOccupancyHist = registry.histogram(name(MetricsConnection.class,<a name="line.154"></a>
-<span class="sourceLineNo">155</span>          HEAP_BASE + this.name));<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>    public void update(ClientProtos.RegionLoadStats regionStatistics) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      this.memstoreLoadHist.update(regionStatistics.getMemstoreLoad());<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      this.heapOccupancyHist.update(regionStatistics.getHeapOccupancy());<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    }<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>  protected static class RunnerStats {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    final Counter normalRunners;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    final Counter delayRunners;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    final Histogram delayIntevalHist;<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    public RunnerStats(MetricRegistry registry) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      this.normalRunners = registry.counter(<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        name(MetricsConnection.class, "normalRunnersCount"));<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      this.delayRunners = registry.counter(<a name="line.173"></a>
-<span class="sourceLineNo">174</span>        name(MetricsConnection.class, "delayRunnersCount"));<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      this.delayIntevalHist = registry.histogram(<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        name(MetricsConnection.class, "delayIntervalHist"));<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    public void incrNormalRunners() {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      this.normalRunners.inc();<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>    public void incrDelayRunners() {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      this.delayRunners.inc();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    public void updateDelayInterval(long interval) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      this.delayIntevalHist.update(interval);<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><a name="line.191"></a>
-<span class="sourceLineNo">192</span>  @VisibleForTesting<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  protected ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt; serverStats<a name="line.193"></a>
-<span class="sourceLineNo">194</span>          = new ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt;();<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>  public void updateServerStats(ServerName serverName, byte[] regionName,<a name="line.196"></a>
-<span class="sourceLineNo">197</span>                                Object r) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    if (!(r instanceof Result)) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      return;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    Result result = (Result) r;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    ClientProtos.RegionLoadStats stats = result.getStats();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    if (stats == null) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      return;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    updateRegionStats(serverName, regionName, stats);<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>  @Override<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  public void updateRegionStats(ServerName serverName, byte[] regionName,<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ClientProtos.RegionLoadStats stats) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    String name = serverName.getServerName() + "," + Bytes.toStringBinary(regionName);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ConcurrentMap&lt;byte[], RegionStats&gt; rsStats = null;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    if (serverStats.containsKey(serverName)) {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      rsStats = serverStats.get(serverName);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    } else {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      rsStats = serverStats.putIfAbsent(serverName,<a name="line.217"></a>
-<span class="sourceLineNo">218</span>          new ConcurrentSkipListMap&lt;byte[], RegionStats&gt;(Bytes.BYTES_COMPARATOR));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      if (rsStats == null) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        rsStats = serverStats.get(serverName);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    RegionStats regionStats = null;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    if (rsStats.containsKey(regionName)) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      regionStats = rsStats.get(regionName);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    } else {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      regionStats = rsStats.putIfAbsent(regionName, new RegionStats(this.registry, name));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      if (regionStats == null) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>        regionStats = rsStats.get(regionName);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      }<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    regionStats.update(stats);<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">066</span>  private static final String UNKNOWN_EXCEPTION = "UnknownException";<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  private static final String CLIENT_SVC = ClientService.getDescriptor().getName();<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>  /** A container class for collecting details about the RPC call as it percolates. */<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  public static class CallStats {<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    private long requestSizeBytes = 0;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    private long responseSizeBytes = 0;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    private long startTime = 0;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    private long callTimeMs = 0;<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>    public long getRequestSizeBytes() {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      return requestSizeBytes;<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>    public void setRequestSizeBytes(long requestSizeBytes) {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>      this.requestSizeBytes = requestSizeBytes;<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>    public long getResponseSizeBytes() {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      return responseSizeBytes;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    }<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>    public void setResponseSizeBytes(long responseSizeBytes) {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      this.responseSizeBytes = responseSizeBytes;<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">092</span>    public long getStartTime() {<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      return startTime;<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>    public void setStartTime(long startTime) {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      this.startTime = startTime;<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>    public long getCallTimeMs() {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      return callTimeMs;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>    public void setCallTimeMs(long callTimeMs) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      this.callTimeMs = callTimeMs;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    }<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  }<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  @VisibleForTesting<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  protected static final class CallTracker {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    private final String name;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    @VisibleForTesting final Timer callTimer;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    @VisibleForTesting final Histogram reqHist;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    @VisibleForTesting final Histogram respHist;<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>    private CallTracker(MetricRegistry registry, String name, String subName, String scope) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      StringBuilder sb = new StringBuilder(CLIENT_SVC).append("_").append(name);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      if (subName != null) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        sb.append("(").append(subName).append(")");<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      }<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      this.name = sb.toString();<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      this.callTimer = registry.timer(name(MetricsConnection.class,<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        DRTN_BASE + this.name, scope));<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      this.reqHist = registry.histogram(name(MetricsConnection.class,<a name="line.124"></a>
+<span class="sourceLineNo">125</span>        REQ_BASE + this.name, scope));<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      this.respHist = registry.histogram(name(MetricsConnection.class,<a name="line.126"></a>
+<span class="sourceLineNo">127</span>        RESP_BASE + this.name, scope));<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>    private CallTracker(MetricRegistry registry, String name, String scope) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      this(registry, name, null, scope);<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>    public void updateRpc(CallStats stats) {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      this.callTimer.update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      this.reqHist.update(stats.getRequestSizeBytes());<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      this.respHist.update(stats.getResponseSizeBytes());<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>    @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    public String toString() {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      return "CallTracker:" + name;<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><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  protected static class RegionStats {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    final String name;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    final Histogram memstoreLoadHist;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    final Histogram heapOccupancyHist;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>    public RegionStats(MetricRegistry registry, String name) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      this.name = name;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      this.memstoreLoadHist = registry.histogram(name(MetricsConnection.class,<a name="line.153"></a>
+<span class="sourceLineNo">154</span>          MEMLOAD_BASE + this.name));<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      this.heapOccupancyHist = registry.histogram(name(MetricsConnection.class,<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          HEAP_BASE + this.name));<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>    public void update(ClientProtos.RegionLoadStats regionStatistics) {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      this.memstoreLoadHist.update(regionStatistics.getMemstoreLoad());<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      this.heapOccupancyHist.update(regionStatistics.getHeapOccupancy());<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><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  @VisibleForTesting<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  protected static class RunnerStats {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    final Counter normalRunners;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    final Counter delayRunners;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    final Histogram delayIntevalHist;<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    public RunnerStats(MetricRegistry registry) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      this.normalRunners = registry.counter(<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        name(MetricsConnection.class, "normalRunnersCount"));<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      this.delayRunners = registry.counter(<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        name(MetricsConnection.class, "delayRunnersCount"));<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      this.delayIntevalHist = registry.histogram(<a name="line.176"></a>
+<span class="sourceLineNo">177</span>        name(MetricsConnection.class, "delayIntervalHist"));<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
+<span class="sourceLineNo">179</span><a name="line.179"></a>
+<span class="sourceLineNo">180</span>    public void incrNormalRunners() {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      this.normalRunners.inc();<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
+<span class="sourceLineNo">183</span><a name="line.183"></a>
+<span class="sourceLineNo">184</span>    public void incrDelayRunners() {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      this.delayRunners.inc();<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public void updateDelayInterval(long interval) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      this.delayIntevalHist.update(interval);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  }<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>  @VisibleForTesting<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  protected ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt; serverStats<a name="line.194"></a>
+<span class="sourceLineNo">195</span>          = new ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt;();<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>  public void updateServerStats(ServerName serverName, byte[] regionName,<a name="line.197"></a>
+<span class="sourceLineNo">198</span>                                Object r) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    if (!(r instanceof Result)) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      return;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    Result result = (Result) r;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    ClientProtos.RegionLoadStats stats = result.getStats();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    if (stats == null) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      return;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    updateRegionStats(serverName, regionName, stats);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  @Override<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public void updateRegionStats(ServerName serverName, byte[] regionName,<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ClientProtos.RegionLoadStats stats) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    String name = serverName.getServerName() + "," + Bytes.toStringBinary(regionName);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ConcurrentMap&lt;byte[], RegionStats&gt; rsStats = null;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    if (serverStats.containsKey(serverName)) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      rsStats = serverStats.get(serverName);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    } else {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      rsStats = serverStats.putIfAbsent(serverName,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>          new ConcurrentSkipListMap&lt;byte[], RegionStats&gt;(Bytes.BYTES_COMPARATOR));<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      if (rsStats == null) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        rsStats = serverStats.get(serverName);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    RegionStats regionStats = null;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    if (rsStats.containsKey(regionName)) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      regionStats = rsStats.get(regionName);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    } else {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      regionStats = rsStats.putIfAbsent(regionName, new RegionStats(this.registry, name));<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      if (regionStats == null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        regionStats = rsStats.get(regionName);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      }<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    regionStats.update(stats);<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>  /** A lambda for dispatching to the appropriate metric factory method */<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  private static interface NewMetric&lt;T&gt; {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    T newMetric(Class&lt;?&gt; clazz, String name, String scope);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>  /** Anticipated number of metric entries */<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  private static final int CAPACITY = 50;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>  /** Default load factor from {@link java.util.HashMap#DEFAULT_LOAD_FACTOR} */<a name="line.243"></a>
-<span class="sourceLineNo">244</span>  private static final float LOAD_FACTOR = 0.75f;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /**<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * Anticipated number of concurrent accessor threads, from<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * {@link ConnectionImplementation#getBatchPool()}<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   */<a name="line.248"></a>
-<span class="sourceLineNo">249</span>  private static final int CONCURRENCY_LEVEL = 256;<a name="line.249"></a>
-<span class="sourceLineNo">250</span><a name="line.250"></a>
-<span class="sourceLineNo">251</span>  private final MetricRegistry registry;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  private final JmxReporter reporter;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  private final String scope;<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private final NewMetric&lt;Timer&gt; timerFactory = new NewMetric&lt;Timer&gt;() {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    @Override public Timer newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      return registry.timer(name(clazz, name, scope));<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>  private final NewMetric&lt;Histogram&gt; histogramFactory = new NewMetric&lt;Histogram&gt;() {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    @Override public Histogram newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return registry.histogram(name(clazz, name, scope));<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  };<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  private final NewMetric&lt;Counter&gt; counterFactory = new NewMetric&lt;Counter&gt;() {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    @Override public Counter newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      return registry.counter(name(clazz, name, scope));<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  };<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  // static metrics<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>  @VisibleForTesting protected final Counter metaCacheHits;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  @VisibleForTesting protected final Counter metaCacheMisses;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  @VisibleForTesting protected final CallTracker getTracker;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @VisibleForTesting protected final CallTracker scanTracker;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  @VisibleForTesting protected final CallTracker appendTracker;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  @VisibleForTesting protected final CallTracker deleteTracker;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  @VisibleForTesting protected final CallTracker incrementTracker;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  @VisibleForTesting protected final CallTracker putTracker;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @VisibleForTesting protected final CallTracker multiTracker;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  @VisibleForTesting protected final RunnerStats runnerStats;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  private final Counter metaCacheNumClearServer;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  private final Counter metaCacheNumClearRegion;<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // dynamic metrics<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>  // These maps are used to cache references to the metric instances that are managed by the<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // registry. I don't think their use perfectly removes redundant allocations, but it's<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  // a big improvement over calling registry.newMetric each time.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Timer&gt; rpcTimers =<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Histogram&gt; rpcHistograms =<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY * 2 /* tracking both request and response sizes */,<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  private final ConcurrentMap&lt;String, Counter&gt; cacheDroppingExceptions =<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>  public MetricsConnection(final ConnectionImplementation conn) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    this.scope = conn.toString();<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    this.registry = new MetricRegistry();<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    final ThreadPoolExecutor batchPool = (ThreadPoolExecutor) conn.getCurrentBatchPool();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    final ThreadPoolExecutor metaPool = (ThreadPoolExecutor) conn.getCurrentMetaLookupPool();<a name="line.305"></a>
-<span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>    this.registry.register(name(this.getClass(), "executorPoolActiveThreads", scope),<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        new RatioGauge() {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>          @Override<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          protected Ratio getRatio() {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>            return Ratio.of(batchPool.getActiveCount(), batchPool.getMaximumPoolSize());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          }<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        });<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    this.registry.register(name(this.getClass(), "metaPoolActiveThreads", scope),<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        new RatioGauge() {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>          @Override<a name="line.316"></a>
-<span class="sourceLineNo">317</span>          protected Ratio getRatio() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>            return Ratio.of(metaPool.getActiveCount(), metaPool.getMaximumPoolSize());<a name="line.318"></a>
-<span class="sourceLineNo">319</span>          }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        });<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    this.metaCacheHits = registry.counter(name(this.getClass(), "metaCacheHits", scope));<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    this.metaCacheMisses = registry.counter(name(this.getClass(), "metaCacheMisses", scope));<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    this.metaCacheNumClearServer = registry.counter(name(this.getClass(),<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      "metaCacheNumClearServer", scope));<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    this.metaCacheNumClearRegion = registry.counter(name(this.getClass(),<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      "metaCacheNumClearRegion", scope));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    this.getTracker = new CallTracker(this.registry, "Get", scope);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    this.scanTracker = new CallTracker(this.registry, "Scan", scope);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    this.appendTracker = new CallTracker(this.registry, "Mutate", "Append", scope);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    this.deleteTracker = new CallTracker(this.registry, "Mutate", "Delete", scope);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    this.incrementTracker = new CallTracker(this.registry, "Mutate", "Increment", scope);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    this.putTracker = new CallTracker(this.registry, "Mutate", "Put", scope);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    this.multiTracker = new CallTracker(this.registry, "Multi", scope);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    this.runnerStats = new RunnerStats(this.registry);<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    this.reporter = JmxReporter.forRegistry(this.registry).build();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    this.reporter.start();<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>  public void shutdown() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    this.reporter.stop();<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>  /** Produce an instance of {@link CallStats} for clients to attach to RPCs. */<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  public static CallStats newCallStats() {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    // TODO: instance pool to reduce GC?<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    return new CallStats();<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">350</span>  /** Increment the number of meta cache hits. */<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  public void incrMetaCacheHit() {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    metaCacheHits.inc();<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>  /** Increment the number of meta cache misses. */<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  public void incrMetaCacheMiss() {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    metaCacheMisses.inc();<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>  /** Increment the number of meta cache drops requested for entire RegionServer. */<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  public void incrMetaCacheNumClearServer() {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    metaCacheNumClearServer.inc();<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>  /** Increment the number of meta cache drops requested for individual region. */<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  public void incrMetaCacheNumClearRegion() {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    metaCacheNumClearRegion.inc();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  /** Increment the number of normal runner counts. */<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  public void incrNormalRunners() {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    this.runnerStats.incrNormalRunners();<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  /** Increment the number of delay runner counts. */<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  public void incrDelayRunners() {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    this.runnerStats.incrDelayRunners();<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>  /** Update delay interval of delay runner. */<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public void updateDelayInterval(long interval) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    this.runnerStats.updateDelayInterval(interval);<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>   * Get a metric for {@code key} from {@code map}, or create it with {@code factory}.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   */<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  private &lt;T&gt; T getMetric(String key, ConcurrentMap&lt;String, T&gt; map, NewMetric&lt;T&gt; factory) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    T t = map.get(key);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    if (t == null) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      t = factory.newMetric(this.getClass(), key, scope);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      T tmp = map.putIfAbsent(key, t);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      t = (tmp == null) ? t : tmp;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    }<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    return t;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  }<a name="line.396"></a>
-<span class="sourceLineNo">397</span><a name="line.397"></a>
-<span class="sourceLineNo">398</span>  /** Update call stats for non-critical-path methods */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>  private void updateRpcGeneric(MethodDescriptor method, CallStats stats) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    final String methodName = method.getService().getName() + "_" + method.getName();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    getMetric(DRTN_BASE + methodName, rpcTimers, timerFactory)<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        .update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    getMetric(REQ_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        .update(stats.getRequestSizeBytes());<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    getMetric(RESP_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        .update(stats.getResponseSizeBytes());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>  /** Report RPC context to metrics system. */<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  public void updateRpc(MethodDescriptor method, Message param, CallStats stats) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // this implementation is tied directly to protobuf implementation details. would be better<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // if we could dispatch based on something static, ie, request Message type.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    if (method.getService() == ClientService.getDescriptor()) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      switch(method.getIndex()) {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      case 0:<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        assert "Get".equals(method.getName());<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        getTracker.updateRpc(stats);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        return;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      case 1:<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        assert "Mutate".equals(method.getName());<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        final MutationType mutationType = ((MutateRequest) param).getMutation().getMutateType();<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        switch(mutationType) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        case APPEND:<a name="line.423"></a>
-<span class="sourceLineNo">424</span>          appendTracker.updateRpc(stats);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          return;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        case DELETE:<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          deleteTracker.updateRpc(stats);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          return;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        case INCREMENT:<a name="line.429"></a>
-<span class="sourceLineNo">430</span>          incrementTracker.updateRpc(stats);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>          return;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        case PUT:<a name="line.432"></a>
-<span class="sourceLineNo">433</span>          putTracker.updateRpc(stats);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>          return;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        default:<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          throw new RuntimeException("Unrecognized mutation type " + mutationType);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        }<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      case 2:<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        assert "Scan".equals(method.getName());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        scanTracker.updateRpc(stats);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        return;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      case 3:<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        assert "BulkLoadHFile".equals(method.getName());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        // use generic implementation<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        break;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      case 4:<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        assert "ExecService".equals(method.getName());<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        // use generic implementation<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        break;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      case 5:<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        assert "ExecRegionServerService".equals(method.getName());<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        // use generic implementation<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        break;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      case 6:<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        assert "Multi".equals(method.getName());<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        multiTracker.updateRpc(stats);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        return;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      default:<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        throw new RuntimeException("Unrecognized ClientService RPC type " + method.getFullName());<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      }<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    }<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // Fallback to dynamic registry lookup for DDL methods.<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    updateRpcGeneric(method, stats);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  }<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>  public void incrCacheDroppingExceptions(Object exception) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    getMetric(CACHE_BASE + exception.getClass().getSimpleName(),<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      cacheDroppingExceptions, counterFactory).inc();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>  }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>}<a name="line.470"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /** A lambda for dispatching to the appropriate metric factory method */<a name="line.237"></a>
+<span class="sourceLineNo">238</span>  private static interface NewMetric&lt;T&gt; {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    T newMetric(Class&lt;?&gt; clazz, String name, String scope);<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>  /** Anticipated number of metric entries */<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  private static final int CAPACITY = 50;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  /** Default load factor from {@link java.util.HashMap#DEFAULT_LOAD_FACTOR} */<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  private static final float LOAD_FACTOR = 0.75f;<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  /**<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * Anticipated number of concurrent accessor threads, from<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * {@link ConnectionImplementation#getBatchPool()}<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  private static final int CONCURRENCY_LEVEL = 256;<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  private final MetricRegistry registry;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  private final JmxReporter reporter;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  private final String scope;<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  private final NewMetric&lt;Timer&gt; timerFactory = new NewMetric&lt;Timer&gt;() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    @Override public Timer newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      return registry.timer(name(clazz, name, scope));<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>  private final NewMetric&lt;Histogram&gt; histogramFactory = new NewMetric&lt;Histogram&gt;() {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    @Override public Histogram newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      return registry.histogram(name(clazz, name, scope));<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  };<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  private final NewMetric&lt;Counter&gt; counterFactory = new NewMetric&lt;Counter&gt;() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    @Override public Counter newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      return registry.counter(name(clazz, name, scope));<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span>  };<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>  // static metrics<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @VisibleForTesting protected final Counter metaCacheHits;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @VisibleForTesting protected final Counter metaCacheMisses;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  @VisibleForTesting protected final CallTracker getTracker;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  @VisibleForTesting protected final CallTracker scanTracker;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  @VisibleForTesting protected final CallTracker appendTracker;<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  @VisibleForTesting protected final CallTracker deleteTracker;<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @VisibleForTesting protected final CallTracker incrementTracker;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  @VisibleForTesting protected final CallTracker putTracker;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  @VisibleForTesting protected final CallTracker multiTracker;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  @VisibleForTesting protected final RunnerStats runnerStats;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  private final Counter metaCacheNumClearServer;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  private final Counter metaCacheNumClearRegion;<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>  // dynamic metrics<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>  // These maps are used to cache references to the metric instances that are managed by the<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  // registry. I don't think their use perfectly removes redundant allocations, but it's<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  // a big improvement over calling registry.newMetric each time.<a name="line.293"></a>
+<span class="sourceLineNo">294</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Timer&gt; rpcTimers =<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Histogram&gt; rpcHistograms =<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY * 2 /* tracking both request and response sizes */,<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  private final ConcurrentMap&lt;String, Counter&gt; cacheDroppingExceptions =<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  public MetricsConnection(final ConnectionImplementation conn) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    this.scope = conn.toString();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    this.registry = new MetricRegistry();<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    final ThreadPoolExecutor batchPool = (ThreadPoolExecutor) conn.getCurrentBatchPool();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    final ThreadPoolExecutor metaPool = (ThreadPoolExecutor) conn.getCurrentMetaLookupPool();<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>    this.registry.register(name(this.getClass(), "executorPoolActiveThreads", scope),<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        new RatioGauge() {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>          @Override<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          protected Ratio getRatio() {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            return Ratio.of(batchPool.getActiveCount(), batchPool.getMaximumPoolSize());<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>    this.registry.register(name(this.getClass(), "metaPoolActiveThreads", scope),<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        new RatioGauge() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          @Override<a name="line.317"></a>
+<span class="sourceLineNo">318</span>          protected Ratio getRatio() {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>            return Ratio.of(metaPool.getActiveCount(), metaPool.getMaximumPoolSize());<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>    this.metaCacheHits = registry.counter(name(this.getClass(), "metaCacheHits", scope));<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    this.metaCacheMisses = registry.counter(name(this.getClass(), "metaCacheMisses", scope));<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    this.metaCacheNumClearServer = registry.counter(name(this.getClass(),<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      "metaCacheNumClearServer", scope));<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    this.metaCacheNumClearRegion = registry.counter(name(this.getClass(),<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      "metaCacheNumClearRegion", scope));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    this.getTracker = new CallTracker(this.registry, "Get", scope);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    this.scanTracker = new CallTracker(this.registry, "Scan", scope);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    this.appendTracker = new CallTracker(this.registry, "Mutate", "Append", scope);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    this.deleteTracker = new CallTracker(this.registry, "Mutate", "Delete", scope);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    this.incrementTracker = new CallTracker(this.registry, "Mutate", "Increment", scope);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    this.putTracker = new CallTracker(this.registry, "Mutate", "Put", scope);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    this.multiTracker = new CallTracker(this.registry, "Multi", scope);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    this.runnerStats = new RunnerStats(this.registry);<a name="line.335"></a>
+<span class="sourceLineNo">336</span><a name="line.336"></a>
+<span class="sourceLineNo">337</span>    this.reporter = JmxReporter.forRegistry(this.registry).build();<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    this.reporter.start();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  public void shutdown() {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    this.reporter.stop();<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  /** Produce an instance of {@link CallStats} for clients to attach to RPCs. */<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  public static CallStats newCallStats() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    // TODO: instance pool to reduce GC?<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    return new CallStats();<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>  /** Increment the number of meta cache hits. */<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  public void incrMetaCacheHit() {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    metaCacheHits.inc();<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>  /** Increment the number of meta cache misses. */<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  public void incrMetaCacheMiss() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    metaCacheMisses.inc();<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  }<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span>  /** Increment the number of meta cache drops requested for entire RegionServer. */<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  public void incrMetaCacheNumClearServer() {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    metaCacheNumClearServer.inc();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>  }<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span>  /** Increment the number of meta cache drops requested for individual region. */<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  public void incrMetaCacheNumClearRegion() {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    metaCacheNumClearRegion.inc();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  }<a name="line.369"></a>
+<span class="sourceLineNo">370</span><a name="line.370"></a>
+<span class="sourceLineNo">371</span>  /** Increment the number of normal runner counts. */<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  public void incrNormalRunners() {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    this.runnerStats.incrNormalRunners();<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>  /** Increment the number of delay runner counts. */<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void incrDelayRunners() {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    this.runnerStats.incrDelayRunners();<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>  /** Update delay interval of delay runner. */<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public void updateDelayInterval(long interval) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    this.runnerStats.updateDelayInterval(interval);<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>  /**<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   * Get a metric for {@code key} from {@code map}, or create it with {@code factory}.<a name="line.387"></a>
+<span class="sourceLineNo">388</span>   */<a name="line.388"></a>
+<span class="sourceLineNo">389</span>  private &lt;T&gt; T getMetric(String key, ConcurrentMap&lt;String, T&gt; map, NewMetric&lt;T&gt; factory) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    T t = map.get(key);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    if (t == null) {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      t = factory.newMetric(this.getClass(), key, scope);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      T tmp = map.putIfAbsent(key, t);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      t = (tmp == null) ? t : tmp;<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    return t;<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>  /** Update call stats for non-critical-path methods */<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  private void updateRpcGeneric(MethodDescriptor method, CallStats stats) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    final String methodName = method.getService().getName() + "_" + method.getName();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    getMetric(DRTN_BASE + methodName, rpcTimers, timerFactory)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        .update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    getMetric(REQ_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        .update(stats.getRequestSizeBytes());<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    getMetric(RESP_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        .update(stats.getResponseSizeBytes());<a name="line.407"></a>
+<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
+<span class="sourceLineNo">410</span>  /** Report RPC context to metrics system. */<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public void updateRpc(MethodDescriptor method, Message param, CallStats stats) {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    // this implementation is tied directly to protobuf implementation details. would be better<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    // if we could dispatch based on something static, ie, request Message type.<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (method.getService() == ClientService.getDescriptor()) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      switch(method.getIndex()) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      case 0:<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        assert "Get".equals(method.getName());<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        getTracker.updateRpc(stats);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        return;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      case 1:<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        assert "Mutate".equals(method.getName());<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        final MutationType mutationType = ((MutateRequest) param).getMutation().getMutateType();<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        switch(mutationType) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        case APPEND:<a name="line.424"></a>
+<span class="sourceLineNo">425</span>          appendTracker.updateRpc(stats);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          return;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        case DELETE:<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          deleteTracker.updateRpc(stats);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          return;<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        case INCREMENT:<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          incrementTracker.updateRpc(stats);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          return;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>        case PUT:<a name="line.433"></a>
+<span class="sourceLineNo">434</span>          putTracker.updateRpc(stats);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>          return;<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        default:<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          throw new RuntimeException("Unrecognized mutation type " + mutationType);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        }<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      case 2:<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        assert "Scan".equals(method.getName());<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        scanTracker.updateRpc(stats);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        return;<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      case 3:<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        assert "BulkLoadHFile".equals(method.getName());<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        // use generic implementation<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        break;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      case 4:<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        assert "ExecService".equals(method.getName());<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        // use generic implementation<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        break;<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      case 5:<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        assert "ExecRegionServerService".equals(method.getName());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        // use generic implementation<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        break;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      case 6:<a name="line.455"></a>
+<span class="sourceLineNo">456</span>        assert "Multi".equals(method.getName());<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        multiTracker.updateRpc(stats);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        return;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      default:<a name="line.459"></a>
+<span class="sourceLineNo">460</span>        throw new RuntimeException("Unrecognized ClientService RPC type " + method.getFullName());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      }<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    // Fallback to dynamic registry lookup for DDL methods.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    updateRpcGeneric(method, stats);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  public void incrCacheDroppingExceptions(Object exception) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    getMetric(CACHE_BASE +<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      (exception == null? UNKNOWN_EXCEPTION : exception.getClass().getSimpleName()),<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      cacheDroppingExceptions, counterFactory).inc();<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>}<a name="line.472"></a>
 
 
 


[31/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html
index 9e42ac9..054df6f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.NewMetric.html
@@ -71,411 +71,413 @@
 <span class="sourceLineNo">063</span>  private static final String MEMLOAD_BASE = "memstoreLoad_";<a name="line.63"></a>
 <span class="sourceLineNo">064</span>  private static final String HEAP_BASE = "heapOccupancy_";<a name="line.64"></a>
 <span class="sourceLineNo">065</span>  private static final String CACHE_BASE = "cacheDroppingExceptions_";<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  private static final String CLIENT_SVC = ClientService.getDescriptor().getName();<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  /** A container class for collecting details about the RPC call as it percolates. */<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  public static class CallStats {<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    private long requestSizeBytes = 0;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    private long responseSizeBytes = 0;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    private long startTime = 0;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    private long callTimeMs = 0;<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>    public long getRequestSizeBytes() {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      return requestSizeBytes;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    }<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public void setRequestSizeBytes(long requestSizeBytes) {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      this.requestSizeBytes = requestSizeBytes;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    }<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>    public long getResponseSizeBytes() {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      return responseSizeBytes;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    }<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>    public void setResponseSizeBytes(long responseSizeBytes) {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      this.responseSizeBytes = responseSizeBytes;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    }<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>    public long getStartTime() {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      return startTime;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>    public void setStartTime(long startTime) {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>      this.startTime = startTime;<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>    public long getCallTimeMs() {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      return callTimeMs;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    }<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>    public void setCallTimeMs(long callTimeMs) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      this.callTimeMs = callTimeMs;<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><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @VisibleForTesting<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  protected static final class CallTracker {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    private final String name;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    @VisibleForTesting final Timer callTimer;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    @VisibleForTesting final Histogram reqHist;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    @VisibleForTesting final Histogram respHist;<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    private CallTracker(MetricRegistry registry, String name, String subName, String scope) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      StringBuilder sb = new StringBuilder(CLIENT_SVC).append("_").append(name);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      if (subName != null) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        sb.append("(").append(subName).append(")");<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      }<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      this.name = sb.toString();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      this.callTimer = registry.timer(name(MetricsConnection.class,<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        DRTN_BASE + this.name, scope));<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      this.reqHist = registry.histogram(name(MetricsConnection.class,<a name="line.123"></a>
-<span class="sourceLineNo">124</span>        REQ_BASE + this.name, scope));<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      this.respHist = registry.histogram(name(MetricsConnection.class,<a name="line.125"></a>
-<span class="sourceLineNo">126</span>        RESP_BASE + this.name, scope));<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>    private CallTracker(MetricRegistry registry, String name, String scope) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      this(registry, name, null, scope);<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>    public void updateRpc(CallStats stats) {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      this.callTimer.update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      this.reqHist.update(stats.getRequestSizeBytes());<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      this.respHist.update(stats.getResponseSizeBytes());<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>    @Override<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    public String toString() {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      return "CallTracker:" + name;<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>  protected static class RegionStats {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    final String name;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    final Histogram memstoreLoadHist;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    final Histogram heapOccupancyHist;<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    public RegionStats(MetricRegistry registry, String name) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      this.name = name;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      this.memstoreLoadHist = registry.histogram(name(MetricsConnection.class,<a name="line.152"></a>
-<span class="sourceLineNo">153</span>          MEMLOAD_BASE + this.name));<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      this.heapOccupancyHist = registry.histogram(name(MetricsConnection.class,<a name="line.154"></a>
-<span class="sourceLineNo">155</span>          HEAP_BASE + this.name));<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>    public void update(ClientProtos.RegionLoadStats regionStatistics) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      this.memstoreLoadHist.update(regionStatistics.getMemstoreLoad());<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      this.heapOccupancyHist.update(regionStatistics.getHeapOccupancy());<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    }<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>  protected static class RunnerStats {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    final Counter normalRunners;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    final Counter delayRunners;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    final Histogram delayIntevalHist;<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    public RunnerStats(MetricRegistry registry) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      this.normalRunners = registry.counter(<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        name(MetricsConnection.class, "normalRunnersCount"));<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      this.delayRunners = registry.counter(<a name="line.173"></a>
-<span class="sourceLineNo">174</span>        name(MetricsConnection.class, "delayRunnersCount"));<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      this.delayIntevalHist = registry.histogram(<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        name(MetricsConnection.class, "delayIntervalHist"));<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    public void incrNormalRunners() {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      this.normalRunners.inc();<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>    public void incrDelayRunners() {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      this.delayRunners.inc();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    public void updateDelayInterval(long interval) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      this.delayIntevalHist.update(interval);<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><a name="line.191"></a>
-<span class="sourceLineNo">192</span>  @VisibleForTesting<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  protected ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt; serverStats<a name="line.193"></a>
-<span class="sourceLineNo">194</span>          = new ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt;();<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>  public void updateServerStats(ServerName serverName, byte[] regionName,<a name="line.196"></a>
-<span class="sourceLineNo">197</span>                                Object r) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    if (!(r instanceof Result)) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      return;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    Result result = (Result) r;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    ClientProtos.RegionLoadStats stats = result.getStats();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    if (stats == null) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      return;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    updateRegionStats(serverName, regionName, stats);<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>  @Override<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  public void updateRegionStats(ServerName serverName, byte[] regionName,<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ClientProtos.RegionLoadStats stats) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    String name = serverName.getServerName() + "," + Bytes.toStringBinary(regionName);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ConcurrentMap&lt;byte[], RegionStats&gt; rsStats = null;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    if (serverStats.containsKey(serverName)) {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      rsStats = serverStats.get(serverName);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    } else {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      rsStats = serverStats.putIfAbsent(serverName,<a name="line.217"></a>
-<span class="sourceLineNo">218</span>          new ConcurrentSkipListMap&lt;byte[], RegionStats&gt;(Bytes.BYTES_COMPARATOR));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      if (rsStats == null) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        rsStats = serverStats.get(serverName);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    RegionStats regionStats = null;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    if (rsStats.containsKey(regionName)) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      regionStats = rsStats.get(regionName);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    } else {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      regionStats = rsStats.putIfAbsent(regionName, new RegionStats(this.registry, name));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      if (regionStats == null) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>        regionStats = rsStats.get(regionName);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      }<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    regionStats.update(stats);<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">066</span>  private static final String UNKNOWN_EXCEPTION = "UnknownException";<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  private static final String CLIENT_SVC = ClientService.getDescriptor().getName();<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>  /** A container class for collecting details about the RPC call as it percolates. */<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  public static class CallStats {<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    private long requestSizeBytes = 0;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    private long responseSizeBytes = 0;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    private long startTime = 0;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    private long callTimeMs = 0;<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>    public long getRequestSizeBytes() {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      return requestSizeBytes;<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>    public void setRequestSizeBytes(long requestSizeBytes) {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>      this.requestSizeBytes = requestSizeBytes;<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>    public long getResponseSizeBytes() {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      return responseSizeBytes;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    }<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>    public void setResponseSizeBytes(long responseSizeBytes) {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      this.responseSizeBytes = responseSizeBytes;<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">092</span>    public long getStartTime() {<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      return startTime;<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>    public void setStartTime(long startTime) {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      this.startTime = startTime;<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>    public long getCallTimeMs() {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      return callTimeMs;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>    public void setCallTimeMs(long callTimeMs) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      this.callTimeMs = callTimeMs;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    }<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  }<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  @VisibleForTesting<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  protected static final class CallTracker {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    private final String name;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    @VisibleForTesting final Timer callTimer;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    @VisibleForTesting final Histogram reqHist;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    @VisibleForTesting final Histogram respHist;<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>    private CallTracker(MetricRegistry registry, String name, String subName, String scope) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      StringBuilder sb = new StringBuilder(CLIENT_SVC).append("_").append(name);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      if (subName != null) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        sb.append("(").append(subName).append(")");<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      }<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      this.name = sb.toString();<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      this.callTimer = registry.timer(name(MetricsConnection.class,<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        DRTN_BASE + this.name, scope));<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      this.reqHist = registry.histogram(name(MetricsConnection.class,<a name="line.124"></a>
+<span class="sourceLineNo">125</span>        REQ_BASE + this.name, scope));<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      this.respHist = registry.histogram(name(MetricsConnection.class,<a name="line.126"></a>
+<span class="sourceLineNo">127</span>        RESP_BASE + this.name, scope));<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>    private CallTracker(MetricRegistry registry, String name, String scope) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      this(registry, name, null, scope);<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>    public void updateRpc(CallStats stats) {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      this.callTimer.update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      this.reqHist.update(stats.getRequestSizeBytes());<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      this.respHist.update(stats.getResponseSizeBytes());<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>    @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    public String toString() {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      return "CallTracker:" + name;<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><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  protected static class RegionStats {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    final String name;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    final Histogram memstoreLoadHist;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    final Histogram heapOccupancyHist;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>    public RegionStats(MetricRegistry registry, String name) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      this.name = name;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      this.memstoreLoadHist = registry.histogram(name(MetricsConnection.class,<a name="line.153"></a>
+<span class="sourceLineNo">154</span>          MEMLOAD_BASE + this.name));<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      this.heapOccupancyHist = registry.histogram(name(MetricsConnection.class,<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          HEAP_BASE + this.name));<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>    public void update(ClientProtos.RegionLoadStats regionStatistics) {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      this.memstoreLoadHist.update(regionStatistics.getMemstoreLoad());<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      this.heapOccupancyHist.update(regionStatistics.getHeapOccupancy());<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><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  @VisibleForTesting<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  protected static class RunnerStats {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    final Counter normalRunners;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    final Counter delayRunners;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    final Histogram delayIntevalHist;<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    public RunnerStats(MetricRegistry registry) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      this.normalRunners = registry.counter(<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        name(MetricsConnection.class, "normalRunnersCount"));<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      this.delayRunners = registry.counter(<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        name(MetricsConnection.class, "delayRunnersCount"));<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      this.delayIntevalHist = registry.histogram(<a name="line.176"></a>
+<span class="sourceLineNo">177</span>        name(MetricsConnection.class, "delayIntervalHist"));<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
+<span class="sourceLineNo">179</span><a name="line.179"></a>
+<span class="sourceLineNo">180</span>    public void incrNormalRunners() {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      this.normalRunners.inc();<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
+<span class="sourceLineNo">183</span><a name="line.183"></a>
+<span class="sourceLineNo">184</span>    public void incrDelayRunners() {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      this.delayRunners.inc();<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public void updateDelayInterval(long interval) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      this.delayIntevalHist.update(interval);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  }<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>  @VisibleForTesting<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  protected ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt; serverStats<a name="line.194"></a>
+<span class="sourceLineNo">195</span>          = new ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt;();<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>  public void updateServerStats(ServerName serverName, byte[] regionName,<a name="line.197"></a>
+<span class="sourceLineNo">198</span>                                Object r) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    if (!(r instanceof Result)) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      return;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    Result result = (Result) r;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    ClientProtos.RegionLoadStats stats = result.getStats();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    if (stats == null) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      return;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    updateRegionStats(serverName, regionName, stats);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  @Override<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public void updateRegionStats(ServerName serverName, byte[] regionName,<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ClientProtos.RegionLoadStats stats) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    String name = serverName.getServerName() + "," + Bytes.toStringBinary(regionName);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ConcurrentMap&lt;byte[], RegionStats&gt; rsStats = null;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    if (serverStats.containsKey(serverName)) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      rsStats = serverStats.get(serverName);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    } else {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      rsStats = serverStats.putIfAbsent(serverName,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>          new ConcurrentSkipListMap&lt;byte[], RegionStats&gt;(Bytes.BYTES_COMPARATOR));<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      if (rsStats == null) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        rsStats = serverStats.get(serverName);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    RegionStats regionStats = null;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    if (rsStats.containsKey(regionName)) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      regionStats = rsStats.get(regionName);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    } else {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      regionStats = rsStats.putIfAbsent(regionName, new RegionStats(this.registry, name));<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      if (regionStats == null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        regionStats = rsStats.get(regionName);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      }<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    regionStats.update(stats);<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>  /** A lambda for dispatching to the appropriate metric factory method */<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  private static interface NewMetric&lt;T&gt; {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    T newMetric(Class&lt;?&gt; clazz, String name, String scope);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>  /** Anticipated number of metric entries */<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  private static final int CAPACITY = 50;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>  /** Default load factor from {@link java.util.HashMap#DEFAULT_LOAD_FACTOR} */<a name="line.243"></a>
-<span class="sourceLineNo">244</span>  private static final float LOAD_FACTOR = 0.75f;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /**<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * Anticipated number of concurrent accessor threads, from<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * {@link ConnectionImplementation#getBatchPool()}<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   */<a name="line.248"></a>
-<span class="sourceLineNo">249</span>  private static final int CONCURRENCY_LEVEL = 256;<a name="line.249"></a>
-<span class="sourceLineNo">250</span><a name="line.250"></a>
-<span class="sourceLineNo">251</span>  private final MetricRegistry registry;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  private final JmxReporter reporter;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  private final String scope;<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private final NewMetric&lt;Timer&gt; timerFactory = new NewMetric&lt;Timer&gt;() {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    @Override public Timer newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      return registry.timer(name(clazz, name, scope));<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>  private final NewMetric&lt;Histogram&gt; histogramFactory = new NewMetric&lt;Histogram&gt;() {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    @Override public Histogram newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return registry.histogram(name(clazz, name, scope));<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  };<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  private final NewMetric&lt;Counter&gt; counterFactory = new NewMetric&lt;Counter&gt;() {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    @Override public Counter newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      return registry.counter(name(clazz, name, scope));<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  };<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  // static metrics<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>  @VisibleForTesting protected final Counter metaCacheHits;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  @VisibleForTesting protected final Counter metaCacheMisses;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  @VisibleForTesting protected final CallTracker getTracker;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @VisibleForTesting protected final CallTracker scanTracker;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  @VisibleForTesting protected final CallTracker appendTracker;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  @VisibleForTesting protected final CallTracker deleteTracker;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  @VisibleForTesting protected final CallTracker incrementTracker;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  @VisibleForTesting protected final CallTracker putTracker;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @VisibleForTesting protected final CallTracker multiTracker;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  @VisibleForTesting protected final RunnerStats runnerStats;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  private final Counter metaCacheNumClearServer;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  private final Counter metaCacheNumClearRegion;<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // dynamic metrics<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>  // These maps are used to cache references to the metric instances that are managed by the<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // registry. I don't think their use perfectly removes redundant allocations, but it's<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  // a big improvement over calling registry.newMetric each time.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Timer&gt; rpcTimers =<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Histogram&gt; rpcHistograms =<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY * 2 /* tracking both request and response sizes */,<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  private final ConcurrentMap&lt;String, Counter&gt; cacheDroppingExceptions =<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>  public MetricsConnection(final ConnectionImplementation conn) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    this.scope = conn.toString();<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    this.registry = new MetricRegistry();<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    final ThreadPoolExecutor batchPool = (ThreadPoolExecutor) conn.getCurrentBatchPool();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    final ThreadPoolExecutor metaPool = (ThreadPoolExecutor) conn.getCurrentMetaLookupPool();<a name="line.305"></a>
-<span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>    this.registry.register(name(this.getClass(), "executorPoolActiveThreads", scope),<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        new RatioGauge() {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>          @Override<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          protected Ratio getRatio() {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>            return Ratio.of(batchPool.getActiveCount(), batchPool.getMaximumPoolSize());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          }<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        });<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    this.registry.register(name(this.getClass(), "metaPoolActiveThreads", scope),<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        new RatioGauge() {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>          @Override<a name="line.316"></a>
-<span class="sourceLineNo">317</span>          protected Ratio getRatio() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>            return Ratio.of(metaPool.getActiveCount(), metaPool.getMaximumPoolSize());<a name="line.318"></a>
-<span class="sourceLineNo">319</span>          }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        });<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    this.metaCacheHits = registry.counter(name(this.getClass(), "metaCacheHits", scope));<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    this.metaCacheMisses = registry.counter(name(this.getClass(), "metaCacheMisses", scope));<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    this.metaCacheNumClearServer = registry.counter(name(this.getClass(),<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      "metaCacheNumClearServer", scope));<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    this.metaCacheNumClearRegion = registry.counter(name(this.getClass(),<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      "metaCacheNumClearRegion", scope));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    this.getTracker = new CallTracker(this.registry, "Get", scope);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    this.scanTracker = new CallTracker(this.registry, "Scan", scope);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    this.appendTracker = new CallTracker(this.registry, "Mutate", "Append", scope);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    this.deleteTracker = new CallTracker(this.registry, "Mutate", "Delete", scope);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    this.incrementTracker = new CallTracker(this.registry, "Mutate", "Increment", scope);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    this.putTracker = new CallTracker(this.registry, "Mutate", "Put", scope);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    this.multiTracker = new CallTracker(this.registry, "Multi", scope);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    this.runnerStats = new RunnerStats(this.registry);<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    this.reporter = JmxReporter.forRegistry(this.registry).build();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    this.reporter.start();<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>  public void shutdown() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    this.reporter.stop();<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>  /** Produce an instance of {@link CallStats} for clients to attach to RPCs. */<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  public static CallStats newCallStats() {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    // TODO: instance pool to reduce GC?<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    return new CallStats();<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">350</span>  /** Increment the number of meta cache hits. */<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  public void incrMetaCacheHit() {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    metaCacheHits.inc();<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>  /** Increment the number of meta cache misses. */<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  public void incrMetaCacheMiss() {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    metaCacheMisses.inc();<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>  /** Increment the number of meta cache drops requested for entire RegionServer. */<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  public void incrMetaCacheNumClearServer() {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    metaCacheNumClearServer.inc();<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>  /** Increment the number of meta cache drops requested for individual region. */<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  public void incrMetaCacheNumClearRegion() {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    metaCacheNumClearRegion.inc();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  /** Increment the number of normal runner counts. */<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  public void incrNormalRunners() {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    this.runnerStats.incrNormalRunners();<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  /** Increment the number of delay runner counts. */<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  public void incrDelayRunners() {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    this.runnerStats.incrDelayRunners();<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>  /** Update delay interval of delay runner. */<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public void updateDelayInterval(long interval) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    this.runnerStats.updateDelayInterval(interval);<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>   * Get a metric for {@code key} from {@code map}, or create it with {@code factory}.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   */<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  private &lt;T&gt; T getMetric(String key, ConcurrentMap&lt;String, T&gt; map, NewMetric&lt;T&gt; factory) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    T t = map.get(key);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    if (t == null) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      t = factory.newMetric(this.getClass(), key, scope);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      T tmp = map.putIfAbsent(key, t);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      t = (tmp == null) ? t : tmp;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    }<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    return t;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  }<a name="line.396"></a>
-<span class="sourceLineNo">397</span><a name="line.397"></a>
-<span class="sourceLineNo">398</span>  /** Update call stats for non-critical-path methods */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>  private void updateRpcGeneric(MethodDescriptor method, CallStats stats) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    final String methodName = method.getService().getName() + "_" + method.getName();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    getMetric(DRTN_BASE + methodName, rpcTimers, timerFactory)<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        .update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    getMetric(REQ_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        .update(stats.getRequestSizeBytes());<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    getMetric(RESP_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        .update(stats.getResponseSizeBytes());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>  /** Report RPC context to metrics system. */<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  public void updateRpc(MethodDescriptor method, Message param, CallStats stats) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // this implementation is tied directly to protobuf implementation details. would be better<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // if we could dispatch based on something static, ie, request Message type.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    if (method.getService() == ClientService.getDescriptor()) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      switch(method.getIndex()) {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      case 0:<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        assert "Get".equals(method.getName());<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        getTracker.updateRpc(stats);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        return;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      case 1:<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        assert "Mutate".equals(method.getName());<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        final MutationType mutationType = ((MutateRequest) param).getMutation().getMutateType();<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        switch(mutationType) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        case APPEND:<a name="line.423"></a>
-<span class="sourceLineNo">424</span>          appendTracker.updateRpc(stats);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          return;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        case DELETE:<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          deleteTracker.updateRpc(stats);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          return;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        case INCREMENT:<a name="line.429"></a>
-<span class="sourceLineNo">430</span>          incrementTracker.updateRpc(stats);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>          return;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        case PUT:<a name="line.432"></a>
-<span class="sourceLineNo">433</span>          putTracker.updateRpc(stats);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>          return;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        default:<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          throw new RuntimeException("Unrecognized mutation type " + mutationType);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        }<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      case 2:<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        assert "Scan".equals(method.getName());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        scanTracker.updateRpc(stats);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        return;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      case 3:<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        assert "BulkLoadHFile".equals(method.getName());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        // use generic implementation<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        break;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      case 4:<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        assert "ExecService".equals(method.getName());<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        // use generic implementation<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        break;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      case 5:<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        assert "ExecRegionServerService".equals(method.getName());<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        // use generic implementation<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        break;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      case 6:<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        assert "Multi".equals(method.getName());<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        multiTracker.updateRpc(stats);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        return;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      default:<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        throw new RuntimeException("Unrecognized ClientService RPC type " + method.getFullName());<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      }<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    }<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // Fallback to dynamic registry lookup for DDL methods.<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    updateRpcGeneric(method, stats);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  }<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>  public void incrCacheDroppingExceptions(Object exception) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    getMetric(CACHE_BASE + exception.getClass().getSimpleName(),<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      cacheDroppingExceptions, counterFactory).inc();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>  }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>}<a name="line.470"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /** A lambda for dispatching to the appropriate metric factory method */<a name="line.237"></a>
+<span class="sourceLineNo">238</span>  private static interface NewMetric&lt;T&gt; {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    T newMetric(Class&lt;?&gt; clazz, String name, String scope);<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>  /** Anticipated number of metric entries */<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  private static final int CAPACITY = 50;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  /** Default load factor from {@link java.util.HashMap#DEFAULT_LOAD_FACTOR} */<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  private static final float LOAD_FACTOR = 0.75f;<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  /**<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * Anticipated number of concurrent accessor threads, from<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * {@link ConnectionImplementation#getBatchPool()}<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  private static final int CONCURRENCY_LEVEL = 256;<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  private final MetricRegistry registry;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  private final JmxReporter reporter;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  private final String scope;<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  private final NewMetric&lt;Timer&gt; timerFactory = new NewMetric&lt;Timer&gt;() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    @Override public Timer newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      return registry.timer(name(clazz, name, scope));<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>  private final NewMetric&lt;Histogram&gt; histogramFactory = new NewMetric&lt;Histogram&gt;() {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    @Override public Histogram newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      return registry.histogram(name(clazz, name, scope));<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  };<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  private final NewMetric&lt;Counter&gt; counterFactory = new NewMetric&lt;Counter&gt;() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    @Override public Counter newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      return registry.counter(name(clazz, name, scope));<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span>  };<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>  // static metrics<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @VisibleForTesting protected final Counter metaCacheHits;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @VisibleForTesting protected final Counter metaCacheMisses;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  @VisibleForTesting protected final CallTracker getTracker;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  @VisibleForTesting protected final CallTracker scanTracker;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  @VisibleForTesting protected final CallTracker appendTracker;<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  @VisibleForTesting protected final CallTracker deleteTracker;<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @VisibleForTesting protected final CallTracker incrementTracker;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  @VisibleForTesting protected final CallTracker putTracker;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  @VisibleForTesting protected final CallTracker multiTracker;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  @VisibleForTesting protected final RunnerStats runnerStats;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  private final Counter metaCacheNumClearServer;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  private final Counter metaCacheNumClearRegion;<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>  // dynamic metrics<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>  // These maps are used to cache references to the metric instances that are managed by the<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  // registry. I don't think their use perfectly removes redundant allocations, but it's<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  // a big improvement over calling registry.newMetric each time.<a name="line.293"></a>
+<span class="sourceLineNo">294</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Timer&gt; rpcTimers =<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Histogram&gt; rpcHistograms =<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY * 2 /* tracking both request and response sizes */,<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  private final ConcurrentMap&lt;String, Counter&gt; cacheDroppingExceptions =<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  public MetricsConnection(final ConnectionImplementation conn) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    this.scope = conn.toString();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    this.registry = new MetricRegistry();<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    final ThreadPoolExecutor batchPool = (ThreadPoolExecutor) conn.getCurrentBatchPool();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    final ThreadPoolExecutor metaPool = (ThreadPoolExecutor) conn.getCurrentMetaLookupPool();<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>    this.registry.register(name(this.getClass(), "executorPoolActiveThreads", scope),<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        new RatioGauge() {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>          @Override<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          protected Ratio getRatio() {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            return Ratio.of(batchPool.getActiveCount(), batchPool.getMaximumPoolSize());<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>    this.registry.register(name(this.getClass(), "metaPoolActiveThreads", scope),<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        new RatioGauge() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          @Override<a name="line.317"></a>
+<span class="sourceLineNo">318</span>          protected Ratio getRatio() {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>            return Ratio.of(metaPool.getActiveCount(), metaPool.getMaximumPoolSize());<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>    this.metaCacheHits = registry.counter(name(this.getClass(), "metaCacheHits", scope));<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    this.metaCacheMisses = registry.counter(name(this.getClass(), "metaCacheMisses", scope));<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    this.metaCacheNumClearServer = registry.counter(name(this.getClass(),<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      "metaCacheNumClearServer", scope));<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    this.metaCacheNumClearRegion = registry.counter(name(this.getClass(),<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      "metaCacheNumClearRegion", scope));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    this.getTracker = new CallTracker(this.registry, "Get", scope);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    this.scanTracker = new CallTracker(this.registry, "Scan", scope);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    this.appendTracker = new CallTracker(this.registry, "Mutate", "Append", scope);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    this.deleteTracker = new CallTracker(this.registry, "Mutate", "Delete", scope);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    this.incrementTracker = new CallTracker(this.registry, "Mutate", "Increment", scope);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    this.putTracker = new CallTracker(this.registry, "Mutate", "Put", scope);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    this.multiTracker = new CallTracker(this.registry, "Multi", scope);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    this.runnerStats = new RunnerStats(this.registry);<a name="line.335"></a>
+<span class="sourceLineNo">336</span><a name="line.336"></a>
+<span class="sourceLineNo">337</span>    this.reporter = JmxReporter.forRegistry(this.registry).build();<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    this.reporter.start();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  public void shutdown() {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    this.reporter.stop();<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  /** Produce an instance of {@link CallStats} for clients to attach to RPCs. */<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  public static CallStats newCallStats() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    // TODO: instance pool to reduce GC?<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    return new CallStats();<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>  /** Increment the number of meta cache hits. */<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  public void incrMetaCacheHit() {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    metaCacheHits.inc();<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>  /** Increment the number of meta cache misses. */<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  public void incrMetaCacheMiss() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    metaCacheMisses.inc();<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  }<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span>  /** Increment the number of meta cache drops requested for entire RegionServer. */<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  public void incrMetaCacheNumClearServer() {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    metaCacheNumClearServer.inc();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>  }<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span>  /** Increment the number of meta cache drops requested for individual region. */<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  public void incrMetaCacheNumClearRegion() {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    metaCacheNumClearRegion.inc();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  }<a name="line.369"></a>
+<span class="sourceLineNo">370</span><a name="line.370"></a>
+<span class="sourceLineNo">371</span>  /** Increment the number of normal runner counts. */<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  public void incrNormalRunners() {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    this.runnerStats.incrNormalRunners();<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>  /** Increment the number of delay runner counts. */<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void incrDelayRunners() {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    this.runnerStats.incrDelayRunners();<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>  /** Update delay interval of delay runner. */<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public void updateDelayInterval(long interval) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    this.runnerStats.updateDelayInterval(interval);<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>  /**<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   * Get a metric for {@code key} from {@code map}, or create it with {@code factory}.<a name="line.387"></a>
+<span class="sourceLineNo">388</span>   */<a name="line.388"></a>
+<span class="sourceLineNo">389</span>  private &lt;T&gt; T getMetric(String key, ConcurrentMap&lt;String, T&gt; map, NewMetric&lt;T&gt; factory) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    T t = map.get(key);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    if (t == null) {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      t = factory.newMetric(this.getClass(), key, scope);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      T tmp = map.putIfAbsent(key, t);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      t = (tmp == null) ? t : tmp;<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    return t;<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>  /** Update call stats for non-critical-path methods */<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  private void updateRpcGeneric(MethodDescriptor method, CallStats stats) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    final String methodName = method.getService().getName() + "_" + method.getName();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    getMetric(DRTN_BASE + methodName, rpcTimers, timerFactory)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        .update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    getMetric(REQ_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        .update(stats.getRequestSizeBytes());<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    getMetric(RESP_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        .update(stats.getResponseSizeBytes());<a name="line.407"></a>
+<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
+<span class="sourceLineNo">410</span>  /** Report RPC context to metrics system. */<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public void updateRpc(MethodDescriptor method, Message param, CallStats stats) {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    // this implementation is tied directly to protobuf implementation details. would be better<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    // if we could dispatch based on something static, ie, request Message type.<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (method.getService() == ClientService.getDescriptor()) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      switch(method.getIndex()) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      case 0:<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        assert "Get".equals(method.getName());<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        getTracker.updateRpc(stats);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        return;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      case 1:<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        assert "Mutate".equals(method.getName());<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        final MutationType mutationType = ((MutateRequest) param).getMutation().getMutateType();<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        switch(mutationType) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        case APPEND:<a name="line.424"></a>
+<span class="sourceLineNo">425</span>          appendTracker.updateRpc(stats);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          return;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        case DELETE:<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          deleteTracker.updateRpc(stats);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          return;<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        case INCREMENT:<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          incrementTracker.updateRpc(stats);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          return;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>        case PUT:<a name="line.433"></a>
+<span class="sourceLineNo">434</span>          putTracker.updateRpc(stats);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>          return;<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        default:<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          throw new RuntimeException("Unrecognized mutation type " + mutationType);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        }<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      case 2:<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        assert "Scan".equals(method.getName());<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        scanTracker.updateRpc(stats);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        return;<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      case 3:<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        assert "BulkLoadHFile".equals(method.getName());<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        // use generic implementation<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        break;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      case 4:<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        assert "ExecService".equals(method.getName());<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        // use generic implementation<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        break;<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      case 5:<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        assert "ExecRegionServerService".equals(method.getName());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        // use generic implementation<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        break;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      case 6:<a name="line.455"></a>
+<span class="sourceLineNo">456</span>        assert "Multi".equals(method.getName());<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        multiTracker.updateRpc(stats);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        return;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      default:<a name="line.459"></a>
+<span class="sourceLineNo">460</span>        throw new RuntimeException("Unrecognized ClientService RPC type " + method.getFullName());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      }<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    // Fallback to dynamic registry lookup for DDL methods.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    updateRpcGeneric(method, stats);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  public void incrCacheDroppingExceptions(Object exception) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    getMetric(CACHE_BASE +<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      (exception == null? UNKNOWN_EXCEPTION : exception.getClass().getSimpleName()),<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      cacheDroppingExceptions, counterFactory).inc();<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>}<a name="line.472"></a>
 
 
 


[06/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html
new file mode 100644
index 0000000..be50739
--- /dev/null
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html
@@ -0,0 +1,923 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+<title>Source code</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<div class="sourceContainer">
+<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
+<span class="sourceLineNo">002</span> *<a name="line.2"></a>
+<span class="sourceLineNo">003</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.3"></a>
+<span class="sourceLineNo">004</span> * or more contributor license agreements.  See the NOTICE file<a name="line.4"></a>
+<span class="sourceLineNo">005</span> * distributed with this work for additional information<a name="line.5"></a>
+<span class="sourceLineNo">006</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.6"></a>
+<span class="sourceLineNo">007</span> * to you under the Apache License, Version 2.0 (the<a name="line.7"></a>
+<span class="sourceLineNo">008</span> * "License"); you may not use this file except in compliance<a name="line.8"></a>
+<span class="sourceLineNo">009</span> * with the License.  You may obtain a copy of the License at<a name="line.9"></a>
+<span class="sourceLineNo">010</span> *<a name="line.10"></a>
+<span class="sourceLineNo">011</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.11"></a>
+<span class="sourceLineNo">012</span> *<a name="line.12"></a>
+<span class="sourceLineNo">013</span> * Unless required by applicable law or agreed to in writing, software<a name="line.13"></a>
+<span class="sourceLineNo">014</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.14"></a>
+<span class="sourceLineNo">015</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.15"></a>
+<span class="sourceLineNo">016</span> * See the License for the specific language governing permissions and<a name="line.16"></a>
+<span class="sourceLineNo">017</span> * limitations under the License.<a name="line.17"></a>
+<span class="sourceLineNo">018</span> */<a name="line.18"></a>
+<span class="sourceLineNo">019</span><a name="line.19"></a>
+<span class="sourceLineNo">020</span>package org.apache.hadoop.hbase.regionserver;<a name="line.20"></a>
+<span class="sourceLineNo">021</span><a name="line.21"></a>
+<span class="sourceLineNo">022</span>import static org.apache.hadoop.hbase.regionserver.KeyValueScanFixture.scanFixture;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import static org.junit.Assert.*;<a name="line.23"></a>
+<span class="sourceLineNo">024</span><a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.io.IOException;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.util.ArrayList;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.Arrays;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.List;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.NavigableSet;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.TreeSet;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.31"></a>
+<span class="sourceLineNo">032</span><a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.commons.logging.Log;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.commons.logging.LogFactory;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.conf.Configuration;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.CategoryBasedTimeout;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.Cell;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.CellComparator;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HBaseConfiguration;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HConstants;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.KeepDeletedCells;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.KeyValue;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.KeyValueTestUtil;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.Get;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.EnvironmentEdge;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.junit.Assert;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.junit.Rule;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.junit.Test;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.junit.experimental.categories.Category;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.junit.rules.TestName;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.junit.rules.TestRule;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>// Can't be small as it plays with EnvironmentEdgeManager<a name="line.59"></a>
+<span class="sourceLineNo">060</span>@Category({RegionServerTests.class, MediumTests.class})<a name="line.60"></a>
+<span class="sourceLineNo">061</span>public class TestStoreScanner {<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  private static final Log LOG = LogFactory.getLog(TestStoreScanner.class);<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  @Rule public TestName name = new TestName();<a name="line.63"></a>
+<span class="sourceLineNo">064</span>  @Rule public final TestRule timeout = CategoryBasedTimeout.builder().withTimeout(this.getClass()).<a name="line.64"></a>
+<span class="sourceLineNo">065</span>      withLookingForStuckThread(true).build();<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  private static final String CF_STR = "cf";<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  private static final byte [] CF = Bytes.toBytes(CF_STR);<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  static Configuration CONF = HBaseConfiguration.create();<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  private ScanInfo scanInfo = new ScanInfo(CONF, CF, 0, Integer.MAX_VALUE,<a name="line.69"></a>
+<span class="sourceLineNo">070</span>      Long.MAX_VALUE, KeepDeletedCells.FALSE, 0, CellComparator.COMPARATOR);<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  private ScanType scanType = ScanType.USER_SCAN;<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>   * From here on down, we have a bunch of defines and specific CELL_GRID of Cells. The<a name="line.74"></a>
+<span class="sourceLineNo">075</span>   * CELL_GRID then has a Scanner that can fake out 'block' transitions. All this elaborate<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * setup is for tests that ensure we don't overread, and that the<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   * {@link StoreScanner#optimize(org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode,<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   * Cell)} is not overly enthusiastic.<a name="line.78"></a>
+<span class="sourceLineNo">079</span>   */<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private static final byte [] ZERO = new byte [] {'0'};<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private static final byte [] ZERO_POINT_ZERO = new byte [] {'0', '.', '0'};<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  private static final byte [] ONE = new byte [] {'1'};<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  private static final byte [] TWO = new byte [] {'2'};<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private static final byte [] TWO_POINT_TWO = new byte [] {'2', '.', '2'};<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  private static final byte [] THREE = new byte [] {'3'};<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  private static final byte [] FOUR = new byte [] {'4'};<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private static final byte [] FIVE = new byte [] {'5'};<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private static final byte [] VALUE = new byte [] {'v'};<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  private static final int CELL_GRID_BLOCK2_BOUNDARY = 4;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  private static final int CELL_GRID_BLOCK3_BOUNDARY = 11;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  private static final int CELL_GRID_BLOCK4_BOUNDARY = 15;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  private static final int CELL_GRID_BLOCK5_BOUNDARY = 19;<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>  /**<a name="line.94"></a>
+<span class="sourceLineNo">095</span>   * Five rows by four columns distinguished by column qualifier (column qualifier is one of the<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   * four rows... ONE, TWO, etc.). Exceptions are a weird row after TWO; it is TWO_POINT_TWO.<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   * And then row FOUR has five columns finishing w/ row FIVE having a single column.<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   * We will use this to test scan does the right thing as it<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   * we do Gets, StoreScanner#optimize, and what we do on (faked) block boundaries.<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   */<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  private static final Cell [] CELL_GRID = new Cell [] {<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    CellUtil.createCell(ONE, CF, ONE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    CellUtil.createCell(ONE, CF, TWO, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    CellUtil.createCell(ONE, CF, THREE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    CellUtil.createCell(ONE, CF, FOUR, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    // Offset 4 CELL_GRID_BLOCK2_BOUNDARY<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    CellUtil.createCell(TWO, CF, ONE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    CellUtil.createCell(TWO, CF, TWO, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    CellUtil.createCell(TWO, CF, THREE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    CellUtil.createCell(TWO, CF, FOUR, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    CellUtil.createCell(TWO_POINT_TWO, CF, ZERO, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    CellUtil.createCell(TWO_POINT_TWO, CF, ZERO_POINT_ZERO, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    CellUtil.createCell(TWO_POINT_TWO, CF, FIVE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    // Offset 11! CELL_GRID_BLOCK3_BOUNDARY<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    CellUtil.createCell(THREE, CF, ONE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    CellUtil.createCell(THREE, CF, TWO, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    CellUtil.createCell(THREE, CF, THREE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    CellUtil.createCell(THREE, CF, FOUR, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    // Offset 15 CELL_GRID_BLOCK4_BOUNDARY<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    CellUtil.createCell(FOUR, CF, ONE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    CellUtil.createCell(FOUR, CF, TWO, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    CellUtil.createCell(FOUR, CF, THREE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    CellUtil.createCell(FOUR, CF, FOUR, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    // Offset 19 CELL_GRID_BLOCK5_BOUNDARY<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    CellUtil.createCell(FOUR, CF, FIVE, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    CellUtil.createCell(FIVE, CF, ZERO, 1L, KeyValue.Type.Put.getCode(), VALUE),<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  };<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>   * A StoreScanner for our CELL_GRID above. Fakes the block transitions. Does counts of<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * calls to optimize and counts of when optimize actually did an optimize.<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   */<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  private static class CellGridStoreScanner extends StoreScanner {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    // Count of how often optimize is called and of how often it does an optimize.<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    final AtomicInteger count = new AtomicInteger(0);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    final AtomicInteger optimization = new AtomicInteger(0);<a name="line.136"></a>
+<span class="sourceLineNo">137</span><a name="line.137"></a>
+<span class="sourceLineNo">138</span>    CellGridStoreScanner(final Scan scan, ScanInfo scanInfo, ScanType scanType)<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    throws IOException {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      super(scan, scanInfo, scanType, scan.getFamilyMap().get(CF),<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        Arrays.&lt;KeyValueScanner&gt;asList(<a name="line.141"></a>
+<span class="sourceLineNo">142</span>          new KeyValueScanner[] {new KeyValueScanFixture(CellComparator.COMPARATOR, CELL_GRID)}));<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>    protected ScanQueryMatcher.MatchCode optimize(ScanQueryMatcher.MatchCode qcode, Cell cell) {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      count.incrementAndGet();<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      ScanQueryMatcher.MatchCode after = super.optimize(qcode, cell);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      LOG.info("Cell=" + cell + ", nextIndex=" + CellUtil.toString(getNextIndexedKey(), false) +<a name="line.148"></a>
+<span class="sourceLineNo">149</span>          ", before=" + qcode + ", after=" + after);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      if (qcode != after) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        optimization.incrementAndGet();<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      }<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      return after;<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>    @Override<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    public Cell getNextIndexedKey() {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      // Fake block boundaries by having index of next block change as we go through scan.<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return count.get() &gt; CELL_GRID_BLOCK4_BOUNDARY?<a name="line.159"></a>
+<span class="sourceLineNo">160</span>          CellUtil.createFirstOnRow(CELL_GRID[CELL_GRID_BLOCK5_BOUNDARY]):<a name="line.160"></a>
+<span class="sourceLineNo">161</span>            count.get() &gt; CELL_GRID_BLOCK3_BOUNDARY?<a name="line.161"></a>
+<span class="sourceLineNo">162</span>                CellUtil.createFirstOnRow(CELL_GRID[CELL_GRID_BLOCK4_BOUNDARY]):<a name="line.162"></a>
+<span class="sourceLineNo">163</span>                  count.get() &gt; CELL_GRID_BLOCK2_BOUNDARY?<a name="line.163"></a>
+<span class="sourceLineNo">164</span>                      CellUtil.createFirstOnRow(CELL_GRID[CELL_GRID_BLOCK3_BOUNDARY]):<a name="line.164"></a>
+<span class="sourceLineNo">165</span>                        CellUtil.createFirstOnRow(CELL_GRID[CELL_GRID_BLOCK2_BOUNDARY]);<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><a name="line.168"></a>
+<span class="sourceLineNo">169</span>  /*<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   * Test utility for building a NavigableSet for scanners.<a name="line.170"></a>
+<span class="sourceLineNo">171</span>   * @param strCols<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   * @return<a name="line.172"></a>
+<span class="sourceLineNo">173</span>   */<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  NavigableSet&lt;byte[]&gt; getCols(String ...strCols) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    NavigableSet&lt;byte[]&gt; cols = new TreeSet&lt;byte[]&gt;(Bytes.BYTES_COMPARATOR);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    for (String col : strCols) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      byte[] bytes = Bytes.toBytes(col);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      cols.add(bytes);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    }<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    return cols;<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>  @Test<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  public void testFullRowGetDoesNotOverreadWhenRowInsideOneBlock() throws IOException {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    // Do a Get against row two. Row two is inside a block that starts with row TWO but ends with<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    // row TWO_POINT_TWO. We should read one block only.<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    Get get = new Get(TWO);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    Scan scan = new Scan(get);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    CellGridStoreScanner scanner = new CellGridStoreScanner(scan, this.scanInfo, this.scanType);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    try {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      while (scanner.next(results)) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>        continue;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      }<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      // Should be four results of column 1 (though there are 5 rows in the CELL_GRID -- the<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      // TWO_POINT_TWO row does not have a a column ONE.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      Assert.assertEquals(4, results.size());<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      // We should have gone the optimize route 5 times totally... an INCLUDE for the four cells<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      // in the row plus the DONE on the end.<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      Assert.assertEquals(5, scanner.count.get());<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      // For a full row Get, there should be no opportunity for scanner optimization.<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      Assert.assertEquals(0, scanner.optimization.get());<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    } finally {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      scanner.close();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  }<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>  @Test<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  public void testFullRowSpansBlocks() throws IOException {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    // Do a Get against row FOUR. It spans two blocks.<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    Get get = new Get(FOUR);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    Scan scan = new Scan(get);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    CellGridStoreScanner scanner = new CellGridStoreScanner(scan, this.scanInfo, this.scanType);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    try {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      while (scanner.next(results)) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        continue;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      }<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      // Should be four results of column 1 (though there are 5 rows in the CELL_GRID -- the<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      // TWO_POINT_TWO row does not have a a column ONE.<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      Assert.assertEquals(5, results.size());<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      // We should have gone the optimize route 6 times totally... an INCLUDE for the five cells<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      // in the row plus the DONE on the end.<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      Assert.assertEquals(6, scanner.count.get());<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      // For a full row Get, there should be no opportunity for scanner optimization.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      Assert.assertEquals(0, scanner.optimization.get());<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    } finally {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      scanner.close();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>  /**<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * Test optimize in StoreScanner. Test that we skip to the next 'block' when we it makes sense<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * reading the block 'index'.<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @throws IOException<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  @Test<a name="line.237"></a>
+<span class="sourceLineNo">238</span>  public void testOptimize() throws IOException {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    Scan scan = new Scan();<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    // A scan that just gets the first qualifier on each row of the CELL_GRID<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    scan.addColumn(CF, ONE);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    CellGridStoreScanner scanner = new CellGridStoreScanner(scan, this.scanInfo, this.scanType);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    try {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      while (scanner.next(results)) {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        continue;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      }<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      // Should be four results of column 1 (though there are 5 rows in the CELL_GRID -- the<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      // TWO_POINT_TWO row does not have a a column ONE.<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      Assert.assertEquals(4, results.size());<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      for (Cell cell: results) {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        assertTrue(Bytes.equals(ONE, 0, ONE.length,<a name="line.252"></a>
+<span class="sourceLineNo">253</span>            cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()));<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      }<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      Assert.assertTrue("Optimize should do some optimizations", scanner.optimization.get() &gt; 0);<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    } finally {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      scanner.close();<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>   * Ensure the optimize Scan method in StoreScanner does not get in the way of a Get doing minimum<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * work... seeking to start of block and then SKIPPING until we find the wanted Cell.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * This 'simple' scenario mimics case of all Cells fitting inside a single HFileBlock.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   * See HBASE-15392. This test is a little cryptic. Takes a bit of staring to figure what it up to.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>   * @throws IOException<a name="line.266"></a>
+<span class="sourceLineNo">267</span>   */<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  @Test<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  public void testOptimizeAndGet() throws IOException {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    // First test a Get of two columns in the row R2. Every Get is a Scan. Get columns named<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    // R2 and R3.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    Get get = new Get(TWO);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    get.addColumn(CF, TWO);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    get.addColumn(CF, THREE);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    Scan scan = new Scan(get);<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    CellGridStoreScanner scanner = new CellGridStoreScanner(scan, this.scanInfo, this.scanType);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    try {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      // For a Get there should be no more next's after the first call.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      Assert.assertEquals(false, scanner.next(results));<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // Should be one result only.<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Assert.assertEquals(2, results.size());<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      // And we should have gone through optimize twice only.<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      Assert.assertEquals("First qcode is SEEK_NEXT_COL and second INCLUDE_AND_SEEK_NEXT_ROW",<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        3, scanner.count.get());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    } finally {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      scanner.close();<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>   * Ensure that optimize does not cause the Get to do more seeking than required. Optimize<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   * (see HBASE-15392) was causing us to seek all Cells in a block when a Get Scan if the next block<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * index/start key was a different row to the current one. A bug. We'd call next too often<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * because we had to exhaust all Cells in the current row making us load the next block just to<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * discard what we read there. This test is a little cryptic. Takes a bit of staring to figure<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * what it up to.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   * @throws IOException<a name="line.298"></a>
+<span class="sourceLineNo">299</span>   */<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  @Test<a name="line.300"></a>
+<span class="sourceLineNo">301</span>  public void testOptimizeAndGetWithFakedNextBlockIndexStart() throws IOException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    // First test a Get of second column in the row R2. Every Get is a Scan. Second column has a<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    // qualifier of R2.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    Get get = new Get(THREE);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    get.addColumn(CF, TWO);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    Scan scan = new Scan(get);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    CellGridStoreScanner scanner = new CellGridStoreScanner(scan, this.scanInfo, this.scanType);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    try {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      // For a Get there should be no more next's after the first call.<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      Assert.assertEquals(false, scanner.next(results));<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      // Should be one result only.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      Assert.assertEquals(1, results.size());<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      // And we should have gone through optimize twice only.<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      Assert.assertEquals("First qcode is SEEK_NEXT_COL and second INCLUDE_AND_SEEK_NEXT_ROW",<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        2, scanner.count.get());<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    } finally {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      scanner.close();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    }<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>  @Test<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  public void testScanTimeRange() throws IOException {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    String r1 = "R1";<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    // returns only 1 of these 2 even though same timestamp<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    KeyValue [] kvs = new KeyValue[] {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        KeyValueTestUtil.create(r1, CF_STR, "a", 1, KeyValue.Type.Put, "dont-care"),<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        KeyValueTestUtil.create(r1, CF_STR, "a", 2, KeyValue.Type.Put, "dont-care"),<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        KeyValueTestUtil.create(r1, CF_STR, "a", 3, KeyValue.Type.Put, "dont-care"),<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        KeyValueTestUtil.create(r1, CF_STR, "a", 4, KeyValue.Type.Put, "dont-care"),<a name="line.330"></a>
+<span class="sourceLineNo">331</span>        KeyValueTestUtil.create(r1, CF_STR, "a", 5, KeyValue.Type.Put, "dont-care"),<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    };<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    List&lt;KeyValueScanner&gt; scanners = Arrays.&lt;KeyValueScanner&gt;asList(<a name="line.333"></a>
+<span class="sourceLineNo">334</span>        new KeyValueScanner[] {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>            new KeyValueScanFixture(CellComparator.COMPARATOR, kvs)<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    });<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    Scan scanSpec = new Scan(Bytes.toBytes(r1));<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    scanSpec.setTimeRange(0, 6);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    scanSpec.setMaxVersions();<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    List&lt;Cell&gt; results = null;<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    try (StoreScanner scan =<a name="line.341"></a>
+<span class="sourceLineNo">342</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      results = new ArrayList&lt;Cell&gt;();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      Assert.assertEquals(true, scan.next(results));<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      Assert.assertEquals(5, results.size());<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      Assert.assertEquals(kvs[kvs.length - 1], results.get(0));<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    }<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    // Scan limited TimeRange<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    scanSpec = new Scan(Bytes.toBytes(r1));<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    scanSpec.setTimeRange(1, 3);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    scanSpec.setMaxVersions();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    try (StoreScanner scan =<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      results = new ArrayList&lt;Cell&gt;();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      Assert.assertEquals(true, scan.next(results));<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      Assert.assertEquals(2, results.size());<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    }<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    // Another range.<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    scanSpec = new Scan(Bytes.toBytes(r1));<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    scanSpec.setTimeRange(5, 10);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    scanSpec.setMaxVersions();<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    try (StoreScanner scan =<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      results = new ArrayList&lt;Cell&gt;();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      Assert.assertEquals(true, scan.next(results));<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      Assert.assertEquals(1, results.size());<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    }<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    // See how TimeRange and Versions interact.<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    // Another range.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    scanSpec = new Scan(Bytes.toBytes(r1));<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    scanSpec.setTimeRange(0, 10);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    scanSpec.setMaxVersions(3);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    try (StoreScanner scan = new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"),<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        scanners)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      results = new ArrayList&lt;Cell&gt;();<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      Assert.assertEquals(true, scan.next(results));<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      Assert.assertEquals(3, results.size());<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>  @Test<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public void testScanSameTimestamp() throws IOException {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    // returns only 1 of these 2 even though same timestamp<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    KeyValue [] kvs = new KeyValue[] {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.Put, "dont-care"),<a name="line.385"></a>
+<span class="sourceLineNo">386</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.Put, "dont-care"),<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    };<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    List&lt;KeyValueScanner&gt; scanners = Arrays.asList(<a name="line.388"></a>
+<span class="sourceLineNo">389</span>        new KeyValueScanner[] {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>            new KeyValueScanFixture(CellComparator.COMPARATOR, kvs)<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        });<a name="line.391"></a>
+<span class="sourceLineNo">392</span><a name="line.392"></a>
+<span class="sourceLineNo">393</span>    Scan scanSpec = new Scan(Bytes.toBytes("R1"));<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    // this only uses maxVersions (default=1) and TimeRange (default=all)<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    try (StoreScanner scan =<a name="line.395"></a>
+<span class="sourceLineNo">396</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      Assert.assertEquals(true, scan.next(results));<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      Assert.assertEquals(1, results.size());<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      Assert.assertEquals(kvs[0], results.get(0));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>  }<a name="line.402"></a>
+<span class="sourceLineNo">403</span><a name="line.403"></a>
+<span class="sourceLineNo">404</span>  /*<a name="line.404"></a>
+<span class="sourceLineNo">405</span>   * Test test shows exactly how the matcher's return codes confuses the StoreScanner<a name="line.405"></a>
+<span class="sourceLineNo">406</span>   * and prevent it from doing the right thing.  Seeking once, then nexting twice<a name="line.406"></a>
+<span class="sourceLineNo">407</span>   * should return R1, then R2, but in this case it doesnt.<a name="line.407"></a>
+<span class="sourceLineNo">408</span>   * TODO this comment makes no sense above. Appears to do the right thing.<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   * @throws IOException<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   */<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  @Test<a name="line.411"></a>
+<span class="sourceLineNo">412</span>  public void testWontNextToNext() throws IOException {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    // build the scan file:<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    KeyValue [] kvs = new KeyValue[] {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        KeyValueTestUtil.create("R1", "cf", "a", 2, KeyValue.Type.Put, "dont-care"),<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.Put, "dont-care"),<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        KeyValueTestUtil.create("R2", "cf", "a", 1, KeyValue.Type.Put, "dont-care")<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    };<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>    Scan scanSpec = new Scan(Bytes.toBytes("R1"));<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    // this only uses maxVersions (default=1) and TimeRange (default=all)<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    try (StoreScanner scan =<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      scan.next(results);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      Assert.assertEquals(1, results.size());<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      Assert.assertEquals(kvs[0], results.get(0));<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      // should be ok...<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      // now scan _next_ again.<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      results.clear();<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      scan.next(results);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      Assert.assertEquals(1, results.size());<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      Assert.assertEquals(kvs[2], results.get(0));<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>      results.clear();<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      scan.next(results);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      Assert.assertEquals(0, results.size());<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>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>  @Test<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  public void testDeleteVersionSameTimestamp() throws IOException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    KeyValue [] kvs = new KeyValue [] {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.Put, "dont-care"),<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.Delete, "dont-care"),<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    };<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    Scan scanSpec = new Scan(Bytes.toBytes("R1"));<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    try (StoreScanner scan =<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      Assert.assertFalse(scan.next(results));<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      Assert.assertEquals(0, results.size());<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    }<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  }<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>  /*<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * Test the case where there is a delete row 'in front of' the next row, the scanner<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * will move to the next row.<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   */<a name="line.462"></a>
+<span class="sourceLineNo">463</span>  @Test<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  public void testDeletedRowThenGoodRow() throws IOException {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    KeyValue [] kvs = new KeyValue [] {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.Put, "dont-care"),<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.Delete, "dont-care"),<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        KeyValueTestUtil.create("R2", "cf", "a", 20, KeyValue.Type.Put, "dont-care")<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    };<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    Scan scanSpec = new Scan(Bytes.toBytes("R1"));<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    try (StoreScanner scan =<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      Assert.assertEquals(true, scan.next(results));<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      Assert.assertEquals(0, results.size());<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>      Assert.assertEquals(true, scan.next(results));<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      Assert.assertEquals(1, results.size());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      Assert.assertEquals(kvs[2], results.get(0));<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>      Assert.assertEquals(false, scan.next(results));<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    }<a name="line.483"></a>
+<span class="sourceLineNo">484</span>  }<a name="line.484"></a>
+<span class="sourceLineNo">485</span><a name="line.485"></a>
+<span class="sourceLineNo">486</span>  public void testDeleteVersionMaskingMultiplePuts() throws IOException {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    long now = System.currentTimeMillis();<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    KeyValue [] kvs1 = new KeyValue[] {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>        KeyValueTestUtil.create("R1", "cf", "a", now, KeyValue.Type.Put, "dont-care"),<a name="line.489"></a>
+<span class="sourceLineNo">490</span>        KeyValueTestUtil.create("R1", "cf", "a", now, KeyValue.Type.Delete, "dont-care")<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    };<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    KeyValue [] kvs2 = new KeyValue[] {<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        KeyValueTestUtil.create("R1", "cf", "a", now-500, KeyValue.Type.Put, "dont-care"),<a name="line.493"></a>
+<span class="sourceLineNo">494</span>        KeyValueTestUtil.create("R1", "cf", "a", now-100, KeyValue.Type.Put, "dont-care"),<a name="line.494"></a>
+<span class="sourceLineNo">495</span>        KeyValueTestUtil.create("R1", "cf", "a", now, KeyValue.Type.Put, "dont-care")<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    };<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs1, kvs2);<a name="line.497"></a>
+<span class="sourceLineNo">498</span><a name="line.498"></a>
+<span class="sourceLineNo">499</span>    try (StoreScanner scan = new StoreScanner(new Scan(Bytes.toBytes("R1")), scanInfo, scanType,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        getCols("a"), scanners)) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      // the two put at ts=now will be masked by the 1 delete, and<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      // since the scan default returns 1 version we'll return the newest<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      // key, which is kvs[2], now-100.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      Assert.assertEquals(true, scan.next(results));<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      Assert.assertEquals(1, results.size());<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      Assert.assertEquals(kvs2[1], results.get(0));<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    }<a name="line.508"></a>
+<span class="sourceLineNo">509</span>  }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>  public void testDeleteVersionsMixedAndMultipleVersionReturn() throws IOException {<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    long now = System.currentTimeMillis();<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    KeyValue [] kvs1 = new KeyValue[] {<a name="line.512"></a>
+<span class="sourceLineNo">513</span>        KeyValueTestUtil.create("R1", "cf", "a", now, KeyValue.Type.Put, "dont-care"),<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        KeyValueTestUtil.create("R1", "cf", "a", now, KeyValue.Type.Delete, "dont-care")<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    };<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    KeyValue [] kvs2 = new KeyValue[] {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>        KeyValueTestUtil.create("R1", "cf", "a", now-500, KeyValue.Type.Put, "dont-care"),<a name="line.517"></a>
+<span class="sourceLineNo">518</span>        KeyValueTestUtil.create("R1", "cf", "a", now+500, KeyValue.Type.Put, "dont-care"),<a name="line.518"></a>
+<span class="sourceLineNo">519</span>        KeyValueTestUtil.create("R1", "cf", "a", now, KeyValue.Type.Put, "dont-care"),<a name="line.519"></a>
+<span class="sourceLineNo">520</span>        KeyValueTestUtil.create("R2", "cf", "z", now, KeyValue.Type.Put, "dont-care")<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    };<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs1, kvs2);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    Scan scanSpec = new Scan(Bytes.toBytes("R1")).setMaxVersions(2);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    try (StoreScanner scan = new StoreScanner(scanSpec, scanInfo, scanType,<a name="line.525"></a>
+<span class="sourceLineNo">526</span>        getCols("a"), scanners)) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      Assert.assertEquals(true, scan.next(results));<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      Assert.assertEquals(2, results.size());<a name="line.529"></a>
+<span class="sourceLineNo">530</span>      Assert.assertEquals(kvs2[1], results.get(0));<a name="line.530"></a>
+<span class="sourceLineNo">531</span>      Assert.assertEquals(kvs2[0], results.get(1));<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    }<a name="line.532"></a>
+<span class="sourceLineNo">533</span>  }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>  @Test<a name="line.535"></a>
+<span class="sourceLineNo">536</span>  public void testWildCardOneVersionScan() throws IOException {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    KeyValue [] kvs = new KeyValue [] {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>        KeyValueTestUtil.create("R1", "cf", "a", 2, KeyValue.Type.Put, "dont-care"),<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        KeyValueTestUtil.create("R1", "cf", "b", 1, KeyValue.Type.Put, "dont-care"),<a name="line.539"></a>
+<span class="sourceLineNo">540</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.DeleteColumn, "dont-care"),<a name="line.540"></a>
+<span class="sourceLineNo">541</span>    };<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    try (StoreScanner scan =<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        new StoreScanner(new Scan(Bytes.toBytes("R1")), scanInfo, scanType, null, scanners)) {<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.545"></a>
+<span class="sourceLineNo">546</span>      Assert.assertEquals(true, scan.next(results));<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      Assert.assertEquals(2, results.size());<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      Assert.assertEquals(kvs[0], results.get(0));<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      Assert.assertEquals(kvs[1], results.get(1));<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    }<a name="line.550"></a>
+<span class="sourceLineNo">551</span>  }<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>  @Test<a name="line.553"></a>
+<span class="sourceLineNo">554</span>  public void testWildCardScannerUnderDeletes() throws IOException {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    KeyValue [] kvs = new KeyValue [] {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>        KeyValueTestUtil.create("R1", "cf", "a", 2, KeyValue.Type.Put, "dont-care"), // inc<a name="line.556"></a>
+<span class="sourceLineNo">557</span>        // orphaned delete column.<a name="line.557"></a>
+<span class="sourceLineNo">558</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.DeleteColumn, "dont-care"),<a name="line.558"></a>
+<span class="sourceLineNo">559</span>        // column b<a name="line.559"></a>
+<span class="sourceLineNo">560</span>        KeyValueTestUtil.create("R1", "cf", "b", 2, KeyValue.Type.Put, "dont-care"), // inc<a name="line.560"></a>
+<span class="sourceLineNo">561</span>        KeyValueTestUtil.create("R1", "cf", "b", 1, KeyValue.Type.Put, "dont-care"), // inc<a name="line.561"></a>
+<span class="sourceLineNo">562</span>        // column c<a name="line.562"></a>
+<span class="sourceLineNo">563</span>        KeyValueTestUtil.create("R1", "cf", "c", 10, KeyValue.Type.Delete, "dont-care"),<a name="line.563"></a>
+<span class="sourceLineNo">564</span>        KeyValueTestUtil.create("R1", "cf", "c", 10, KeyValue.Type.Put, "dont-care"), // no<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        KeyValueTestUtil.create("R1", "cf", "c", 9, KeyValue.Type.Put, "dont-care"),  // inc<a name="line.565"></a>
+<span class="sourceLineNo">566</span>        // column d<a name="line.566"></a>
+<span class="sourceLineNo">567</span>        KeyValueTestUtil.create("R1", "cf", "d", 11, KeyValue.Type.Put, "dont-care"), // inc<a name="line.567"></a>
+<span class="sourceLineNo">568</span>        KeyValueTestUtil.create("R1", "cf", "d", 10, KeyValue.Type.DeleteColumn, "dont-care"),<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        KeyValueTestUtil.create("R1", "cf", "d", 9, KeyValue.Type.Put, "dont-care"),  // no<a name="line.569"></a>
+<span class="sourceLineNo">570</span>        KeyValueTestUtil.create("R1", "cf", "d", 8, KeyValue.Type.Put, "dont-care"),  // no<a name="line.570"></a>
+<span class="sourceLineNo">571</span><a name="line.571"></a>
+<span class="sourceLineNo">572</span>    };<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    try (StoreScanner scan = new StoreScanner(new Scan().setMaxVersions(2),<a name="line.574"></a>
+<span class="sourceLineNo">575</span>        scanInfo, scanType, null, scanners)) {<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      Assert.assertEquals(true, scan.next(results));<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      Assert.assertEquals(5, results.size());<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      Assert.assertEquals(kvs[0], results.get(0));<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      Assert.assertEquals(kvs[2], results.get(1));<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      Assert.assertEquals(kvs[3], results.get(2));<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      Assert.assertEquals(kvs[6], results.get(3));<a name="line.582"></a>
+<span class="sourceLineNo">583</span>      Assert.assertEquals(kvs[7], results.get(4));<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
+<span class="sourceLineNo">585</span>  }<a name="line.585"></a>
+<span class="sourceLineNo">586</span><a name="line.586"></a>
+<span class="sourceLineNo">587</span>  @Test<a name="line.587"></a>
+<span class="sourceLineNo">588</span>  public void testDeleteFamily() throws IOException {<a name="line.588"></a>
+<span class="sourceLineNo">589</span>    KeyValue [] kvs = new KeyValue[] {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>        KeyValueTestUtil.create("R1", "cf", "a", 100, KeyValue.Type.DeleteFamily, "dont-care"),<a name="line.590"></a>
+<span class="sourceLineNo">591</span>        KeyValueTestUtil.create("R1", "cf", "b", 11, KeyValue.Type.Put, "dont-care"),<a name="line.591"></a>
+<span class="sourceLineNo">592</span>        KeyValueTestUtil.create("R1", "cf", "c", 11, KeyValue.Type.Put, "dont-care"),<a name="line.592"></a>
+<span class="sourceLineNo">593</span>        KeyValueTestUtil.create("R1", "cf", "d", 11, KeyValue.Type.Put, "dont-care"),<a name="line.593"></a>
+<span class="sourceLineNo">594</span>        KeyValueTestUtil.create("R1", "cf", "e", 11, KeyValue.Type.Put, "dont-care"),<a name="line.594"></a>
+<span class="sourceLineNo">595</span>        KeyValueTestUtil.create("R1", "cf", "e", 11, KeyValue.Type.DeleteColumn, "dont-care"),<a name="line.595"></a>
+<span class="sourceLineNo">596</span>        KeyValueTestUtil.create("R1", "cf", "f", 11, KeyValue.Type.Put, "dont-care"),<a name="line.596"></a>
+<span class="sourceLineNo">597</span>        KeyValueTestUtil.create("R1", "cf", "g", 11, KeyValue.Type.Put, "dont-care"),<a name="line.597"></a>
+<span class="sourceLineNo">598</span>        KeyValueTestUtil.create("R1", "cf", "g", 11, KeyValue.Type.Delete, "dont-care"),<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        KeyValueTestUtil.create("R1", "cf", "h", 11, KeyValue.Type.Put, "dont-care"),<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        KeyValueTestUtil.create("R1", "cf", "i", 11, KeyValue.Type.Put, "dont-care"),<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        KeyValueTestUtil.create("R2", "cf", "a", 11, KeyValue.Type.Put, "dont-care"),<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    };<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    try (StoreScanner scan =<a name="line.604"></a>
+<span class="sourceLineNo">605</span>        new StoreScanner(new Scan().setMaxVersions(Integer.MAX_VALUE), scanInfo, scanType, null,<a name="line.605"></a>
+<span class="sourceLineNo">606</span>            scanners)) {<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      Assert.assertEquals(true, scan.next(results));<a name="line.608"></a>
+<span class="sourceLineNo">609</span>      Assert.assertEquals(0, results.size());<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      Assert.assertEquals(true, scan.next(results));<a name="line.610"></a>
+<span class="sourceLineNo">611</span>      Assert.assertEquals(1, results.size());<a name="line.611"></a>
+<span class="sourceLineNo">612</span>      Assert.assertEquals(kvs[kvs.length-1], results.get(0));<a name="line.612"></a>
+<span class="sourceLineNo">613</span><a name="line.613"></a>
+<span class="sourceLineNo">614</span>      Assert.assertEquals(false, scan.next(results));<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    }<a name="line.615"></a>
+<span class="sourceLineNo">616</span>  }<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span>  @Test<a name="line.618"></a>
+<span class="sourceLineNo">619</span>  public void testDeleteColumn() throws IOException {<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    KeyValue [] kvs = new KeyValue[] {<a name="line.620"></a>
+<span class="sourceLineNo">621</span>        KeyValueTestUtil.create("R1", "cf", "a", 10, KeyValue.Type.DeleteColumn, "dont-care"),<a name="line.621"></a>
+<span class="sourceLineNo">622</span>        KeyValueTestUtil.create("R1", "cf", "a", 9, KeyValue.Type.Delete, "dont-care"),<a name="line.622"></a>
+<span class="sourceLineNo">623</span>        KeyValueTestUtil.create("R1", "cf", "a", 8, KeyValue.Type.Put, "dont-care"),<a name="line.623"></a>
+<span class="sourceLineNo">624</span>        KeyValueTestUtil.create("R1", "cf", "b", 5, KeyValue.Type.Put, "dont-care")<a name="line.624"></a>
+<span class="sourceLineNo">625</span>    };<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    try (StoreScanner scan = new StoreScanner(new Scan(), scanInfo, scanType, null,<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        scanners)) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      Assert.assertEquals(true, scan.next(results));<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      Assert.assertEquals(1, results.size());<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      Assert.assertEquals(kvs[3], results.get(0));<a name="line.632"></a>
+<span class="sourceLineNo">633</span>    }<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>  private static final  KeyValue [] kvs = new KeyValue[] {<a name="line.636"></a>
+<span class="sourceLineNo">637</span>        KeyValueTestUtil.create("R1", "cf", "a", 11, KeyValue.Type.Put, "dont-care"),<a name="line.637"></a>
+<span class="sourceLineNo">638</span>        KeyValueTestUtil.create("R1", "cf", "b", 11, KeyValue.Type.Put, "dont-care"),<a name="line.638"></a>
+<span class="sourceLineNo">639</span>        KeyValueTestUtil.create("R1", "cf", "c", 11, KeyValue.Type.Put, "dont-care"),<a name="line.639"></a>
+<span class="sourceLineNo">640</span>        KeyValueTestUtil.create("R1", "cf", "d", 11, KeyValue.Type.Put, "dont-care"),<a name="line.640"></a>
+<span class="sourceLineNo">641</span>        KeyValueTestUtil.create("R1", "cf", "e", 11, KeyValue.Type.Put, "dont-care"),<a name="line.641"></a>
+<span class="sourceLineNo">642</span>        KeyValueTestUtil.create("R1", "cf", "f", 11, KeyValue.Type.Put, "dont-care"),<a name="line.642"></a>
+<span class="sourceLineNo">643</span>        KeyValueTestUtil.create("R1", "cf", "g", 11, KeyValue.Type.Put, "dont-care"),<a name="line.643"></a>
+<span class="sourceLineNo">644</span>        KeyValueTestUtil.create("R1", "cf", "h", 11, KeyValue.Type.Put, "dont-care"),<a name="line.644"></a>
+<span class="sourceLineNo">645</span>        KeyValueTestUtil.create("R1", "cf", "i", 11, KeyValue.Type.Put, "dont-care"),<a name="line.645"></a>
+<span class="sourceLineNo">646</span>        KeyValueTestUtil.create("R2", "cf", "a", 11, KeyValue.Type.Put, "dont-care"),<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    };<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  @Test<a name="line.649"></a>
+<span class="sourceLineNo">650</span>  public void testSkipColumn() throws IOException {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    try (StoreScanner scan =<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        new StoreScanner(new Scan(), scanInfo, scanType, getCols("a", "d"), scanners)) {<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      Assert.assertEquals(true, scan.next(results));<a name="line.655"></a>
+<span class="sourceLineNo">656</span>      Assert.assertEquals(2, results.size());<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      Assert.assertEquals(kvs[0], results.get(0));<a name="line.657"></a>
+<span class="sourceLineNo">658</span>      Assert.assertEquals(kvs[3], results.get(1));<a name="line.658"></a>
+<span class="sourceLineNo">659</span>      results.clear();<a name="line.659"></a>
+<span class="sourceLineNo">660</span><a name="line.660"></a>
+<span class="sourceLineNo">661</span>      Assert.assertEquals(true, scan.next(results));<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      Assert.assertEquals(1, results.size());<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      Assert.assertEquals(kvs[kvs.length-1], results.get(0));<a name="line.663"></a>
+<span class="sourceLineNo">664</span><a name="line.664"></a>
+<span class="sourceLineNo">665</span>      results.clear();<a name="line.665"></a>
+<span class="sourceLineNo">666</span>      Assert.assertEquals(false, scan.next(results));<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">668</span>  }<a name="line.668"></a>
+<span class="sourceLineNo">669</span><a name="line.669"></a>
+<span class="sourceLineNo">670</span>  /*<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * Test expiration of KeyValues in combination with a configured TTL for<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   * a column family (as should be triggered in a major compaction).<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   */<a name="line.673"></a>
+<span class="sourceLineNo">674</span>  @Test<a name="line.674"></a>
+<span class="sourceLineNo">675</span>  public void testWildCardTtlScan() throws IOException {<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    long now = System.currentTimeMillis();<a name="line.676"></a>
+<span class="sourceLineNo">677</span>    KeyValue [] kvs = new KeyValue[] {<a name="line.677"></a>
+<span class="sourceLineNo">678</span>        KeyValueTestUtil.create("R1", "cf", "a", now-1000, KeyValue.Type.Put, "dont-care"),<a name="line.678"></a>
+<span class="sourceLineNo">679</span>        KeyValueTestUtil.create("R1", "cf", "b", now-10, KeyValue.Type.Put, "dont-care"),<a name="line.679"></a>
+<span class="sourceLineNo">680</span>        KeyValueTestUtil.create("R1", "cf", "c", now-200, KeyValue.Type.Put, "dont-care"),<a name="line.680"></a>
+<span class="sourceLineNo">681</span>        KeyValueTestUtil.create("R1", "cf", "d", now-10000, KeyValue.Type.Put, "dont-care"),<a name="line.681"></a>
+<span class="sourceLineNo">682</span>        KeyValueTestUtil.create("R2", "cf", "a", now, KeyValue.Type.Put, "dont-care"),<a name="line.682"></a>
+<span class="sourceLineNo">683</span>        KeyValueTestUtil.create("R2", "cf", "b", now-10, KeyValue.Type.Put, "dont-care"),<a name="line.683"></a>
+<span class="sourceLineNo">684</span>        KeyValueTestUtil.create("R2", "cf", "c", now-200, KeyValue.Type.Put, "dont-care"),<a name="line.684"></a>
+<span class="sourceLineNo">685</span>        KeyValueTestUtil.create("R2", "cf", "c", now-1000, KeyValue.Type.Put, "dont-care")<a name="line.685"></a>
+<span class="sourceLineNo">686</span>    };<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    Scan scan = new Scan();<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    scan.setMaxVersions(1);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    ScanInfo scanInfo = new ScanInfo(CONF, CF, 0, 1, 500, KeepDeletedCells.FALSE, 0,<a name="line.690"></a>
+<span class="sourceLineNo">691</span>        CellComparator.COMPARATOR);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    ScanType scanType = ScanType.USER_SCAN;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    try (StoreScanner scanner = new StoreScanner(scan, scanInfo, scanType, null, scanners)) {<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.694"></a>
+<span class="sourceLineNo">695</span>      Assert.assertEquals(true, scanner.next(results));<a name="line.695"></a>
+<span class="sourceLineNo">696</span>      Assert.assertEquals(2, results.size());<a name="line.696"></a>
+<span class="sourceLineNo">697</span>      Assert.assertEquals(kvs[1], results.get(0));<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      Assert.assertEquals(kvs[2], results.get(1));<a name="line.698"></a>
+<span class="sourceLineNo">699</span>      results.clear();<a name="line.699"></a>
+<span class="sourceLineNo">700</span><a name="line.700"></a>
+<span class="sourceLineNo">701</span>      Assert.assertEquals(true, scanner.next(results));<a name="line.701"></a>
+<span class="sourceLineNo">702</span>      Assert.assertEquals(3, results.size());<a name="line.702"></a>
+<span class="sourceLineNo">703</span>      Assert.assertEquals(kvs[4], results.get(0));<a name="line.703"></a>
+<span class="sourceLineNo">704</span>      Assert.assertEquals(kvs[5], results.get(1));<a name="line.704"></a>
+<span class="sourceLineNo">705</span>      Assert.assertEquals(kvs[6], results.get(2));<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      results.clear();<a name="line.706"></a>
+<span class="sourceLineNo">707</span><a name="line.707"></a>
+<span class="sourceLineNo">708</span>      Assert.assertEquals(false, scanner.next(results));<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    }<a name="line.709"></a>
+<span class="sourceLineNo">710</span>  }<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>  @Test<a name="line.712"></a>
+<span class="sourceLineNo">713</span>  public void testScannerReseekDoesntNPE() throws Exception {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    try (StoreScanner scan =<a name="line.715"></a>
+<span class="sourceLineNo">716</span>        new StoreScanner(new Scan(), scanInfo, scanType, getCols("a", "d"), scanners)) {<a name="line.716"></a>
+<span class="sourceLineNo">717</span><a name="line.717"></a>
+<span class="sourceLineNo">718</span>      // Previously a updateReaders twice in a row would cause an NPE.  In test this would also<a name="line.718"></a>
+<span class="sourceLineNo">719</span>      // normally cause an NPE because scan.store is null.  So as long as we get through these<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      // two calls we are good and the bug was quashed.<a name="line.720"></a>
+<span class="sourceLineNo">721</span><a name="line.721"></a>
+<span class="sourceLineNo">722</span>      scan.updateReaders(new ArrayList&lt;StoreFile&gt;());<a name="line.722"></a>
+<span class="sourceLineNo">723</span><a name="line.723"></a>
+<span class="sourceLineNo">724</span>      scan.updateReaders(new ArrayList&lt;StoreFile&gt;());<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>      scan.peek();<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    }<a name="line.727"></a>
+<span class="sourceLineNo">728</span>  }<a name="line.728"></a>
+<span class="sourceLineNo">729</span><a name="line.729"></a>
+<span class="sourceLineNo">730</span><a name="line.730"></a>
+<span class="sourceLineNo">731</span>  /**<a name="line.731"></a>
+<span class="sourceLineNo">732</span>   * TODO this fails, since we don't handle deletions, etc, in peek<a name="line.732"></a>
+<span class="sourceLineNo">733</span>   */<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  public void SKIP_testPeek() throws Exception {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>    KeyValue [] kvs = new KeyValue [] {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.Put, "dont-care"),<a name="line.736"></a>
+<span class="sourceLineNo">737</span>        KeyValueTestUtil.create("R1", "cf", "a", 1, KeyValue.Type.Delete, "dont-care"),<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    };<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    Scan scanSpec = new Scan(Bytes.toBytes("R1"));<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    try (StoreScanner scan =<a name="line.741"></a>
+<span class="sourceLineNo">742</span>        new StoreScanner(scanSpec, scanInfo, scanType, getCols("a"), scanners)) {<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      Assert.assertNull(scan.peek());<a name="line.743"></a>
+<span class="sourceLineNo">744</span>    }<a name="line.744"></a>
+<span class="sourceLineNo">745</span>  }<a name="line.745"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>  /**<a name="line.747"></a>
+<span class="sourceLineNo">748</span>   * Ensure that expired delete family markers don't override valid puts<a name="line.748"></a>
+<span class="sourceLineNo">749</span>   */<a name="line.749"></a>
+<span class="sourceLineNo">750</span>  @Test<a name="line.750"></a>
+<span class="sourceLineNo">751</span>  public void testExpiredDeleteFamily() throws Exception {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    long now = System.currentTimeMillis();<a name="line.752"></a>
+<span class="sourceLineNo">753</span>    KeyValue [] kvs = new KeyValue[] {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        new KeyValue(Bytes.toBytes("R1"), Bytes.toBytes("cf"), null, now-1000,<a name="line.754"></a>
+<span class="sourceLineNo">755</span>            KeyValue.Type.DeleteFamily),<a name="line.755"></a>
+<span class="sourceLineNo">756</span>        KeyValueTestUtil.create("R1", "cf", "a", now-10, KeyValue.Type.Put,<a name="line.756"></a>
+<span class="sourceLineNo">757</span>            "dont-care"),<a name="line.757"></a>
+<span class="sourceLineNo">758</span>    };<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    Scan scan = new Scan();<a name="line.760"></a>
+<span class="sourceLineNo">761</span>    scan.setMaxVersions(1);<a name="line.761"></a>
+<span class="sourceLineNo">762</span>    // scanner with ttl equal to 500<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    ScanInfo scanInfo = new ScanInfo(CONF, CF, 0, 1, 500, KeepDeletedCells.FALSE, 0,<a name="line.763"></a>
+<span class="sourceLineNo">764</span>        CellComparator.COMPARATOR);<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    ScanType scanType = ScanType.USER_SCAN;<a name="line.765"></a>
+<span class="sourceLineNo">766</span>    try (StoreScanner scanner =<a name="line.766"></a>
+<span class="sourceLineNo">767</span>        new StoreScanner(scan, scanInfo, scanType, null, scanners)) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span><a name="line.768"></a>
+<span class="sourceLineNo">769</span>      List&lt;Cell&gt; results = new ArrayList&lt;Cell&gt;();<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      Assert.assertEquals(true, scanner.next(results));<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      Assert.assertEquals(1, results.size());<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      Assert.assertEquals(kvs[1], results.get(0));<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      results.clear();<a name="line.773"></a>
+<span class="sourceLineNo">774</span><a name="line.774"></a>
+<span class="sourceLineNo">775</span>      Assert.assertEquals(false, scanner.next(results));<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    }<a name="line.776"></a>
+<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
+<span class="sourceLineNo">778</span><a name="line.778"></a>
+<span class="sourceLineNo">779</span>  @Test<a name="line.779"></a>
+<span class="sourceLineNo">780</span>  public void testDeleteMarkerLongevity() throws Exception {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    try {<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      final long now = System.currentTimeMillis();<a name="line.782"></a>
+<span class="sourceLineNo">783</span>      EnvironmentEdgeManagerTestHelper.injectEdge(new EnvironmentEdge() {<a name="line.783"></a>
+<span class="sourceLineNo">784</span>        public long currentTime() {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>          return now;<a name="line.785"></a>
+<span class="sourceLineNo">786</span>        }<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      });<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      KeyValue[] kvs = new KeyValue[]{<a name="line.788"></a>
+<span class="sourceLineNo">789</span>        /*0*/ new KeyValue(Bytes.toBytes("R1"), Bytes.toBytes("cf"), null,<a name="line.789"></a>
+<span class="sourceLineNo">790</span>        now - 100, KeyValue.Type.DeleteFamily), // live<a name="line.790"></a>
+<span class="sourceLineNo">791</span>        /*1*/ new KeyValue(Bytes.toBytes("R1"), Bytes.toBytes("cf"), null,<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        now - 1000, KeyValue.Type.DeleteFamily), // expired<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        /*2*/ KeyValueTestUtil.create("R1", "cf", "a", now - 50,<a name="line.793"></a>
+<span class="sourceLineNo">794</span>        KeyValue.Type.Put, "v3"), // live<a name="line.794"></a>
+<span class="sourceLineNo">795</span>        /*3*/ KeyValueTestUtil.create("R1", "cf", "a", now - 55,<a name="line.795"></a>
+<span class="sourceLineNo">796</span>        KeyValue.Type.Delete, "dontcare"), // live<a name="line.796"></a>
+<span class="sourceLineNo">797</span>        /*4*/ KeyValueTestUtil.create("R1", "cf", "a", now - 55,<a name="line.797"></a>
+<span class="sourceLineNo">798</span>        KeyValue.Type.Put, "deleted-version v2"), // deleted<a name="line.798"></a>
+<span class="sourceLineNo">799</span>        /*5*/ KeyValueTestUtil.create("R1", "cf", "a", now - 60,<a name="line.799"></a>
+<span class="sourceLineNo">800</span>        KeyValue.Type.Put, "v1"), // live<a name="line.800"></a>
+<span class="sourceLineNo">801</span>        /*6*/ KeyValueTestUtil.create("R1", "cf", "a", now - 65,<a name="line.801"></a>
+<span class="sourceLineNo">802</span>        KeyValue.Type.Put, "v0"), // max-version reached<a name="line.802"></a>
+<span class="sourceLineNo">803</span>        /*7*/ KeyValueTestUtil.create("R1", "cf", "a",<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        now - 100, KeyValue.Type.DeleteColumn, "dont-care"), // max-version<a name="line.804"></a>
+<span class="sourceLineNo">805</span>        /*8*/ KeyValueTestUtil.create("R1", "cf", "b", now - 600,<a name="line.805"></a>
+<span class="sourceLineNo">806</span>        KeyValue.Type.DeleteColumn, "dont-care"), //expired<a name="line.806"></a>
+<span class="sourceLineNo">807</span>        /*9*/ KeyValueTestUtil.create("R1", "cf", "b", now - 70,<a name="line.807"></a>
+<span class="sourceLineNo">808</span>        KeyValue.Type.Put, "v2"), //live<a name="line.808"></a>
+<span class="sourceLineNo">809</span>        /*10*/ KeyValueTestUtil.create("R1", "cf", "b", now - 750,<a name="line.809"></a>
+<span class="sourceLineNo">810</span>        KeyValue.Type.Put, "v1"), //expired<a name="line.810"></a>
+<span class="sourceLineNo">811</span>        /*11*/ KeyValueTestUtil.create("R1", "cf", "c", now - 500,<a name="line.811"></a>
+<span class="sourceLineNo">812</span>        KeyValue.Type.Delete, "dontcare"), //expired<a name="line.812"></a>
+<span class="sourceLineNo">813</span>        /*12*/ KeyValueTestUtil.create("R1", "cf", "c", now - 600,<a name="line.813"></a>
+<span class="sourceLineNo">814</span>        KeyValue.Type.Put, "v1"), //expired<a name="line.814"></a>
+<span class="sourceLineNo">815</span>        /*13*/ KeyValueTestUtil.create("R1", "cf", "c", now - 1000,<a name="line.815"></a>
+<span class="sourceLineNo">816</span>        KeyValue.Type.Delete, "dontcare"), //expired<a name="line.816"></a>
+<span class="sourceLineNo">817</span>        /*14*/ KeyValueTestUtil.create("R1", "cf", "d", now - 60,<a name="line.817"></a>
+<span class="sourceLineNo">818</span>        KeyValue.Type.Put, "expired put"), //live<a name="line.818"></a>
+<span class="sourceLineNo">819</span>        /*15*/ KeyValueTestUtil.create("R1", "cf", "d", now - 100,<a name="line.819"></a>
+<span class="sourceLineNo">820</span>        KeyValue.Type.Delete, "not-expired delete"), //live<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      };<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      List&lt;KeyValueScanner&gt; scanners = scanFixture(kvs);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>      Scan scan = new Scan();<a name="line.823"></a>
+<span class="sourceLineNo">824</span>      scan.setMaxVersions(2);<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      ScanInfo scanInfo = new ScanInfo(CONF, Bytes.toBytes("cf"),<a name="line.825"></a>
+<span class="sourceLineNo">826</span>        0 /* mi

<TRUNCATED>

[24/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html
index f4bddcd..7f40519 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html
@@ -25,100 +25,100 @@
 <span class="sourceLineNo">017</span> */<a name="line.17"></a>
 <span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.ipc;<a name="line.18"></a>
 <span class="sourceLineNo">019</span><a name="line.19"></a>
-<span class="sourceLineNo">020</span>import io.netty.bootstrap.Bootstrap;<a name="line.20"></a>
-<span class="sourceLineNo">021</span>import io.netty.buffer.ByteBuf;<a name="line.21"></a>
-<span class="sourceLineNo">022</span>import io.netty.buffer.ByteBufOutputStream;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import io.netty.channel.Channel;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import io.netty.channel.ChannelFuture;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import io.netty.channel.ChannelFutureListener;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import io.netty.handler.codec.LengthFieldBasedFrameDecoder;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import io.netty.util.Timeout;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import io.netty.util.TimerTask;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import io.netty.util.concurrent.GenericFutureListener;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import io.netty.util.concurrent.Promise;<a name="line.30"></a>
-<span class="sourceLineNo">031</span><a name="line.31"></a>
-<span class="sourceLineNo">032</span>import java.io.IOException;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import java.net.ConnectException;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.net.InetSocketAddress;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import java.nio.ByteBuffer;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import java.security.PrivilegedExceptionAction;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import java.util.ArrayList;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import java.util.HashMap;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import java.util.Iterator;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import java.util.List;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import java.util.Map;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import java.util.Random;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import java.util.concurrent.TimeUnit;<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>import javax.security.sasl.SaslException;<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.commons.logging.Log;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.commons.logging.LogFactory;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.HConstants;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.MetricsConnection;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.exceptions.ConnectionClosingException;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.protobuf.generated.AuthenticationProtos;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.protobuf.generated.TracingProtos;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.security.AuthMethod;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.security.SaslClientHandler;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.security.SaslUtil;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.security.SecurityInfo;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.security.User;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.security.token.AuthenticationTokenSelector;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.io.Text;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.security.SecurityUtil;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.security.UserGroupInformation;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.security.token.Token;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.security.token.TokenIdentifier;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.security.token.TokenSelector;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.htrace.Span;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.htrace.Trace;<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
-<span class="sourceLineNo">074</span>import com.google.protobuf.Descriptors;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import com.google.protobuf.Message;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import com.google.protobuf.RpcCallback;<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>/**<a name="line.78"></a>
-<span class="sourceLineNo">079</span> * Netty RPC channel<a name="line.79"></a>
-<span class="sourceLineNo">080</span> */<a name="line.80"></a>
-<span class="sourceLineNo">081</span>@InterfaceAudience.Private<a name="line.81"></a>
-<span class="sourceLineNo">082</span>public class AsyncRpcChannel {<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  private static final Log LOG = LogFactory.getLog(AsyncRpcChannel.class.getName());<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span>  private static final int MAX_SASL_RETRIES = 5;<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  protected final static Map&lt;AuthenticationProtos.TokenIdentifier.Kind, TokenSelector&lt;? extends<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      TokenIdentifier&gt;&gt; tokenHandlers = new HashMap&lt;&gt;();<a name="line.88"></a>
-<span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  static {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    tokenHandlers.put(AuthenticationProtos.TokenIdentifier.Kind.HBASE_AUTH_TOKEN,<a name="line.91"></a>
-<span class="sourceLineNo">092</span>        new AuthenticationTokenSelector());<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  final AsyncRpcClient client;<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  // Contains the channel to work with.<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  // Only exists when connected<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private Channel channel;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>  String name;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  final User ticket;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  final String serviceName;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  final InetSocketAddress address;<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>  private int failureCounter = 0;<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  boolean useSasl;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  AuthMethod authMethod;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  private int reloginMaxBackoff;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  private Token&lt;? extends TokenIdentifier&gt; token;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  private String serverPrincipal;<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">020</span>import java.io.IOException;<a name="line.20"></a>
+<span class="sourceLineNo">021</span>import java.net.ConnectException;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import java.net.InetSocketAddress;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.nio.ByteBuffer;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.security.PrivilegedExceptionAction;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.util.ArrayList;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.util.HashMap;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.Iterator;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.List;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.Map;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.Random;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.TimeUnit;<a name="line.31"></a>
+<span class="sourceLineNo">032</span><a name="line.32"></a>
+<span class="sourceLineNo">033</span>import javax.security.sasl.SaslException;<a name="line.33"></a>
+<span class="sourceLineNo">034</span><a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.commons.logging.Log;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.commons.logging.LogFactory;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.HConstants;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.MetricsConnection;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.exceptions.ConnectionClosingException;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.protobuf.generated.AuthenticationProtos;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.protobuf.generated.AuthenticationProtos.TokenIdentifier.Kind;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.protobuf.generated.TracingProtos;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.security.AuthMethod;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.security.SaslClientHandler;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.security.SaslUtil;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.security.SecurityInfo;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.security.User;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.security.token.AuthenticationTokenSelector;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.io.Text;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.security.SecurityUtil;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.security.UserGroupInformation;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.security.token.Token;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.security.token.TokenIdentifier;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.security.token.TokenSelector;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.htrace.Span;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.htrace.Trace;<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>import com.google.protobuf.Descriptors;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import com.google.protobuf.Message;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import com.google.protobuf.RpcCallback;<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>import io.netty.bootstrap.Bootstrap;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import io.netty.buffer.ByteBuf;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import io.netty.buffer.ByteBufOutputStream;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import io.netty.channel.Channel;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import io.netty.channel.ChannelFuture;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import io.netty.channel.ChannelFutureListener;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import io.netty.handler.codec.LengthFieldBasedFrameDecoder;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import io.netty.util.Timeout;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import io.netty.util.TimerTask;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import io.netty.util.concurrent.GenericFutureListener;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import io.netty.util.concurrent.Promise;<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> * Netty RPC channel<a name="line.80"></a>
+<span class="sourceLineNo">081</span> */<a name="line.81"></a>
+<span class="sourceLineNo">082</span>@InterfaceAudience.Private<a name="line.82"></a>
+<span class="sourceLineNo">083</span>public class AsyncRpcChannel {<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private static final Log LOG = LogFactory.getLog(AsyncRpcChannel.class.getName());<a name="line.84"></a>
+<span class="sourceLineNo">085</span><a name="line.85"></a>
+<span class="sourceLineNo">086</span>  private static final int MAX_SASL_RETRIES = 5;<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>  protected final static Map&lt;Kind, TokenSelector&lt;? extends TokenIdentifier&gt;&gt; TOKEN_HANDDLERS<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    = new HashMap&lt;&gt;();<a name="line.89"></a>
+<span class="sourceLineNo">090</span><a name="line.90"></a>
+<span class="sourceLineNo">091</span>  static {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    TOKEN_HANDDLERS.put(AuthenticationProtos.TokenIdentifier.Kind.HBASE_AUTH_TOKEN,<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      new AuthenticationTokenSelector());<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>  final AsyncRpcClient client;<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  // Contains the channel to work with.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  // Only exists when connected<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  private Channel channel;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>  String name;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  final User ticket;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  final String serviceName;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  final InetSocketAddress address;<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  private int failureCounter = 0;<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  boolean useSasl;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  AuthMethod authMethod;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  private int reloginMaxBackoff;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  private Token&lt;? extends TokenIdentifier&gt; token;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  private String serverPrincipal;<a name="line.113"></a>
 <span class="sourceLineNo">114</span><a name="line.114"></a>
 <span class="sourceLineNo">115</span>  // NOTE: closed and connected flags below are only changed when a lock on pendingCalls<a name="line.115"></a>
 <span class="sourceLineNo">116</span>  private final Map&lt;Integer, AsyncCall&gt; pendingCalls = new HashMap&lt;Integer, AsyncCall&gt;();<a name="line.116"></a>
@@ -136,629 +136,608 @@
 <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>   * Constructor for netty RPC channel<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   *<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @param bootstrap to construct channel on<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * @param client    to connect with<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   * @param ticket of user which uses connection<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   * @param serviceName name of service to connect to<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * @param address to connect to<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   */<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  public AsyncRpcChannel(Bootstrap bootstrap, final AsyncRpcClient client, User ticket, String<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      serviceName, InetSocketAddress address) {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    this.client = client;<a name="line.140"></a>
-<span class="sourceLineNo">141</span><a name="line.141"></a>
-<span class="sourceLineNo">142</span>    this.ticket = ticket;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    this.serviceName = serviceName;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    this.address = address;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>    this.channel = connect(bootstrap).channel();<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>    name = ("IPC Client (" + channel.hashCode() + ") to " +<a name="line.148"></a>
-<span class="sourceLineNo">149</span>        address.toString() +<a name="line.149"></a>
-<span class="sourceLineNo">150</span>        ((ticket == null) ?<a name="line.150"></a>
-<span class="sourceLineNo">151</span>            " from unknown user" :<a name="line.151"></a>
-<span class="sourceLineNo">152</span>            (" from " + ticket.getName())));<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  }<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>   * Connect to channel<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   *<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * @param bootstrap to connect to<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   * @return future of connection<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private ChannelFuture connect(final Bootstrap bootstrap) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    return bootstrap.remoteAddress(address).connect()<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        .addListener(new GenericFutureListener&lt;ChannelFuture&gt;() {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>          @Override<a name="line.164"></a>
-<span class="sourceLineNo">165</span>          public void operationComplete(final ChannelFuture f) throws Exception {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>            if (!f.isSuccess()) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>              retryOrClose(bootstrap, failureCounter++, client.failureSleep, f.cause());<a name="line.167"></a>
-<span class="sourceLineNo">168</span>              return;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>            }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>            channel = f.channel();<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>            setupAuthorization();<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>            ByteBuf b = channel.alloc().directBuffer(6);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>            createPreamble(b, authMethod);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>            channel.writeAndFlush(b).addListener(ChannelFutureListener.CLOSE_ON_FAILURE);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>            if (useSasl) {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>              UserGroupInformation ticket = AsyncRpcChannel.this.ticket.getUGI();<a name="line.178"></a>
-<span class="sourceLineNo">179</span>              if (authMethod == AuthMethod.KERBEROS) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>                if (ticket != null &amp;&amp; ticket.getRealUser() != null) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>                  ticket = ticket.getRealUser();<a name="line.181"></a>
-<span class="sourceLineNo">182</span>                }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>              }<a name="line.183"></a>
-<span class="sourceLineNo">184</span>              SaslClientHandler saslHandler;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>              if (ticket == null) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>                throw new FatalConnectionException("ticket/user is null");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>              }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>              final UserGroupInformation realTicket = ticket;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>              saslHandler = ticket.doAs(new PrivilegedExceptionAction&lt;SaslClientHandler&gt;() {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>                @Override<a name="line.190"></a>
-<span class="sourceLineNo">191</span>                public SaslClientHandler run() throws IOException {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>                  return getSaslHandler(realTicket, bootstrap);<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>              if (saslHandler != null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>                // Sasl connect is successful. Let's set up Sasl channel handler<a name="line.196"></a>
-<span class="sourceLineNo">197</span>                channel.pipeline().addFirst(saslHandler);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>              } else {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>                // fall back to simple auth because server told us so.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>                authMethod = AuthMethod.SIMPLE;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>                useSasl = false;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>              }<a name="line.202"></a>
-<span class="sourceLineNo">203</span>            } else {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>              startHBaseConnection(f.channel());<a name="line.204"></a>
-<span class="sourceLineNo">205</span>            }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          }<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><a name="line.209"></a>
-<span class="sourceLineNo">210</span>  /**<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   * Start HBase connection<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   *<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * @param ch channel to start connection on<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   */<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  private void startHBaseConnection(Channel ch) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    ch.pipeline()<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        .addLast("frameDecoder", new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4));<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    ch.pipeline().addLast(new AsyncServerResponseHandler(this));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    try {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      writeChannelHeader(ch).addListener(new GenericFutureListener&lt;ChannelFuture&gt;() {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        @Override<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        public void operationComplete(ChannelFuture future) throws Exception {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>          if (!future.isSuccess()) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>            close(future.cause());<a name="line.224"></a>
-<span class="sourceLineNo">225</span>            return;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>          }<a name="line.226"></a>
-<span class="sourceLineNo">227</span>          List&lt;AsyncCall&gt; callsToWrite;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          synchronized (pendingCalls) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>            connected = true;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>            callsToWrite = new ArrayList&lt;AsyncCall&gt;(pendingCalls.values());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>          for (AsyncCall call : callsToWrite) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>            writeRequest(call);<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>      });<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    } catch (IOException e) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      close(e);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    }<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>   * Get SASL handler<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   * @param bootstrap to reconnect to<a name="line.244"></a>
-<span class="sourceLineNo">245</span>   * @return new SASL handler<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * @throws java.io.IOException if handler failed to create<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   */<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  private SaslClientHandler getSaslHandler(final UserGroupInformation realTicket,<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      final Bootstrap bootstrap) throws IOException {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    return new SaslClientHandler(realTicket, authMethod, token, serverPrincipal,<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        client.fallbackAllowed, client.conf.get("hbase.rpc.protection",<a name="line.251"></a>
-<span class="sourceLineNo">252</span>          SaslUtil.QualityOfProtection.AUTHENTICATION.name().toLowerCase()),<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        new SaslClientHandler.SaslExceptionHandler() {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          @Override<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          public void handle(int retryCount, Random random, Throwable cause) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>            try {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>              // Handle Sasl failure. Try to potentially get new credentials<a name="line.257"></a>
-<span class="sourceLineNo">258</span>              handleSaslConnectionFailure(retryCount, cause, realTicket);<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>              retryOrClose(bootstrap, failureCounter++, random.nextInt(reloginMaxBackoff) + 1,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>                  cause);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>            } catch (IOException | InterruptedException e) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>              close(e);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>            }<a name="line.264"></a>
+<span class="sourceLineNo">131</span>   * @param bootstrap to construct channel on<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * @param client to connect with<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @param ticket of user which uses connection<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * @param serviceName name of service to connect to<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   * @param address to connect to<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   */<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  public AsyncRpcChannel(Bootstrap bootstrap, final AsyncRpcClient client, User ticket,<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      String serviceName, InetSocketAddress address) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    this.client = client;<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>    this.ticket = ticket;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    this.serviceName = serviceName;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    this.address = address;<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>    this.channel = connect(bootstrap).channel();<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    name = ("IPC Client (" + channel.hashCode() + ") to " + address.toString()<a name="line.147"></a>
+<span class="sourceLineNo">148</span>        + ((ticket == null) ? " from unknown user" : (" from " + ticket.getName())));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  /**<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * Connect to channel<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   * @param bootstrap to connect to<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * @return future of connection<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   */<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private ChannelFuture connect(final Bootstrap bootstrap) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    return bootstrap.remoteAddress(address).connect()<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        .addListener(new GenericFutureListener&lt;ChannelFuture&gt;() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>          @Override<a name="line.159"></a>
+<span class="sourceLineNo">160</span>          public void operationComplete(final ChannelFuture f) throws Exception {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>            if (!f.isSuccess()) {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>              retryOrClose(bootstrap, failureCounter++, client.failureSleep, f.cause());<a name="line.162"></a>
+<span class="sourceLineNo">163</span>              return;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>            }<a name="line.164"></a>
+<span class="sourceLineNo">165</span>            channel = f.channel();<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>            setupAuthorization();<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>            ByteBuf b = channel.alloc().directBuffer(6);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>            createPreamble(b, authMethod);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>            channel.writeAndFlush(b).addListener(ChannelFutureListener.CLOSE_ON_FAILURE);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>            if (useSasl) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>              UserGroupInformation ticket = AsyncRpcChannel.this.ticket.getUGI();<a name="line.173"></a>
+<span class="sourceLineNo">174</span>              if (authMethod == AuthMethod.KERBEROS) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>                if (ticket != null &amp;&amp; ticket.getRealUser() != null) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>                  ticket = ticket.getRealUser();<a name="line.176"></a>
+<span class="sourceLineNo">177</span>                }<a name="line.177"></a>
+<span class="sourceLineNo">178</span>              }<a name="line.178"></a>
+<span class="sourceLineNo">179</span>              SaslClientHandler saslHandler;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>              if (ticket == null) {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>                throw new FatalConnectionException("ticket/user is null");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>              }<a name="line.182"></a>
+<span class="sourceLineNo">183</span>              final UserGroupInformation realTicket = ticket;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>              saslHandler = ticket.doAs(new PrivilegedExceptionAction&lt;SaslClientHandler&gt;() {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>                @Override<a name="line.185"></a>
+<span class="sourceLineNo">186</span>                public SaslClientHandler run() throws IOException {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>                  return getSaslHandler(realTicket, bootstrap);<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>              if (saslHandler != null) {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>                // Sasl connect is successful. Let's set up Sasl channel handler<a name="line.191"></a>
+<span class="sourceLineNo">192</span>                channel.pipeline().addFirst(saslHandler);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>              } else {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>                // fall back to simple auth because server told us so.<a name="line.194"></a>
+<span class="sourceLineNo">195</span>                authMethod = AuthMethod.SIMPLE;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>                useSasl = false;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>              }<a name="line.197"></a>
+<span class="sourceLineNo">198</span>            } else {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>              startHBaseConnection(f.channel());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>            }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>          }<a name="line.201"></a>
+<span class="sourceLineNo">202</span>        });<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>   * Start HBase connection<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   * @param ch channel to start connection on<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  private void startHBaseConnection(Channel ch) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    ch.pipeline().addLast("frameDecoder",<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4));<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ch.pipeline().addLast(new AsyncServerResponseHandler(this));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    try {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      writeChannelHeader(ch).addListener(new GenericFutureListener&lt;ChannelFuture&gt;() {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        @Override<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        public void operationComplete(ChannelFuture future) throws Exception {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>          if (!future.isSuccess()) {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>            close(future.cause());<a name="line.218"></a>
+<span class="sourceLineNo">219</span>            return;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>          List&lt;AsyncCall&gt; callsToWrite;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>          synchronized (pendingCalls) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>            connected = true;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>            callsToWrite = new ArrayList&lt;AsyncCall&gt;(pendingCalls.values());<a name="line.224"></a>
+<span class="sourceLineNo">225</span>          }<a name="line.225"></a>
+<span class="sourceLineNo">226</span>          for (AsyncCall call : callsToWrite) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>            writeRequest(call);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>          }<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        }<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      });<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    } catch (IOException e) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      close(e);<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>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Get SASL handler<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param bootstrap to reconnect to<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @return new SASL handler<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   * @throws java.io.IOException if handler failed to create<a name="line.240"></a>
+<span class="sourceLineNo">241</span>   */<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private SaslClientHandler getSaslHandler(final UserGroupInformation realTicket,<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      final Bootstrap bootstrap) throws IOException {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    return new SaslClientHandler(realTicket, authMethod, token, serverPrincipal,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        client.fallbackAllowed,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        client.conf.get("hbase.rpc.protection",<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          SaslUtil.QualityOfProtection.AUTHENTICATION.name().toLowerCase()),<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        new SaslClientHandler.SaslExceptionHandler() {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          @Override<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          public void handle(int retryCount, Random random, Throwable cause) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>            try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>              // Handle Sasl failure. Try to potentially get new credentials<a name="line.252"></a>
+<span class="sourceLineNo">253</span>              handleSaslConnectionFailure(retryCount, cause, realTicket);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>              retryOrClose(bootstrap, failureCounter++, random.nextInt(reloginMaxBackoff) + 1,<a name="line.255"></a>
+<span class="sourceLineNo">256</span>                cause);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>            } catch (IOException | InterruptedException e) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>              close(e);<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>        }, new SaslClientHandler.SaslSuccessfulConnectHandler() {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>          @Override<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          public void onSuccess(Channel channel) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>            startHBaseConnection(channel);<a name="line.264"></a>
 <span class="sourceLineNo">265</span>          }<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        }, new SaslClientHandler.SaslSuccessfulConnectHandler() {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>          @Override<a name="line.267"></a>
-<span class="sourceLineNo">268</span>          public void onSuccess(Channel channel) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>            startHBaseConnection(channel);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>          }<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        });<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  }<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>   * Retry to connect or close<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   *<a name="line.276"></a>
-<span class="sourceLineNo">277</span>   * @param bootstrap      to connect with<a name="line.277"></a>
-<span class="sourceLineNo">278</span>   * @param failureCount   failure count<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   * @param e              exception of fail<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  private void retryOrClose(final Bootstrap bootstrap, int failureCount,<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      long timeout, Throwable e) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    if (failureCount &lt; client.maxRetries) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      client.newTimeout(new TimerTask() {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        @Override<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        public void run(Timeout timeout) throws Exception {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>          connect(bootstrap);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        }<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      }, timeout, TimeUnit.MILLISECONDS);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    } else {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      client.failedServers.addToFailedServers(address);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      close(e);<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>   * Calls method on channel<a name="line.297"></a>
-<span class="sourceLineNo">298</span>   * @param method to call<a name="line.298"></a>
-<span class="sourceLineNo">299</span>   * @param controller to run call with<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * @param request to send<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * @param responsePrototype to construct response with<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   */<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  public Promise&lt;Message&gt; callMethod(final Descriptors.MethodDescriptor method,<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      final PayloadCarryingRpcController controller, final Message request,<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      final Message responsePrototype, MetricsConnection.CallStats callStats) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    final AsyncCall call =<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        new AsyncCall(channel.eventLoop(), client.callIdCnt.getAndIncrement(), method, request,<a name="line.307"></a>
-<span class="sourceLineNo">308</span>            controller, responsePrototype, callStats);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    controller.notifyOnCancel(new RpcCallback&lt;Object&gt;() {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      @Override<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      public void run(Object parameter) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        // TODO: do not need to call AsyncCall.setFailed?<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        synchronized (pendingCalls) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>          pendingCalls.remove(call.id);<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>    });<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    // TODO: this should be handled by PayloadCarryingRpcController.<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    if (controller.isCanceled()) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // To finish if the call was cancelled before we set the notification (race condition)<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      call.cancel(true);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      return call;<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>    synchronized (pendingCalls) {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      if (closed) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        Promise&lt;Message&gt; promise = channel.eventLoop().newPromise();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        promise.setFailure(new ConnectException());<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        return promise;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      pendingCalls.put(call.id, call);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      // Add timeout for cleanup if none is present<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      if (cleanupTimer == null &amp;&amp; call.getRpcTimeout() &gt; 0) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        cleanupTimer =<a name="line.334"></a>
-<span class="sourceLineNo">335</span>            client.newTimeout(timeoutTask, call.getRpcTimeout(),<a name="line.335"></a>
-<span class="sourceLineNo">336</span>              TimeUnit.MILLISECONDS);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      }<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      if (!connected) {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        return call;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      }<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    writeRequest(call);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    return call;<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>  AsyncCall removePendingCall(int id) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    synchronized (pendingCalls) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      return pendingCalls.remove(id);<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>   * Write the channel header<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   *<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   * @param channel to write to<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * @return future of write<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * @throws java.io.IOException on failure to write<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  private ChannelFuture writeChannelHeader(Channel channel) throws IOException {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    RPCProtos.ConnectionHeader.Builder headerBuilder =<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        RPCProtos.ConnectionHeader.newBuilder().setServiceName(serviceName);<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    RPCProtos.UserInformation userInfoPB = buildUserInfo(ticket.getUGI(), authMethod);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    if (userInfoPB != null) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      headerBuilder.setUserInfo(userInfoPB);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></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><a name="line.268"></a>
+<span class="sourceLineNo">269</span>  /**<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   * Retry to connect or close<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * @param bootstrap to connect with<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * @param failureCount failure count<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * @param e exception of fail<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   */<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  private void retryOrClose(final Bootstrap bootstrap, int failureCount, long timeout,<a name="line.275"></a>
+<span class="sourceLineNo">276</span>      Throwable e) {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    if (failureCount &lt; client.maxRetries) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      client.newTimeout(new TimerTask() {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        @Override<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        public void run(Timeout timeout) throws Exception {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          connect(bootstrap);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>        }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      }, timeout, TimeUnit.MILLISECONDS);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    } else {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      client.failedServers.addToFailedServers(address);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      close(e);<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><a name="line.289"></a>
+<span class="sourceLineNo">290</span>  /**<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * Calls method on channel<a name="line.291"></a>
+<span class="sourceLineNo">292</span>   * @param method to call<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   * @param controller to run call with<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * @param request to send<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * @param responsePrototype to construct response with<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   */<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public Promise&lt;Message&gt; callMethod(final Descriptors.MethodDescriptor method,<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      final PayloadCarryingRpcController controller, final Message request,<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      final Message responsePrototype, MetricsConnection.CallStats callStats) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    final AsyncCall call = new AsyncCall(channel.eventLoop(), client.callIdCnt.getAndIncrement(),<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        method, request, controller, responsePrototype, callStats);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    controller.notifyOnCancel(new RpcCallback&lt;Object&gt;() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      public void run(Object parameter) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        // TODO: do not need to call AsyncCall.setFailed?<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        synchronized (pendingCalls) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          pendingCalls.remove(call.id);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    });<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    // TODO: this should be handled by PayloadCarryingRpcController.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    if (controller.isCanceled()) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      // To finish if the call was cancelled before we set the notification (race condition)<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      call.cancel(true);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return call;<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>    synchronized (pendingCalls) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      if (closed) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        Promise&lt;Message&gt; promise = channel.eventLoop().newPromise();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        promise.setFailure(new ConnectException());<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        return promise;<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      pendingCalls.put(call.id, call);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      // Add timeout for cleanup if none is present<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      if (cleanupTimer == null &amp;&amp; call.getRpcTimeout() &gt; 0) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        cleanupTimer = client.newTimeout(timeoutTask, call.getRpcTimeout(), TimeUnit.MILLISECONDS);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      }<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      if (!connected) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        return call;<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>    writeRequest(call);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    return call;<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>  AsyncCall removePendingCall(int id) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    synchronized (pendingCalls) {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return pendingCalls.remove(id);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  }<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>  /**<a name="line.343"></a>
+<span class="sourceLineNo">344</span>   * Write the channel header<a name="line.344"></a>
+<span class="sourceLineNo">345</span>   * @param channel to write to<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   * @return future of write<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   * @throws java.io.IOException on failure to write<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   */<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  private ChannelFuture writeChannelHeader(Channel channel) throws IOException {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    RPCProtos.ConnectionHeader.Builder headerBuilder = RPCProtos.ConnectionHeader.newBuilder()<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        .setServiceName(serviceName);<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>    RPCProtos.UserInformation userInfoPB = buildUserInfo(ticket.getUGI(), authMethod);<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    if (userInfoPB != null) {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      headerBuilder.setUserInfo(userInfoPB);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    if (client.codec != null) {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      headerBuilder.setCellBlockCodecClass(client.codec.getClass().getCanonicalName());<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    }<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    if (client.compressor != null) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      headerBuilder.setCellBlockCompressorClass(client.compressor.getClass().getCanonicalName());<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    headerBuilder.setVersionInfo(ProtobufUtil.getVersionInfo());<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    RPCProtos.ConnectionHeader header = headerBuilder.build();<a name="line.366"></a>
 <span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (client.codec != null) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      headerBuilder.setCellBlockCodecClass(client.codec.getClass().getCanonicalName());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    if (client.compressor != null) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      headerBuilder.setCellBlockCompressorClass(client.compressor.getClass().getCanonicalName());<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
+<span class="sourceLineNo">368</span>    int totalSize = IPCUtil.getTotalSizeWhenWrittenDelimited(header);<a name="line.368"></a>
+<span class="sourceLineNo">369</span><a name="line.369"></a>
+<span class="sourceLineNo">370</span>    ByteBuf b = channel.alloc().directBuffer(totalSize);<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    b.writeInt(header.getSerializedSize());<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    b.writeBytes(header.toByteArray());<a name="line.373"></a>
 <span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    headerBuilder.setVersionInfo(ProtobufUtil.getVersionInfo());<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    RPCProtos.ConnectionHeader header = headerBuilder.build();<a name="line.376"></a>
+<span class="sourceLineNo">375</span>    return channel.writeAndFlush(b);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
 <span class="sourceLineNo">377</span><a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>    int totalSize = IPCUtil.getTotalSizeWhenWrittenDelimited(header);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>    ByteBuf b = channel.alloc().directBuffer(totalSize);<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span>    b.writeInt(header.getSerializedSize());<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    b.writeBytes(header.toByteArray());<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>    return channel.writeAndFlush(b);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
+<span class="sourceLineNo">378</span>  /**<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * Write request to channel<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * @param call to write<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   */<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  private void writeRequest(final AsyncCall call) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    try {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      final RPCProtos.RequestHeader.Builder requestHeaderBuilder = RPCProtos.RequestHeader<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          .newBuilder();<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      requestHeaderBuilder.setCallId(call.id).setMethodName(call.method.getName())<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          .setRequestParam(call.param != null);<a name="line.387"></a>
 <span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * Write request to channel<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   *<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * @param call    to write<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  private void writeRequest(final AsyncCall call) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    try {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      final RPCProtos.RequestHeader.Builder requestHeaderBuilder = RPCProtos.RequestHeader<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          .newBuilder();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      requestHeaderBuilder.setCallId(call.id)<a name="line.398"></a>
-<span class="sourceLineNo">399</span>              .setMethodName(call.method.getName()).setRequestParam(call.param != null);<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>      if (Trace.isTracing()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        Span s = Trace.currentSpan();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        requestHeaderBuilder.setTraceInfo(TracingProtos.RPCTInfo.newBuilder().<a name="line.403"></a>
-<span class="sourceLineNo">404</span>            setParentId(s.getSpanId()).setTraceId(s.getTraceId()));<a name="line.404"></a>
+<span class="sourceLineNo">389</span>      if (Trace.isTracing()) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>        Span s = Trace.currentSpan();<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        requestHeaderBuilder.setTraceInfo(TracingProtos.RPCTInfo.newBuilder()<a name="line.391"></a>
+<span class="sourceLineNo">392</span>            .setParentId(s.getSpanId()).setTraceId(s.getTraceId()));<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>      ByteBuffer cellBlock = client.buildCellBlock(call.controller.cellScanner());<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      if (cellBlock != null) {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        final RPCProtos.CellBlockMeta.Builder cellBlockBuilder = RPCProtos.CellBlockMeta<a name="line.397"></a>
+<span class="sourceLineNo">398</span>            .newBuilder();<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        cellBlockBuilder.setLength(cellBlock.limit());<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        requestHeaderBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      // Only pass priority if there one. Let zero be same as no priority.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      if (call.controller.getPriority() != PayloadCarryingRpcController.PRIORITY_UNSET) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        requestHeaderBuilder.setPriority(call.controller.getPriority());<a name="line.404"></a>
 <span class="sourceLineNo">405</span>      }<a name="line.405"></a>
 <span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>      ByteBuffer cellBlock = client.buildCellBlock(call.controller.cellScanner());<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      if (cellBlock != null) {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        final RPCProtos.CellBlockMeta.Builder cellBlockBuilder = RPCProtos.CellBlockMeta<a name="line.409"></a>
-<span class="sourceLineNo">410</span>            .newBuilder();<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        cellBlockBuilder.setLength(cellBlock.limit());<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        requestHeaderBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      // Only pass priority if there one.  Let zero be same as no priority.<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      if (call.controller.getPriority() != PayloadCarryingRpcController.PRIORITY_UNSET) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        requestHeaderBuilder.setPriority(call.controller.getPriority());<a name="line.416"></a>
+<span class="sourceLineNo">407</span>      RPCProtos.RequestHeader rh = requestHeaderBuilder.build();<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>      int totalSize = IPCUtil.getTotalSizeWhenWrittenDelimited(rh, call.param);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      if (cellBlock != null) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        totalSize += cellBlock.remaining();<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>      ByteBuf b = channel.alloc().directBuffer(4 + totalSize);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      try (ByteBufOutputStream out = new ByteBufOutputStream(b)) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        call.callStats.setRequestSizeBytes(IPCUtil.write(out, rh, call.param, cellBlock));<a name="line.416"></a>
 <span class="sourceLineNo">417</span>      }<a name="line.417"></a>
 <span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>      RPCProtos.RequestHeader rh = requestHeaderBuilder.build();<a name="line.419"></a>
-<span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>      int totalSize = IPCUtil.getTotalSizeWhenWrittenDelimited(rh, call.param);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      if (cellBlock != null) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        totalSize += cellBlock.remaining();<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>      ByteBuf b = channel.alloc().directBuffer(4 + totalSize);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      try(ByteBufOutputStream out = new ByteBufOutputStream(b)) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        call.callStats.setRequestSizeBytes(IPCUtil.write(out, rh, call.param, cellBlock));<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      }<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>      channel.writeAndFlush(b).addListener(new CallWriteListener(this, call.id));<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    } catch (IOException e) {<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      close(e);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  /**<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * Set up server authorization<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   *<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @throws java.io.IOException if auth setup failed<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   */<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  private void setupAuthorization() throws IOException {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    SecurityInfo securityInfo = SecurityInfo.getInfo(serviceName);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    this.useSasl = client.userProvider.isHBaseSecurityEnabled();<a name="line.444"></a>
-<span class="sourceLineNo">445</span><a name="line.445"></a>
-<span class="sourceLineNo">446</span>    this.token = null;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    if (useSasl &amp;&amp; securityInfo != null) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      AuthenticationProtos.TokenIdentifier.Kind tokenKind = securityInfo.getTokenKind();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      if (tokenKind != null) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        TokenSelector&lt;? extends TokenIdentifier&gt; tokenSelector = tokenHandlers.get(tokenKind);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        if (tokenSelector != null) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          token = tokenSelector<a name="line.452"></a>
-<span class="sourceLineNo">453</span>              .selectToken(new Text(client.clusterId), ticket.getUGI().getTokens());<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        } else if (LOG.isDebugEnabled()) {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>          LOG.debug("No token selector found for type " + tokenKind);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      String serverKey = securityInfo.getServerPrincipal();<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      if (serverKey == null) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        throw new IOException("Can't obtain server Kerberos config key from SecurityInfo");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      }<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      this.serverPrincipal = SecurityUtil.getServerPrincipal(client.conf.get(serverKey),<a name="line.462"></a>
-<span class="sourceLineNo">463</span>          address.getAddress().getCanonicalHostName().toLowerCase());<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      if (LOG.isDebugEnabled()) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        LOG.debug("RPC Server Kerberos principal name for service=" + serviceName + " is "<a name="line.465"></a>
-<span class="sourceLineNo">466</span>            + serverPrincipal);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      }<a name="line.467"></a>
+<span class="sourceLineNo">419</span>      channel.writeAndFlush(b).addListener(new CallWriteListener(this, call.id));<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    } catch (IOException e) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      close(e);<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><a name="line.424"></a>
+<span class="sourceLineNo">425</span>  /**<a name="line.425"></a>
+<span class="sourceLineNo">426</span>   * Set up server authorization<a name="line.426"></a>
+<span class="sourceLineNo">427</span>   * @throws java.io.IOException if auth setup failed<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   */<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  private void setupAuthorization() throws IOException {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    SecurityInfo securityInfo = SecurityInfo.getInfo(serviceName);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    this.useSasl = client.userProvider.isHBaseSecurityEnabled();<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span>    this.token = null;<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    if (useSasl &amp;&amp; securityInfo != null) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      AuthenticationProtos.TokenIdentifier.Kind tokenKind = securityInfo.getTokenKind();<a name="line.435"></a>
+<span class="sourceLineNo">436</span>      if (tokenKind != null) {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>        TokenSelector&lt;? extends TokenIdentifier&gt; tokenSelector = TOKEN_HANDDLERS.get(tokenKind);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        if (tokenSelector != null) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>          token = tokenSelector.selectToken(new Text(client.clusterId),<a name="line.439"></a>
+<span class="sourceLineNo">440</span>            ticket.getUGI().getTokens());<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        } else if (LOG.isDebugEnabled()) {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>          LOG.debug("No token selector found for type " + tokenKind);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        }<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      }<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      String serverKey = securityInfo.getServerPrincipal();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      if (serverKey == null) {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        throw new IOException("Can't obtain server Kerberos config key from SecurityInfo");<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      }<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      this.serverPrincipal = SecurityUtil.getServerPrincipal(client.conf.get(serverKey),<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        address.getAddress().getCanonicalHostName().toLowerCase());<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      if (LOG.isDebugEnabled()) {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        LOG.debug("RPC Server Kerberos principal name for service=" + serviceName + " is "<a name="line.452"></a>
+<span class="sourceLineNo">453</span>            + serverPrincipal);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
+<span class="sourceLineNo">456</span><a name="line.456"></a>
+<span class="sourceLineNo">457</span>    if (!useSasl) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      authMethod = AuthMethod.SIMPLE;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    } else if (token != null) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      authMethod = AuthMethod.DIGEST;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    } else {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      authMethod = AuthMethod.KERBEROS;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>    if (LOG.isDebugEnabled()) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      LOG.debug(<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        "Use " + authMethod + " authentication for service " + serviceName + ", sasl=" + useSasl);<a name="line.467"></a>
 <span class="sourceLineNo">468</span>    }<a name="line.468"></a>
-<span class="sourceLineNo">469</span><a name="line.469"></a>
-<span class="sourceLineNo">470</span>    if (!useSasl) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      authMethod = AuthMethod.SIMPLE;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    } else if (token != null) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      authMethod = AuthMethod.DIGEST;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    } else {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      authMethod = AuthMethod.KERBEROS;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span><a name="line.477"></a>
-<span class="sourceLineNo">478</span>    if (LOG.isDebugEnabled()) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      LOG.debug("Use " + authMethod + " authentication for service " + serviceName +<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          ", sasl=" + useSasl);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    reloginMaxBackoff = client.conf.getInt("hbase.security.relogin.maxbackoff", 5000);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  /**<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   * Build the user information<a name="line.486"></a>
-<span class="sourceLineNo">487</span>   *<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   * @param ugi        User Group Information<a name="line.488"></a>
-<span class="sourceLineNo">489</span>   * @param authMethod Authorization method<a name="line.489"></a>
-<span class="sourceLineNo">490</span>   * @return UserInformation protobuf<a name="line.490"></a>
-<span class="sourceLineNo">491</span>   */<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  private RPCProtos.UserInformation buildUserInfo(UserGroupInformation ugi, AuthMethod authMethod) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    if (ugi == null || authMethod == AuthMethod.DIGEST) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      // Don't send user for token auth<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      return null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    RPCProtos.UserInformation.Builder userInfoPB = RPCProtos.UserInformation.newBuilder();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    if (authMethod == AuthMethod.KERBEROS) {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // Send effective user for Kerberos auth<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      userInfoPB.setEffectiveUser(ugi.getUserName());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    } else if (authMethod == AuthMethod.SIMPLE) {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      //Send both effective user and real user for simple auth<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      userInfoPB.setEffectiveUser(ugi.getUserName());<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      if (ugi.getRealUser() != null) {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        userInfoPB.setRealUser(ugi.getRealUser().getUserName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      }<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    }<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    return userInfoPB.build();<a name="line.508"></a>
-<span class="sourceLineNo">509</span>  }<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>  /**<a name="line.511"></a>
-<span class="sourceLineNo">512</span>   * Create connection preamble<a name="line.512"></a>
-<span class="sourceLineNo">513</span>   *<a name="line.513"></a>
-<span class="sourceLineNo">514</span>   * @param byteBuf    to write to<a name="line.514"></a>
-<span class="sourceLineNo">515</span>   * @param authMethod to write<a name="line.515"></a>
-<span class="sourceLineNo">516</span>   */<a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private void createPreamble(ByteBuf byteBuf, AuthMethod authMethod) {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    byteBuf.writeBytes(HConstants.RPC_HEADER);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    byteBuf.writeByte(HConstants.RPC_CURRENT_VERSION);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    byteBuf.writeByte(authMethod.code);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>  }<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="lin

<TRUNCATED>

[44/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/regionserver/MobCompactionStoreScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/MobCompactionStoreScanner.html b/devapidocs/org/apache/hadoop/hbase/regionserver/MobCompactionStoreScanner.html
index 31e7649..9caf591 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/MobCompactionStoreScanner.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/MobCompactionStoreScanner.html
@@ -224,7 +224,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanne
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreScanner</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#addCurrentScanners(java.util.List)">addCurrentScanners</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkFlushed()">checkFlushed</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkReseek(boolean)">checkReseek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkScanOrder(org.apache.hadoop.hbase.Cell,%20org.apache.hadoop.hbase.Cell,%20org.apache.hadoop.hbase.CellComparator)">checkScanOrder</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#close()">close</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#enableLazySeekGlobally(boolean)">enableLazySeekGlobally</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getAllScannersForTesting()">getAllScannersForTesting</a>, <a href="../../../../../or
 g/apache/hadoop/hbase/regionserver/StoreScanner.html#getEstimatedNumberOfKvsScanned()">getEstimatedNumberOfKvsScanned</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getNextIndexedKey()">getNextIndexedKey</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getScannersNoCompaction()">getScannersNoCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getSequenceID()">getSequenceID</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next()">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next(java.util.List)">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next(java.util.List,%20org.apache.hadoop.hbase.regionserver.ScannerContext)">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#peek()">peek</a>, <a href="../../../../../org/ap
 ache/hadoop/hbase/regionserver/StoreScanner.html#reseek(org.apache.hadoop.hbase.Cell)">reseek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#resetKVHeap(java.util.List,%20org.apache.hadoop.hbase.CellComparator)">resetKVHeap</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#resetScannerStack(org.apache.hadoop.hbase.Cell)">resetScannerStack</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#seek(org.apache.hadoop.hbase.Cell)">seek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#seekAsDirection(org.apache.hadoop.hbase.Cell)">seekAsDirection</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#seekScanners(java.util.List,%20org.apache.hadoop.hbase.Cell,%20boolean,%20boolean)">seekScanners</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#seekToNextRow(org.apache.hadoop.hbase.Cell)">see
 kToNextRow</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#selectScannersFrom(java.util.List)">selectScannersFrom</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#shipped()">shipped</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#updateReaders(java.util.List)">updateReaders</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#addCurrentScanners(java.util.List)">addCurrentScanners</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkFlushed()">checkFlushed</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkReseek(boolean)">checkReseek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkScanOrder(org.apache.hadoop.hbase.Cell,%20org.apache.hadoop.hbase.Cell,%20org.apache.hadoop.hbase.CellComparator)">checkScanOrder</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#close()">close</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#enableLazySeekGlobally(boolean)">enableLazySeekGlobally</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getAllScannersForTesting()">getAllScannersForTesting</a>, <a href="../../../../../or
 g/apache/hadoop/hbase/regionserver/StoreScanner.html#getEstimatedNumberOfKvsScanned()">getEstimatedNumberOfKvsScanned</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getNextIndexedKey()">getNextIndexedKey</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getScannersNoCompaction()">getScannersNoCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getSequenceID()">getSequenceID</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next()">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next(java.util.List)">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next(java.util.List,%20org.apache.hadoop.hbase.regionserver.ScannerContext)">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#optimize(org.apache.hadoop.hbase.regionserver.Sc
 anQueryMatcher.MatchCode,%20org.apache.hadoop.hbase.Cell)">optimize</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#peek()">peek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#reseek(org.apache.hadoop.hbase.Cell)">reseek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#resetKVHeap(java.util.List,%20org.apache.hadoop.hbase.CellComparator)">resetKVHeap</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#resetScannerStack(org.apache.hadoop.hbase.Cell)">resetScannerStack</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#seek(org.apache.hadoop.hbase.Cell)">seek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#seekAsDirection(org.apache.hadoop.hbase.Cell)">seekAsDirection</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#seekScanners(java.util.List,%
 20org.apache.hadoop.hbase.Cell,%20boolean,%20boolean)">seekScanners</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#seekToNextRow(org.apache.hadoop.hbase.Cell)">seekToNextRow</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#selectScannersFrom(java.util.List)">selectScannersFrom</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#shipped()">shipped</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#updateReaders(java.util.List)">updateReaders</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods_inherited_from_class_org.apache.hadoop.hbase.regionserver.NonReversedNonLazyKeyValueScanner">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/regionserver/MobStoreScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/MobStoreScanner.html b/devapidocs/org/apache/hadoop/hbase/regionserver/MobStoreScanner.html
index fccca8f..b2fbaf6 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/MobStoreScanner.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/MobStoreScanner.html
@@ -231,7 +231,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanne
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreScanner</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#addCurrentScanners(java.util.List)">addCurrentScanners</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkFlushed()">checkFlushed</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkReseek(boolean)">checkReseek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkScanOrder(org.apache.hadoop.hbase.Cell,%20org.apache.hadoop.hbase.Cell,%20org.apache.hadoop.hbase.CellComparator)">checkScanOrder</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#close()">close</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#enableLazySeekGlobally(boolean)">enableLazySeekGlobally</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getAllScannersForTesting()">getAllScannersForTesting</a>, <a href="../../../../../or
 g/apache/hadoop/hbase/regionserver/StoreScanner.html#getEstimatedNumberOfKvsScanned()">getEstimatedNumberOfKvsScanned</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getNextIndexedKey()">getNextIndexedKey</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getScannersNoCompaction()">getScannersNoCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getSequenceID()">getSequenceID</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next()">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next(java.util.List)">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#peek()">peek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#reseek(org.apache.hadoop.hbase.Cell)">reseek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreS
 canner.html#resetKVHeap(java.util.List,%20org.apache.hadoop.hbase.CellComparator)">resetKVHeap</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#resetScannerStack(org.apache.hadoop.hbase.Cell)">resetScannerStack</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#seek(org.apache.hadoop.hbase.Cell)">seek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#seekAsDirection(org.apache.hadoop.hbase.Cell)">seekAsDirection</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#seekScanners(java.util.List,%20org.apache.hadoop.hbase.Cell,%20boolean,%20boolean)">seekScanners</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#seekToNextRow(org.apache.hadoop.hbase.Cell)">seekToNextRow</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#selectScannersFrom(java.util.List)">selectScannersFrom</a>, <a href="..
 /../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#shipped()">shipped</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#updateReaders(java.util.List)">updateReaders</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#addCurrentScanners(java.util.List)">addCurrentScanners</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkFlushed()">checkFlushed</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkReseek(boolean)">checkReseek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkScanOrder(org.apache.hadoop.hbase.Cell,%20org.apache.hadoop.hbase.Cell,%20org.apache.hadoop.hbase.CellComparator)">checkScanOrder</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#close()">close</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#enableLazySeekGlobally(boolean)">enableLazySeekGlobally</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getAllScannersForTesting()">getAllScannersForTesting</a>, <a href="../../../../../or
 g/apache/hadoop/hbase/regionserver/StoreScanner.html#getEstimatedNumberOfKvsScanned()">getEstimatedNumberOfKvsScanned</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getNextIndexedKey()">getNextIndexedKey</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getScannersNoCompaction()">getScannersNoCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getSequenceID()">getSequenceID</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next()">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next(java.util.List)">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#optimize(org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode,%20org.apache.hadoop.hbase.Cell)">optimize</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#peek()">peek</
 a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#reseek(org.apache.hadoop.hbase.Cell)">reseek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#resetKVHeap(java.util.List,%20org.apache.hadoop.hbase.CellComparator)">resetKVHeap</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#resetScannerStack(org.apache.hadoop.hbase.Cell)">resetScannerStack</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#seek(org.apache.hadoop.hbase.Cell)">seek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#seekAsDirection(org.apache.hadoop.hbase.Cell)">seekAsDirection</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#seekScanners(java.util.List,%20org.apache.hadoop.hbase.Cell,%20boolean,%20boolean)">seekScanners</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#seekToNextRow(
 org.apache.hadoop.hbase.Cell)">seekToNextRow</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#selectScannersFrom(java.util.List)">selectScannersFrom</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#shipped()">shipped</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#updateReaders(java.util.List)">updateReaders</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods_inherited_from_class_org.apache.hadoop.hbase.regionserver.NonReversedNonLazyKeyValueScanner">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/regionserver/NonLazyKeyValueScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/NonLazyKeyValueScanner.html b/devapidocs/org/apache/hadoop/hbase/regionserver/NonLazyKeyValueScanner.html
index deea970..bccc46b 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/NonLazyKeyValueScanner.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/NonLazyKeyValueScanner.html
@@ -381,8 +381,9 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#getNextIndexedKey()">getNextIndexedKey</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a></code></dd>
-<dt><span class="strong">Returns:</span></dt><dd>the next key in the index (the key to seek to the next block)
- if known, or null otherwise</dd></dl>
+<dt><span class="strong">Returns:</span></dt><dd>the next key in the index, usually the first key of next block OR a key that falls
+ between last key of current block and first key of next block..
+ see HFileWriterImpl#getMidpoint, or null if not known.</dd></dl>
 </li>
 </ul>
 <a name="shipped()">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/regionserver/ReversedMobStoreScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/ReversedMobStoreScanner.html b/devapidocs/org/apache/hadoop/hbase/regionserver/ReversedMobStoreScanner.html
index 88be024..6d31a88 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/ReversedMobStoreScanner.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/ReversedMobStoreScanner.html
@@ -243,7 +243,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/ReversedSto
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreScanner</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#addCurrentScanners(java.util.List)">addCurrentScanners</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkFlushed()">checkFlushed</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkReseek(boolean)">checkReseek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#close()">close</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#enableLazySeekGlobally(boolean)">enableLazySeekGlobally</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getAllScannersForTesting()">getAllScannersForTesting</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getEstimatedNumberOfKvsScanned()">getEstimatedNumberOfKvsScanned</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getNextIndexedKey
 ()">getNextIndexedKey</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getScannersNoCompaction()">getScannersNoCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getSequenceID()">getSequenceID</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next()">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next(java.util.List)">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#peek()">peek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#resetScannerStack(org.apache.hadoop.hbase.Cell)">resetScannerStack</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#selectScannersFrom(java.util.List)">selectScannersFrom</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#shipped()">shipped</a>, <a href="../../../../.
 ./org/apache/hadoop/hbase/regionserver/StoreScanner.html#updateReaders(java.util.List)">updateReaders</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#addCurrentScanners(java.util.List)">addCurrentScanners</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkFlushed()">checkFlushed</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkReseek(boolean)">checkReseek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#close()">close</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#enableLazySeekGlobally(boolean)">enableLazySeekGlobally</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getAllScannersForTesting()">getAllScannersForTesting</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getEstimatedNumberOfKvsScanned()">getEstimatedNumberOfKvsScanned</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getNextIndexedKey
 ()">getNextIndexedKey</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getScannersNoCompaction()">getScannersNoCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getSequenceID()">getSequenceID</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next()">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next(java.util.List)">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#optimize(org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode,%20org.apache.hadoop.hbase.Cell)">optimize</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#peek()">peek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#resetScannerStack(org.apache.hadoop.hbase.Cell)">resetScannerStack</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/Sto
 reScanner.html#selectScannersFrom(java.util.List)">selectScannersFrom</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#shipped()">shipped</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#updateReaders(java.util.List)">updateReaders</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods_inherited_from_class_org.apache.hadoop.hbase.regionserver.NonReversedNonLazyKeyValueScanner">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/regionserver/ReversedStoreScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/ReversedStoreScanner.html b/devapidocs/org/apache/hadoop/hbase/regionserver/ReversedStoreScanner.html
index dc2cbf5..bc0a168 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/ReversedStoreScanner.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/ReversedStoreScanner.html
@@ -278,7 +278,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreScanner</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#addCurrentScanners(java.util.List)">addCurrentScanners</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkFlushed()">checkFlushed</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkReseek(boolean)">checkReseek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#close()">close</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#enableLazySeekGlobally(boolean)">enableLazySeekGlobally</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getAllScannersForTesting()">getAllScannersForTesting</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getEstimatedNumberOfKvsScanned()">getEstimatedNumberOfKvsScanned</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getNextIndexedKey
 ()">getNextIndexedKey</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getScannersNoCompaction()">getScannersNoCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getSequenceID()">getSequenceID</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next()">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next(java.util.List)">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next(java.util.List,%20org.apache.hadoop.hbase.regionserver.ScannerContext)">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#peek()">peek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#resetScannerStack(org.apache.hadoop.hbase.Cell)">resetScannerStack</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#selectScannersFrom(
 java.util.List)">selectScannersFrom</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#shipped()">shipped</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#updateReaders(java.util.List)">updateReaders</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#addCurrentScanners(java.util.List)">addCurrentScanners</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkFlushed()">checkFlushed</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#checkReseek(boolean)">checkReseek</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#close()">close</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#enableLazySeekGlobally(boolean)">enableLazySeekGlobally</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getAllScannersForTesting()">getAllScannersForTesting</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getEstimatedNumberOfKvsScanned()">getEstimatedNumberOfKvsScanned</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getNextIndexedKey
 ()">getNextIndexedKey</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getScannersNoCompaction()">getScannersNoCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#getSequenceID()">getSequenceID</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next()">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next(java.util.List)">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#next(java.util.List,%20org.apache.hadoop.hbase.regionserver.ScannerContext)">next</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#optimize(org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode,%20org.apache.hadoop.hbase.Cell)">optimize</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#peek()">peek</a>, <a href="../../../../../org/apache/hadoop/hbase/r
 egionserver/StoreScanner.html#resetScannerStack(org.apache.hadoop.hbase.Cell)">resetScannerStack</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#selectScannersFrom(java.util.List)">selectScannersFrom</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#shipped()">shipped</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#updateReaders(java.util.List)">updateReaders</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods_inherited_from_class_org.apache.hadoop.hbase.regionserver.NonReversedNonLazyKeyValueScanner">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html b/devapidocs/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html
index d42512d..bc0c97e 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html
@@ -108,7 +108,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.626">ScanQueryMatcher.MatchCode</a>
+<pre>public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.632">ScanQueryMatcher.MatchCode</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a>&gt;</pre>
 <div class="block"><a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#match(org.apache.hadoop.hbase.Cell)"><code>ScanQueryMatcher.match(org.apache.hadoop.hbase.Cell)</code></a> return codes.  These instruct the scanner moving through
  memstores and StoreFiles what to do with the current KeyValue.
@@ -243,7 +243,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>INCLUDE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.630">INCLUDE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.636">INCLUDE</a></pre>
 <div class="block">Include KeyValue in the returned result</div>
 </li>
 </ul>
@@ -253,7 +253,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>SKIP</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.635">SKIP</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.641">SKIP</a></pre>
 <div class="block">Do not include KeyValue in the returned result</div>
 </li>
 </ul>
@@ -263,7 +263,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>NEXT</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.640">NEXT</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.646">NEXT</a></pre>
 <div class="block">Do not include, jump to next StoreFile or memstore (in time order)</div>
 </li>
 </ul>
@@ -273,7 +273,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>DONE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.645">DONE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.651">DONE</a></pre>
 <div class="block">Do not include, return current result</div>
 </li>
 </ul>
@@ -283,7 +283,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>SEEK_NEXT_ROW</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.654">SEEK_NEXT_ROW</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.660">SEEK_NEXT_ROW</a></pre>
 <div class="block">Done with the row, seek there.</div>
 </li>
 </ul>
@@ -293,7 +293,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>SEEK_NEXT_COL</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.658">SEEK_NEXT_COL</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.664">SEEK_NEXT_COL</a></pre>
 <div class="block">Done with column, seek to next.</div>
 </li>
 </ul>
@@ -303,7 +303,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>DONE_SCAN</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.663">DONE_SCAN</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.669">DONE_SCAN</a></pre>
 <div class="block">Done with scan, thanks to the row filter.</div>
 </li>
 </ul>
@@ -313,7 +313,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>SEEK_NEXT_USING_HINT</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.668">SEEK_NEXT_USING_HINT</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.674">SEEK_NEXT_USING_HINT</a></pre>
 </li>
 </ul>
 <a name="INCLUDE_AND_SEEK_NEXT_COL">
@@ -322,7 +322,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>INCLUDE_AND_SEEK_NEXT_COL</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.673">INCLUDE_AND_SEEK_NEXT_COL</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.679">INCLUDE_AND_SEEK_NEXT_COL</a></pre>
 <div class="block">Include KeyValue and done with column, seek to next.</div>
 </li>
 </ul>
@@ -332,7 +332,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>INCLUDE_AND_SEEK_NEXT_ROW</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.678">INCLUDE_AND_SEEK_NEXT_ROW</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html#line.684">INCLUDE_AND_SEEK_NEXT_ROW</a></pre>
 <div class="block">Include KeyValue and done with row, seek to next.</div>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html b/devapidocs/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html
index eeba89c..3b02d3b 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html
@@ -179,85 +179,91 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#get">get</a></strong></code>
+<div class="block">True if we are doing a 'Get' Scan.</div>
+</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#hasNullColumn">hasNullColumn</a></strong></code>
 <div class="block">This variable shows whether there is an null column in the query.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#isReversed">isReversed</a></strong></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/regionserver/ScanQueryMatcher.html#isUserScan">isUserScan</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase">KeepDeletedCells</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#keepDeletedCells">keepDeletedCells</a></strong></code>
 <div class="block">whether to return deleted rows</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected long</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#maxReadPointToTrackVersions">maxReadPointToTrackVersions</a></strong></code>
 <div class="block">readPoint over which the KVs are unconditionally included</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#now">now</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#oldestUnexpiredTS">oldestUnexpiredTS</a></strong></code>
 <div class="block">The oldest timestamp we are interested in, based on TTL</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver">RegionCoprocessorHost</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#regionCoprocessorHost">regionCoprocessorHost</a></strong></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/regionserver/ScanQueryMatcher.html#retainDeletesInOutput">retainDeletesInOutput</a></strong></code>
 <div class="block">whether to retain delete markers</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#rowComparator">rowComparator</a></strong></code>
 <div class="block">Row comparator for the region this query is for</div>
 </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/regionserver/ScanQueryMatcher.html#seePastDeleteMarkers">seePastDeleteMarkers</a></strong></code>
 <div class="block">whether time range queries can see rows "behind" a delete</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#startKey">startKey</a></strong></code>
 <div class="block">Key to seek to in memstore and StoreFiles</div>
 </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/regionserver/ScanQueryMatcher.html#stickyNextRow">stickyNextRow</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private byte[]</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#stopRow">stopRow</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#timeToPurgeDeletes">timeToPurgeDeletes</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#tr">tr</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#ttl">ttl</a></strong></code>&nbsp;</td>
 </tr>
@@ -653,12 +659,22 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <a name="isReversed">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>isReversed</h4>
 <pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.146">isReversed</a></pre>
 </li>
 </ul>
+<a name="get">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>get</h4>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.151">get</a></pre>
+<div class="block">True if we are doing a 'Get' Scan. Every Get is actually a one-row Scan.</div>
+</li>
+</ul>
 </li>
 </ul>
 <!-- ========= CONSTRUCTOR DETAIL ======== -->
@@ -684,8 +700,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
                 <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver">RegionCoprocessorHost</a>&nbsp;regionCoprocessorHost)
                  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">Construct a QueryMatcher for a scan</div>
-<dl><dt><span class="strong">Parameters:</span></dt><dd><code>scan</code> - </dd><dd><code>scanInfo</code> - The store's immutable scan info</dd><dd><code>columns</code> - </dd><dd><code>scanType</code> - Type of the scan</dd><dd><code>earliestPutTs</code> - Earliest put seen in any of the store files.</dd><dd><code>oldestUnexpiredTS</code> - the oldest timestamp we are interested in,
-  based on TTL</dd><dd><code>regionCoprocessorHost</code> - </dd>
+<dl><dt><span class="strong">Parameters:</span></dt><dd><code>scanInfo</code> - The store's immutable scan info</dd><dd><code>scanType</code> - Type of the scan</dd><dd><code>earliestPutTs</code> - Earliest put seen in any of the store files.</dd><dd><code>oldestUnexpiredTS</code> - the oldest timestamp we are interested in, based on TTL</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></dd></dl>
 </li>
@@ -696,7 +711,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>ScanQueryMatcher</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.240">ScanQueryMatcher</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.241">ScanQueryMatcher</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                 <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a>&nbsp;scanInfo,
                 <a href="http://docs.oracle.com/javase/7/docs/api/java/util/NavigableSet.html?is-external=true" title="class or interface in java.util">NavigableSet</a>&lt;byte[]&gt;&nbsp;columns,
                 long&nbsp;readPointToUse,
@@ -719,7 +734,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ScanQueryMatcher</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.254">ScanQueryMatcher</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/ScanQueryMatcher.html#line.255">ScanQueryMatcher</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                 <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a>&nbsp;scanInfo,
                 <a href="http://docs.oracle.com/javase/7/docs/api/java/util/NavigableSet.html?is-external=true" title="class or interface in java.util">NavigableSet</a>&lt;byte[]&gt;&nbsp;columns,
                 long&nbsp;oldestUnexpiredTS,
@@ -743,7 +758,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>instantiateDeleteTracker</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/DeleteTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">DeleteTracker</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.219">instantiateDeleteTracker</a>()
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/DeleteTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">DeleteTracker</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.220">instantiateDeleteTracker</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>
@@ -755,7 +770,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>hasNullColumnInQuery</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.265">hasNullColumnInQuery</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.266">hasNullColumnInQuery</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>whether there is an null column in the query</dd></dl>
 </li>
 </ul>
@@ -765,7 +780,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>match</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.282">match</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.283">match</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">Determines if the caller should do one of several things:
  - seek/skip to the next row (MatchCode.SEEK_NEXT_ROW)
@@ -786,7 +801,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>checkPartialDropDeleteRange</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.481">checkPartialDropDeleteRange</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;curCell)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.482">checkPartialDropDeleteRange</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;curCell)</pre>
 <div class="block">Handle partial-drop-deletes. As we match keys in order, when we have a range from which
  we can drop deletes, we can set retainDeletesInOutput to false for the duration of this
  range only, and maintain consistency.</div>
@@ -798,7 +813,9 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>moreRowsMayExistAfter</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.506">moreRowsMayExistAfter</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.511">moreRowsMayExistAfter</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv)</pre>
+<dl><dt><span class="strong">Returns:</span></dt><dd>Returns false if we know there are no more rows to be scanned (We've reached the
+ <code>stopRow</code> or we are scanning on row only because this Scan is for a Get, etc.</dd></dl>
 </li>
 </ul>
 <a name="setToNewRow(org.apache.hadoop.hbase.Cell)">
@@ -807,7 +824,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setToNewRow</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.528">setToNewRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;curCell)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.534">setToNewRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;curCell)</pre>
 <div class="block">Set the row when there is change in row</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>curCell</code> - </dd></dl>
 </li>
@@ -818,7 +835,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>reset</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.534">reset</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.540">reset</a>()</pre>
 </li>
 </ul>
 <a name="getStartKey()">
@@ -827,7 +844,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getStartKey</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.545">getStartKey</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.551">getStartKey</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>the start key</dd></dl>
 </li>
 </ul>
@@ -837,7 +854,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getFilter</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.553">getFilter</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.559">getFilter</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>the Filter</dd></dl>
 </li>
 </ul>
@@ -847,7 +864,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getNextKeyHint</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.557">getNextKeyHint</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.563">getNextKeyHint</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>
 <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>
@@ -859,7 +876,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getKeyForNextColumn</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.565">getKeyForNextColumn</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.571">getKeyForNextColumn</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv)</pre>
 </li>
 </ul>
 <a name="getKeyForNextRow(org.apache.hadoop.hbase.Cell)">
@@ -868,7 +885,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getKeyForNextRow</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.575">getKeyForNextRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.581">getKeyForNextRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)</pre>
 </li>
 </ul>
 <a name="compareKeyForNextRow(org.apache.hadoop.hbase.Cell, org.apache.hadoop.hbase.Cell)">
@@ -877,7 +894,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>compareKeyForNextRow</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.584">compareKeyForNextRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;nextIndexed,
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.590">compareKeyForNextRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;nextIndexed,
                        <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv)</pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>nextIndexed</code> - the key of the next entry in the block index (if any)</dd><dd><code>kv</code> - The Cell we're using to calculate the seek key</dd>
 <dt><span class="strong">Returns:</span></dt><dd>result of the compare between the indexed key and the key portion of the passed cell</dd></dl>
@@ -889,7 +906,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>compareKeyForNextColumn</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.594">compareKeyForNextColumn</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;nextIndexed,
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.600">compareKeyForNextColumn</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;nextIndexed,
                           <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>nextIndexed</code> - the key of the next entry in the block index (if any)</dd><dd><code>currentCell</code> - The Cell we're using to calculate the seek key</dd>
 <dt><span class="strong">Returns:</span></dt><dd>result of the compare between the indexed key and the key portion of the passed cell</dd></dl>
@@ -901,7 +918,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>checkColumn</h4>
-<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.608">checkColumn</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ColumnTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">ColumnTracker</a>&nbsp;columnTracker,
+<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#line.614">checkColumn</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ColumnTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">ColumnTracker</a>&nbsp;columnTracker,
                                      byte[]&nbsp;bytes,
                                      int&nbsp;offset,
                                      int&nbsp;length,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html b/devapidocs/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html
index 14774f0..28b51ee 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/StoreFileScanner.html
@@ -1069,8 +1069,9 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#getNextIndexedKey()">getNextIndexedKey</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a></code></dd>
-<dt><span class="strong">Returns:</span></dt><dd>the next key in the index (the key to seek to the next block)
- if known, or null otherwise</dd></dl>
+<dt><span class="strong">Returns:</span></dt><dd>the next key in the index, usually the first key of next block OR a key that falls
+ between last key of current block and first key of next block..
+ see HFileWriterImpl#getMidpoint, or null if not known.</dd></dl>
 </li>
 </ul>
 <a name="shipped()">


[10/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/regionserver/class-use/TestTimestampFilterSeekHint.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/class-use/TestTimestampFilterSeekHint.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/class-use/TestTimestampFilterSeekHint.html
new file mode 100644
index 0000000..5ea8d1c
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/class-use/TestTimestampFilterSeekHint.html
@@ -0,0 +1,115 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Uses of Class org.apache.hadoop.hbase.regionserver.TestTimestampFilterSeekHint (Apache HBase 2.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<script type="text/javascript"><!--
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Class org.apache.hadoop.hbase.regionserver.TestTimestampFilterSeekHint (Apache HBase 2.0.0-SNAPSHOT Test API)";
+    }
+//-->
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar_top">
+<!--   -->
+</a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/regionserver/class-use/TestTimestampFilterSeekHint.html" target="_top">Frames</a></li>
+<li><a href="TestTimestampFilterSeekHint.html" target="_top">No Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../allclasses-noframe.html">All Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip-navbar_top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<div class="header">
+<h2 title="Uses of Class org.apache.hadoop.hbase.regionserver.TestTimestampFilterSeekHint" class="title">Uses of Class<br>org.apache.hadoop.hbase.regionserver.TestTimestampFilterSeekHint</h2>
+</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.regionserver.TestTimestampFilterSeekHint</div>
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar_bottom">
+<!--   -->
+</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/regionserver/class-use/TestTimestampFilterSeekHint.html" target="_top">Frames</a></li>
+<li><a href="TestTimestampFilterSeekHint.html" target="_top">No Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../allclasses-noframe.html">All Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip-navbar_bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2016 <a href="http://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-frame.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-frame.html
index c9cf55d..c4d46e2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-frame.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-frame.html
@@ -190,6 +190,7 @@
 <li><a href="TestStoreFileRefresherChore.StaleStorefileRefresherChore.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestStoreFileRefresherChore.StaleStorefileRefresherChore</a></li>
 <li><a href="TestStoreFileScannerWithTagCompression.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestStoreFileScannerWithTagCompression</a></li>
 <li><a href="TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestStoreScanner</a></li>
+<li><a href="TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestStoreScanner.CellGridStoreScanner</a></li>
 <li><a href="TestStripeCompactor.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestStripeCompactor</a></li>
 <li><a href="TestStripeCompactor.Scanner.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestStripeCompactor.Scanner</a></li>
 <li><a href="TestStripeCompactor.StoreFileWritersCapture.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestStripeCompactor.StoreFileWritersCapture</a></li>
@@ -200,6 +201,7 @@
 <li><a href="TestTags.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestTags</a></li>
 <li><a href="TestTags.TestCoprocessorForTags.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestTags.TestCoprocessorForTags</a></li>
 <li><a href="TestTimeRangeTracker.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestTimeRangeTracker</a></li>
+<li><a href="TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestTimestampFilterSeekHint</a></li>
 <li><a href="TestWALLockup.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestWALLockup</a></li>
 <li><a href="TestWideScanner.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestWideScanner</a></li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-summary.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-summary.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-summary.html
index c9adcdf..d395f03 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-summary.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-summary.html
@@ -998,47 +998,57 @@
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner.CellGridStoreScanner</a></td>
+<td class="colLast">
+<div class="block">A StoreScanner for our CELL_GRID above.</div>
+</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStripeCompactor.html" title="class in org.apache.hadoop.hbase.regionserver">TestStripeCompactor</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStripeCompactor.Scanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStripeCompactor.Scanner</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStripeCompactor.StoreFileWritersCapture.html" title="class in org.apache.hadoop.hbase.regionserver">TestStripeCompactor.StoreFileWritersCapture</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStripeCompactor.StoreFileWritersCapture.Writer.html" title="class in org.apache.hadoop.hbase.regionserver">TestStripeCompactor.StoreFileWritersCapture.Writer</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStripeStoreEngine.html" title="class in org.apache.hadoop.hbase.regionserver">TestStripeStoreEngine</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStripeStoreEngine.TestStoreEngine.html" title="class in org.apache.hadoop.hbase.regionserver">TestStripeStoreEngine.TestStoreEngine</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStripeStoreFileManager.html" title="class in org.apache.hadoop.hbase.regionserver">TestStripeStoreFileManager</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTags.html" title="class in org.apache.hadoop.hbase.regionserver">TestTags</a></td>
 <td class="colLast">
 <div class="block">Class that test tags</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html" title="class in org.apache.hadoop.hbase.regionserver">TestTags.TestCoprocessorForTags</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimeRangeTracker.html" title="class in org.apache.hadoop.hbase.regionserver">TestTimeRangeTracker</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">TestTimestampFilterSeekHint</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
 <tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALLockup.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALLockup</a></td>
 <td class="colLast">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 7036c7f..cd6fab5 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -276,6 +276,11 @@
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.HeartbeatKVHeap.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">TestScannerHeartbeatMessages.HeartbeatKVHeap</span></a></li>
 </ul>
 </li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.StoreScanner (implements org.apache.hadoop.hbase.regionserver.ChangedReadersObserver, org.apache.hadoop.hbase.regionserver.InternalScanner, org.apache.hadoop.hbase.regionserver.KeyValueScanner)
+<ul>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">TestStoreScanner.CellGridStoreScanner</span></a></li>
+</ul>
+</li>
 </ul>
 </li>
 </ul>
@@ -491,6 +496,7 @@
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStripeStoreFileManager.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">TestStripeStoreFileManager</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTags.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">TestTags</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimeRangeTracker.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">TestTimeRangeTracker</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">TestTimestampFilterSeekHint</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALLockup.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">TestWALLockup</span></a></li>
 <li type="circle">java.lang.<a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang"><span class="strong">Thread</span></a> (implements java.lang.<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>)
 <ul>
@@ -559,8 +565,8 @@
 <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/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">TestAtomicOperation.TestStep</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">DataBlockEncodingTool.Manipulation</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">DataBlockEncodingTool.Manipulation</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
index d8c6247..a28606a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -235,8 +235,8 @@
 <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.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="strong">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="strong">IntegrationTestLoadAndVerify.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="strong">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="strong">IntegrationTestLoadAndVerify.Counters</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index 00e1e51..deb76c7 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -130,9 +130,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/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="strong">FaultyFSLog.FailureType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="strong">IOTestProvider.AllowedOperations</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/TestWALSplit.Corruptions.html" title="enum in org.apache.hadoop.hbase.wal"><span class="strong">TestWALSplit.Corruptions</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="strong">FaultyFSLog.FailureType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestRecoverableZooKeeper.ZookeeperStub.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestRecoverableZooKeeper.ZookeeperStub.html b/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestRecoverableZooKeeper.ZookeeperStub.html
index c26691b..e9e8729 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestRecoverableZooKeeper.ZookeeperStub.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/zookeeper/TestRecoverableZooKeeper.ZookeeperStub.html
@@ -204,7 +204,7 @@ extends org.apache.zookeeper.ZooKeeper</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.zookeeper.ZooKeeper</h3>
-<code>addAuthInfo, close, create, create, delete, delete, exists, exists, exists, exists, getACL, getACL, getChildren, getChildren, getChildren, getChildren, getChildren, getChildren, getChildren, getChildren, getData, getData, getData, getData, getSaslClient, getSessionId, getSessionPasswd, getSessionTimeout, getState, multi, multiInternal, register, setACL, setACL, setData, sync, testableLocalSocketAddress, testableRemoteSocketAddress, testableWaitForShutdown, toString, transaction</code></li>
+<code>addAuthInfo, close, create, create, delete, delete, exists, exists, exists, exists, getACL, getACL, getChildren, getChildren, getChildren, getChildren, getChildren, getChildren, getChildren, getChildren, getData, getData, getData, getData, getSaslClient, getSessionId, getSessionPasswd, getSessionTimeout, getState, multi, multi, multiInternal, multiInternal, register, setACL, setACL, setData, sync, testableLocalSocketAddress, testableRemoteSocketAddress, testableWaitForShutdown, toString, transaction</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/f30982bd/testdevapidocs/overview-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/overview-tree.html b/testdevapidocs/overview-tree.html
index aaeeb80..dc47edb 100644
--- a/testdevapidocs/overview-tree.html
+++ b/testdevapidocs/overview-tree.html
@@ -1337,6 +1337,11 @@
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.HeartbeatKVHeap.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">TestScannerHeartbeatMessages.HeartbeatKVHeap</span></a></li>
 </ul>
 </li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.StoreScanner (implements org.apache.hadoop.hbase.regionserver.ChangedReadersObserver, org.apache.hadoop.hbase.regionserver.InternalScanner, org.apache.hadoop.hbase.regionserver.KeyValueScanner)
+<ul>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">TestStoreScanner.CellGridStoreScanner</span></a></li>
+</ul>
+</li>
 </ul>
 </li>
 </ul>
@@ -2759,6 +2764,7 @@
 <li type="circle">org.apache.hadoop.hbase.codec.prefixtree.timestamp.data.<a href="org/apache/hadoop/hbase/codec/prefixtree/timestamp/data/TestTimestampDataNumbers.html" title="class in org.apache.hadoop.hbase.codec.prefixtree.timestamp.data"><span class="strong">TestTimestampDataNumbers</span></a> (implements org.apache.hadoop.hbase.codec.prefixtree.timestamp.<a href="org/apache/hadoop/hbase/codec/prefixtree/timestamp/TestTimestampData.html" title="interface in org.apache.hadoop.hbase.codec.prefixtree.timestamp">TestTimestampData</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.codec.prefixtree.timestamp.data.<a href="org/apache/hadoop/hbase/codec/prefixtree/timestamp/data/TestTimestampDataRepeats.html" title="class in org.apache.hadoop.hbase.codec.prefixtree.timestamp.data"><span class="strong">TestTimestampDataRepeats</span></a> (implements org.apache.hadoop.hbase.codec.prefixtree.timestamp.<a href="org/apache/hadoop/hbase/codec/prefixtree/timestamp/TestTimestampData.html" title="interface in org.apache.hadoop.hbase.codec.prefixtree.timestamp">TestTimestampData</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.codec.prefixtree.timestamp.<a href="org/apache/hadoop/hbase/codec/prefixtree/timestamp/TestTimestampEncoder.html" title="class in org.apache.hadoop.hbase.codec.prefixtree.timestamp"><span class="strong">TestTimestampEncoder</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">TestTimestampFilterSeekHint</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestTimestampsFilter.html" title="class in org.apache.hadoop.hbase.client"><span class="strong">TestTimestampsFilter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.token.<a href="org/apache/hadoop/hbase/security/token/TestTokenAuthentication.html" title="class in org.apache.hadoop.hbase.security.token"><span class="strong">TestTokenAuthentication</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.codec.prefixtree.builder.<a href="org/apache/hadoop/hbase/codec/prefixtree/builder/TestTokenizer.html" title="class in org.apache.hadoop.hbase.codec.prefixtree.builder"><span class="strong">TestTokenizer</span></a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFile.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFile.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFile.html
index a1a7692..ffd3785 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFile.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/io/hfile/TestHFile.html
@@ -405,155 +405,175 @@
 <span class="sourceLineNo">397</span>  /**<a name="line.397"></a>
 <span class="sourceLineNo">398</span>   * Make sure the ordinals for our compression algorithms do not change on us.<a name="line.398"></a>
 <span class="sourceLineNo">399</span>   */<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  public void testCompressionOrdinance() {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    assertTrue(Compression.Algorithm.LZO.ordinal() == 0);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    assertTrue(Compression.Algorithm.GZ.ordinal() == 1);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    assertTrue(Compression.Algorithm.NONE.ordinal() == 2);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    assertTrue(Compression.Algorithm.SNAPPY.ordinal() == 3);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    assertTrue(Compression.Algorithm.LZ4.ordinal() == 4);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  }<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>  @Test<a name="line.408"></a>
-<span class="sourceLineNo">409</span>  public void testGetShortMidpoint() {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    Cell left = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    Cell right = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    Cell mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt;= 0);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt;= 0);<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>    left = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    right = CellUtil.createCell(Bytes.toBytes("b"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt;= 0);<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>    left = CellUtil.createCell(Bytes.toBytes("g"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    right = CellUtil.createCell(Bytes.toBytes("i"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt;= 0);<a name="line.426"></a>
+<span class="sourceLineNo">400</span>  @Test<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  public void testCompressionOrdinance() {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    assertTrue(Compression.Algorithm.LZO.ordinal() == 0);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    assertTrue(Compression.Algorithm.GZ.ordinal() == 1);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    assertTrue(Compression.Algorithm.NONE.ordinal() == 2);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    assertTrue(Compression.Algorithm.SNAPPY.ordinal() == 3);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    assertTrue(Compression.Algorithm.LZ4.ordinal() == 4);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  @Test<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  public void testShortMidpointSameQual() {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    Cell left = CellUtil.createCell(Bytes.toBytes("a"),<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        Bytes.toBytes("a"),<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        Bytes.toBytes("a"),<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        9,<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        KeyValue.Type.Maximum.getCode(),<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        HConstants.EMPTY_BYTE_ARRAY);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    Cell right = CellUtil.createCell(Bytes.toBytes("a"),<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        Bytes.toBytes("a"),<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        Bytes.toBytes("a"),<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        11,<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        KeyValue.Type.Maximum.getCode(),<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        HConstants.EMPTY_BYTE_ARRAY);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    Cell mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt;= 0);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) == 0);<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>    left = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    right = CellUtil.createCell(Bytes.toBytes("bbbbbbb"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt; 0);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    assertEquals(1, (int) mid.getRowLength());<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>    left = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    right = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("b"), Bytes.toBytes("a"));<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt;= 0);<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>    left = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    right = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("aaaaaaaa"), Bytes.toBytes("b"));<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt; 0);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    assertEquals(2, (int) mid.getFamilyLength());<a name="line.446"></a>
+<span class="sourceLineNo">428</span>  @Test<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  public void testGetShortMidpoint() {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    Cell left = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    Cell right = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    Cell mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt;= 0);<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt;= 0);<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>    left = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    right = CellUtil.createCell(Bytes.toBytes("b"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt;= 0);<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    left = CellUtil.createCell(Bytes.toBytes("g"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    right = CellUtil.createCell(Bytes.toBytes("i"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt;= 0);<a name="line.446"></a>
 <span class="sourceLineNo">447</span><a name="line.447"></a>
 <span class="sourceLineNo">448</span>    left = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    right = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("a"), Bytes.toBytes("aaaaaaaaa"));<a name="line.449"></a>
+<span class="sourceLineNo">449</span>    right = CellUtil.createCell(Bytes.toBytes("bbbbbbb"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.449"></a>
 <span class="sourceLineNo">450</span>    mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);<a name="line.450"></a>
 <span class="sourceLineNo">451</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);<a name="line.451"></a>
 <span class="sourceLineNo">452</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt; 0);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    assertEquals(2, (int) mid.getQualifierLength());<a name="line.453"></a>
+<span class="sourceLineNo">453</span>    assertEquals(1, (int) mid.getRowLength());<a name="line.453"></a>
 <span class="sourceLineNo">454</span><a name="line.454"></a>
 <span class="sourceLineNo">455</span>    left = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    right = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("a"), Bytes.toBytes("b"));<a name="line.456"></a>
+<span class="sourceLineNo">456</span>    right = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("b"), Bytes.toBytes("a"));<a name="line.456"></a>
 <span class="sourceLineNo">457</span>    mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);<a name="line.457"></a>
 <span class="sourceLineNo">458</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);<a name="line.458"></a>
 <span class="sourceLineNo">459</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt;= 0);<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    assertEquals(1, (int) mid.getQualifierLength());<a name="line.460"></a>
-<span class="sourceLineNo">461</span><a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // Assert that if meta comparator, it returns the right cell -- i.e. no<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    // optimization done.<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    left = CellUtil.createCell(Bytes.toBytes("g"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    right = CellUtil.createCell(Bytes.toBytes("i"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    mid = HFileWriterImpl.getMidpoint(CellComparator.META_COMPARATOR, left, right);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    assertTrue(CellComparator.META_COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    assertTrue(CellComparator.META_COMPARATOR.compareKeyIgnoresMvcc(mid, right) == 0);<a name="line.468"></a>
-<span class="sourceLineNo">469</span><a name="line.469"></a>
-<span class="sourceLineNo">470</span>    /**<a name="line.470"></a>
-<span class="sourceLineNo">471</span>     * See HBASE-7845<a name="line.471"></a>
-<span class="sourceLineNo">472</span>     */<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>    byte[] family = Bytes.toBytes("family");<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    byte[] qualA = Bytes.toBytes("qfA");<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    byte[] qualB = Bytes.toBytes("qfB");<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    final CellComparator keyComparator = CellComparator.COMPARATOR;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    // verify that faked shorter rowkey could be generated<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    long ts = 5;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    KeyValue kv1 = new KeyValue(Bytes.toBytes("the quick brown fox"), family, qualA, ts, Type.Put);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    KeyValue kv2 = new KeyValue(Bytes.toBytes("the who test text"), family, qualA, ts, Type.Put);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    Cell newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    assertTrue((keyComparator.compare(kv2, newKey)) &gt; 0);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    byte[] expectedArray = Bytes.toBytes("the r");<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    Bytes.equals(newKey.getRowArray(), newKey.getRowOffset(), newKey.getRowLength(), expectedArray,<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        0, expectedArray.length);<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    // verify: same with "row + family + qualifier", return rightKey directly<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    kv1 = new KeyValue(Bytes.toBytes("ilovehbase"), family, qualA, 5, Type.Put);<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    kv2 = new KeyValue(Bytes.toBytes("ilovehbase"), family, qualA, 0, Type.Put);<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    assertTrue(keyComparator.compare(kv1, kv2) &lt; 0);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    assertTrue((keyComparator.compare(kv2, newKey)) == 0);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    kv1 = new KeyValue(Bytes.toBytes("ilovehbase"), family, qualA, -5, Type.Put);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    kv2 = new KeyValue(Bytes.toBytes("ilovehbase"), family, qualA, -10, Type.Put);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    assertTrue(keyComparator.compare(kv1, kv2) &lt; 0);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    assertTrue((keyComparator.compare(kv2, newKey)) == 0);<a name="line.503"></a>
-<span class="sourceLineNo">504</span><a name="line.504"></a>
-<span class="sourceLineNo">505</span>    // verify: same with row, different with qualifier<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    kv1 = new KeyValue(Bytes.toBytes("ilovehbase"), family, qualA, 5, Type.Put);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    kv2 = new KeyValue(Bytes.toBytes("ilovehbase"), family, qualB, 5, Type.Put);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    assertTrue(keyComparator.compare(kv1, kv2) &lt; 0);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    assertTrue((keyComparator.compare(kv2, newKey)) &gt; 0);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    assertTrue(Arrays.equals(CellUtil.cloneFamily(newKey), family));<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    assertTrue(Arrays.equals(CellUtil.cloneQualifier(newKey), qualB));<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    assertTrue(newKey.getTimestamp() == HConstants.LATEST_TIMESTAMP);<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    assertTrue(newKey.getTypeByte() == Type.Maximum.getCode());<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    // verify metaKeyComparator's getShortMidpointKey output<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    final CellComparator metaKeyComparator = CellComparator.META_COMPARATOR;<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    kv1 = new KeyValue(Bytes.toBytes("ilovehbase123"), family, qualA, 5, Type.Put);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    kv2 = new KeyValue(Bytes.toBytes("ilovehbase234"), family, qualA, 0, Type.Put);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    newKey = HFileWriterImpl.getMidpoint(metaKeyComparator, kv1, kv2);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    assertTrue(metaKeyComparator.compare(kv1, newKey) &lt; 0);<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    assertTrue((metaKeyComparator.compare(kv2, newKey) == 0));<a name="line.523"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>    left = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    right = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("aaaaaaaa"), Bytes.toBytes("b"));<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt; 0);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    assertEquals(2, (int) mid.getFamilyLength());<a name="line.466"></a>
+<span class="sourceLineNo">467</span><a name="line.467"></a>
+<span class="sourceLineNo">468</span>    left = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    right = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("a"), Bytes.toBytes("aaaaaaaaa"));<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt; 0);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    assertEquals(2, (int) mid.getQualifierLength());<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    left = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    right = CellUtil.createCell(Bytes.toBytes("a"), Bytes.toBytes("a"), Bytes.toBytes("b"));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt;= 0);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    assertEquals(1, (int) mid.getQualifierLength());<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>    // Assert that if meta comparator, it returns the right cell -- i.e. no<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    // optimization done.<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    left = CellUtil.createCell(Bytes.toBytes("g"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    right = CellUtil.createCell(Bytes.toBytes("i"), Bytes.toBytes("a"), Bytes.toBytes("a"));<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    mid = HFileWriterImpl.getMidpoint(CellComparator.META_COMPARATOR, left, right);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    assertTrue(CellComparator.META_COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    assertTrue(CellComparator.META_COMPARATOR.compareKeyIgnoresMvcc(mid, right) == 0);<a name="line.488"></a>
+<span class="sourceLineNo">489</span><a name="line.489"></a>
+<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
+<span class="sourceLineNo">491</span>     * See HBASE-7845<a name="line.491"></a>
+<span class="sourceLineNo">492</span>     */<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.494"></a>
+<span class="sourceLineNo">495</span><a name="line.495"></a>
+<span class="sourceLineNo">496</span>    byte[] family = Bytes.toBytes("family");<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    byte[] qualA = Bytes.toBytes("qfA");<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    byte[] qualB = Bytes.toBytes("qfB");<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    final CellComparator keyComparator = CellComparator.COMPARATOR;<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    // verify that faked shorter rowkey could be generated<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    long ts = 5;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    KeyValue kv1 = new KeyValue(Bytes.toBytes("the quick brown fox"), family, qualA, ts, Type.Put);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    KeyValue kv2 = new KeyValue(Bytes.toBytes("the who test text"), family, qualA, ts, Type.Put);<a name="line.503"></a>
+<span class="sourceLineNo">504</span>    Cell newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    assertTrue((keyComparator.compare(kv2, newKey)) &gt; 0);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    byte[] expectedArray = Bytes.toBytes("the r");<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    Bytes.equals(newKey.getRowArray(), newKey.getRowOffset(), newKey.getRowLength(), expectedArray,<a name="line.508"></a>
+<span class="sourceLineNo">509</span>        0, expectedArray.length);<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>    // verify: same with "row + family + qualifier", return rightKey directly<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    kv1 = new KeyValue(Bytes.toBytes("ilovehbase"), family, qualA, 5, Type.Put);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    kv2 = new KeyValue(Bytes.toBytes("ilovehbase"), family, qualA, 0, Type.Put);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    assertTrue(keyComparator.compare(kv1, kv2) &lt; 0);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    assertTrue((keyComparator.compare(kv2, newKey)) == 0);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    kv1 = new KeyValue(Bytes.toBytes("ilovehbase"), family, qualA, -5, Type.Put);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    kv2 = new KeyValue(Bytes.toBytes("ilovehbase"), family, qualA, -10, Type.Put);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    assertTrue(keyComparator.compare(kv1, kv2) &lt; 0);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    assertTrue((keyComparator.compare(kv2, newKey)) == 0);<a name="line.523"></a>
 <span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    // verify common fix scenario<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    kv1 = new KeyValue(Bytes.toBytes("ilovehbase"), family, qualA, ts, Type.Put);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    kv2 = new KeyValue(Bytes.toBytes("ilovehbaseandhdfs"), family, qualA, ts, Type.Put);<a name="line.527"></a>
+<span class="sourceLineNo">525</span>    // verify: same with row, different with qualifier<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    kv1 = new KeyValue(Bytes.toBytes("ilovehbase"), family, qualA, 5, Type.Put);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    kv2 = new KeyValue(Bytes.toBytes("ilovehbase"), family, qualB, 5, Type.Put);<a name="line.527"></a>
 <span class="sourceLineNo">528</span>    assertTrue(keyComparator.compare(kv1, kv2) &lt; 0);<a name="line.528"></a>
 <span class="sourceLineNo">529</span>    newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);<a name="line.529"></a>
 <span class="sourceLineNo">530</span>    assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);<a name="line.530"></a>
 <span class="sourceLineNo">531</span>    assertTrue((keyComparator.compare(kv2, newKey)) &gt; 0);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    expectedArray = Bytes.toBytes("ilovehbasea");<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    Bytes.equals(newKey.getRowArray(), newKey.getRowOffset(), newKey.getRowLength(), expectedArray,<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        0, expectedArray.length);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    // verify only 1 offset scenario<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    kv1 = new KeyValue(Bytes.toBytes("100abcdefg"), family, qualA, ts, Type.Put);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    kv2 = new KeyValue(Bytes.toBytes("101abcdefg"), family, qualA, ts, Type.Put);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    assertTrue(keyComparator.compare(kv1, kv2) &lt; 0);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    assertTrue((keyComparator.compare(kv2, newKey)) &gt; 0);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    expectedArray = Bytes.toBytes("101");<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    Bytes.equals(newKey.getRowArray(), newKey.getRowOffset(), newKey.getRowLength(), expectedArray,<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        0, expectedArray.length);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>  }<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>}<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">532</span>    assertTrue(Arrays.equals(CellUtil.cloneFamily(newKey), family));<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    assertTrue(Arrays.equals(CellUtil.cloneQualifier(newKey), qualB));<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    assertTrue(newKey.getTimestamp() == HConstants.LATEST_TIMESTAMP);<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    assertTrue(newKey.getTypeByte() == Type.Maximum.getCode());<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>    // verify metaKeyComparator's getShortMidpointKey output<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    final CellComparator metaKeyComparator = CellComparator.META_COMPARATOR;<a name="line.538"></a>
+<span class="sourceLineNo">539</span>    kv1 = new KeyValue(Bytes.toBytes("ilovehbase123"), family, qualA, 5, Type.Put);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>    kv2 = new KeyValue(Bytes.toBytes("ilovehbase234"), family, qualA, 0, Type.Put);<a name="line.540"></a>
+<span class="sourceLineNo">541</span>    newKey = HFileWriterImpl.getMidpoint(metaKeyComparator, kv1, kv2);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    assertTrue(metaKeyComparator.compare(kv1, newKey) &lt; 0);<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    assertTrue((metaKeyComparator.compare(kv2, newKey) == 0));<a name="line.543"></a>
+<span class="sourceLineNo">544</span><a name="line.544"></a>
+<span class="sourceLineNo">545</span>    // verify common fix scenario<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    kv1 = new KeyValue(Bytes.toBytes("ilovehbase"), family, qualA, ts, Type.Put);<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    kv2 = new KeyValue(Bytes.toBytes("ilovehbaseandhdfs"), family, qualA, ts, Type.Put);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    assertTrue(keyComparator.compare(kv1, kv2) &lt; 0);<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    assertTrue((keyComparator.compare(kv2, newKey)) &gt; 0);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    expectedArray = Bytes.toBytes("ilovehbasea");<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    Bytes.equals(newKey.getRowArray(), newKey.getRowOffset(), newKey.getRowLength(), expectedArray,<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        0, expectedArray.length);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    // verify only 1 offset scenario<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    kv1 = new KeyValue(Bytes.toBytes("100abcdefg"), family, qualA, ts, Type.Put);<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    kv2 = new KeyValue(Bytes.toBytes("101abcdefg"), family, qualA, ts, Type.Put);<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    assertTrue(keyComparator.compare(kv1, kv2) &lt; 0);<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    assertTrue((keyComparator.compare(kv2, newKey)) &gt; 0);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>    expectedArray = Bytes.toBytes("101");<a name="line.562"></a>
+<span class="sourceLineNo">563</span>    Bytes.equals(newKey.getRowArray(), newKey.getRowOffset(), newKey.getRowLength(), expectedArray,<a name="line.563"></a>
+<span class="sourceLineNo">564</span>        0, expectedArray.length);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>  }<a name="line.565"></a>
+<span class="sourceLineNo">566</span><a name="line.566"></a>
+<span class="sourceLineNo">567</span>}<a name="line.567"></a>
+<span class="sourceLineNo">568</span><a name="line.568"></a>
 
 
 


[27/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html b/devapidocs/src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html
index 37f1302..a5616d0 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html
@@ -31,163 +31,214 @@
 <span class="sourceLineNo">023</span>import java.util.TreeSet;<a name="line.23"></a>
 <span class="sourceLineNo">024</span><a name="line.24"></a>
 <span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.Cell;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.classification.InterfaceStability;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.exceptions.DeserializationException;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.protobuf.generated.FilterProtos;<a name="line.29"></a>
-<span class="sourceLineNo">030</span><a name="line.30"></a>
-<span class="sourceLineNo">031</span>import com.google.common.base.Preconditions;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import com.google.protobuf.InvalidProtocolBufferException;<a name="line.32"></a>
-<span class="sourceLineNo">033</span><a name="line.33"></a>
-<span class="sourceLineNo">034</span>/**<a name="line.34"></a>
-<span class="sourceLineNo">035</span> * Filter that returns only cells whose timestamp (version) is<a name="line.35"></a>
-<span class="sourceLineNo">036</span> * in the specified list of timestamps (versions).<a name="line.36"></a>
-<span class="sourceLineNo">037</span> * &lt;p&gt;<a name="line.37"></a>
-<span class="sourceLineNo">038</span> * Note: Use of this filter overrides any time range/time stamp<a name="line.38"></a>
-<span class="sourceLineNo">039</span> * options specified using {@link org.apache.hadoop.hbase.client.Get#setTimeRange(long, long)},<a name="line.39"></a>
-<span class="sourceLineNo">040</span> * {@link org.apache.hadoop.hbase.client.Scan#setTimeRange(long, long)}, {@link org.apache.hadoop.hbase.client.Get#setTimeStamp(long)},<a name="line.40"></a>
-<span class="sourceLineNo">041</span> * or {@link org.apache.hadoop.hbase.client.Scan#setTimeStamp(long)}.<a name="line.41"></a>
-<span class="sourceLineNo">042</span> */<a name="line.42"></a>
-<span class="sourceLineNo">043</span>@InterfaceAudience.Public<a name="line.43"></a>
-<span class="sourceLineNo">044</span>@InterfaceStability.Stable<a name="line.44"></a>
-<span class="sourceLineNo">045</span>public class TimestampsFilter extends FilterBase {<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>  TreeSet&lt;Long&gt; timestamps;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>  private static final int MAX_LOG_TIMESTAMPS = 5;<a name="line.48"></a>
-<span class="sourceLineNo">049</span><a name="line.49"></a>
-<span class="sourceLineNo">050</span>  // Used during scans to hint the scan to stop early<a name="line.50"></a>
-<span class="sourceLineNo">051</span>  // once the timestamps fall below the minTimeStamp.<a name="line.51"></a>
-<span class="sourceLineNo">052</span>  long minTimeStamp = Long.MAX_VALUE;<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  /**<a name="line.54"></a>
-<span class="sourceLineNo">055</span>   * Constructor for filter that retains only those<a name="line.55"></a>
-<span class="sourceLineNo">056</span>   * cells whose timestamp (version) is in the specified<a name="line.56"></a>
-<span class="sourceLineNo">057</span>   * list of timestamps.<a name="line.57"></a>
-<span class="sourceLineNo">058</span>   *<a name="line.58"></a>
-<span class="sourceLineNo">059</span>   * @param timestamps<a name="line.59"></a>
-<span class="sourceLineNo">060</span>   */<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  public TimestampsFilter(List&lt;Long&gt; timestamps) {<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    for (Long timestamp : timestamps) {<a name="line.62"></a>
-<span class="sourceLineNo">063</span>      Preconditions.checkArgument(timestamp &gt;= 0, "must be positive %s", timestamp);<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    }<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    this.timestamps = new TreeSet&lt;Long&gt;(timestamps);<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    init();<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>  /**<a name="line.69"></a>
-<span class="sourceLineNo">070</span>   * @return the list of timestamps<a name="line.70"></a>
-<span class="sourceLineNo">071</span>   */<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  public List&lt;Long&gt; getTimestamps() {<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    List&lt;Long&gt; list = new ArrayList&lt;Long&gt;(timestamps.size());<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    list.addAll(timestamps);<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    return list;<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>  private void init() {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    if (this.timestamps.size() &gt; 0) {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      minTimeStamp = this.timestamps.first();<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    }<a name="line.81"></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.classification.InterfaceAudience;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.classification.InterfaceStability;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.exceptions.DeserializationException;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.protobuf.generated.FilterProtos;<a name="line.30"></a>
+<span class="sourceLineNo">031</span><a name="line.31"></a>
+<span class="sourceLineNo">032</span>import com.google.common.base.Preconditions;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import com.google.protobuf.InvalidProtocolBufferException;<a name="line.33"></a>
+<span class="sourceLineNo">034</span><a name="line.34"></a>
+<span class="sourceLineNo">035</span>/**<a name="line.35"></a>
+<span class="sourceLineNo">036</span> * Filter that returns only cells whose timestamp (version) is<a name="line.36"></a>
+<span class="sourceLineNo">037</span> * in the specified list of timestamps (versions).<a name="line.37"></a>
+<span class="sourceLineNo">038</span> * &lt;p&gt;<a name="line.38"></a>
+<span class="sourceLineNo">039</span> * Note: Use of this filter overrides any time range/time stamp<a name="line.39"></a>
+<span class="sourceLineNo">040</span> * options specified using {@link org.apache.hadoop.hbase.client.Get#setTimeRange(long, long)},<a name="line.40"></a>
+<span class="sourceLineNo">041</span> * {@link org.apache.hadoop.hbase.client.Scan#setTimeRange(long, long)}, {@link org.apache.hadoop.hbase.client.Get#setTimeStamp(long)},<a name="line.41"></a>
+<span class="sourceLineNo">042</span> * or {@link org.apache.hadoop.hbase.client.Scan#setTimeStamp(long)}.<a name="line.42"></a>
+<span class="sourceLineNo">043</span> */<a name="line.43"></a>
+<span class="sourceLineNo">044</span>@InterfaceAudience.Public<a name="line.44"></a>
+<span class="sourceLineNo">045</span>@InterfaceStability.Stable<a name="line.45"></a>
+<span class="sourceLineNo">046</span>public class TimestampsFilter extends FilterBase {<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span>  private final boolean canHint;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>  TreeSet&lt;Long&gt; timestamps;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>  private static final int MAX_LOG_TIMESTAMPS = 5;<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span>  // Used during scans to hint the scan to stop early<a name="line.52"></a>
+<span class="sourceLineNo">053</span>  // once the timestamps fall below the minTimeStamp.<a name="line.53"></a>
+<span class="sourceLineNo">054</span>  long minTimeStamp = Long.MAX_VALUE;<a name="line.54"></a>
+<span class="sourceLineNo">055</span><a name="line.55"></a>
+<span class="sourceLineNo">056</span>  /**<a name="line.56"></a>
+<span class="sourceLineNo">057</span>   * Constructor for filter that retains only the specified timestamps in the list.<a name="line.57"></a>
+<span class="sourceLineNo">058</span>   * @param timestamps<a name="line.58"></a>
+<span class="sourceLineNo">059</span>   */<a name="line.59"></a>
+<span class="sourceLineNo">060</span>  public TimestampsFilter(List&lt;Long&gt; timestamps) {<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    this(timestamps, false);<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>  /**<a name="line.64"></a>
+<span class="sourceLineNo">065</span>   * Constructor for filter that retains only those<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * cells whose timestamp (version) is in the specified<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   * list of timestamps.<a name="line.67"></a>
+<span class="sourceLineNo">068</span>   *<a name="line.68"></a>
+<span class="sourceLineNo">069</span>   * @param timestamps list of timestamps that are wanted.<a name="line.69"></a>
+<span class="sourceLineNo">070</span>   * @param canHint should the filter provide a seek hint? This can skip<a name="line.70"></a>
+<span class="sourceLineNo">071</span>   *                past delete tombstones, so it should only be used when that<a name="line.71"></a>
+<span class="sourceLineNo">072</span>   *                is not an issue ( no deletes, or don't care if data<a name="line.72"></a>
+<span class="sourceLineNo">073</span>   *                becomes visible)<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  public TimestampsFilter(List&lt;Long&gt; timestamps, boolean canHint) {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    for (Long timestamp : timestamps) {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      Preconditions.checkArgument(timestamp &gt;= 0, "must be positive %s", timestamp);<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    }<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    this.canHint = canHint;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    this.timestamps = new TreeSet&lt;Long&gt;(timestamps);<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    init();<a name="line.81"></a>
 <span class="sourceLineNo">082</span>  }<a name="line.82"></a>
 <span class="sourceLineNo">083</span><a name="line.83"></a>
 <span class="sourceLineNo">084</span>  /**<a name="line.84"></a>
-<span class="sourceLineNo">085</span>   * Gets the minimum timestamp requested by filter.<a name="line.85"></a>
-<span class="sourceLineNo">086</span>   * @return  minimum timestamp requested by filter.<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   */<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  public long getMin() {<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    return minTimeStamp;<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">092</span>  @Override<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  public boolean filterRowKey(Cell cell) throws IOException {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    // Impl in FilterBase might do unnecessary copy for Off heap backed Cells.<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    return false;<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>  @Override<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  public ReturnCode filterKeyValue(Cell v) {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    if (this.timestamps.contains(v.getTimestamp())) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      return ReturnCode.INCLUDE;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    } else if (v.getTimestamp() &lt; minTimeStamp) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      // The remaining versions of this column are guaranteed<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      // to be lesser than all of the other values.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>      return ReturnCode.NEXT_COL;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    }<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    return ReturnCode.SKIP;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  public static Filter createFilterFromArguments(ArrayList&lt;byte []&gt; filterArguments) {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    ArrayList&lt;Long&gt; timestamps = new ArrayList&lt;Long&gt;();<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    for (int i = 0; i&lt;filterArguments.size(); i++) {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      long timestamp = ParseFilter.convertByteArrayToLong(filterArguments.get(i));<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      timestamps.add(timestamp);<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    }<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    return new TimestampsFilter(timestamps);<a name="line.116"></a>
-<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>  /**<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * @return The filter serialized using pb<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   */<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public byte [] toByteArray() {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    FilterProtos.TimestampsFilter.Builder builder =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      FilterProtos.TimestampsFilter.newBuilder();<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    builder.addAllTimestamps(this.timestamps);<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    return builder.build().toByteArray();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  }<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>   * @param pbBytes A pb serialized {@link TimestampsFilter} instance<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * @return An instance of {@link TimestampsFilter} made from &lt;code&gt;bytes&lt;/code&gt;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @throws DeserializationException<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * @see #toByteArray<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public static TimestampsFilter parseFrom(final byte [] pbBytes)<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  throws DeserializationException {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    FilterProtos.TimestampsFilter proto;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    try {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      proto = FilterProtos.TimestampsFilter.parseFrom(pbBytes);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    } catch (InvalidProtocolBufferException e) {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      throw new DeserializationException(e);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    return new TimestampsFilter(proto.getTimestampsList());<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>   * @param other<a name="line.147"></a>
-<span class="sourceLineNo">148</span>   * @return true if and only if the fields of the filter that are serialized<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   * are equal to the corresponding fields in other.  Used for testing.<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   */<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  boolean areSerializedFieldsEqual(Filter o) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    if (o == this) return true;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    if (!(o instanceof TimestampsFilter)) return false;<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    TimestampsFilter other = (TimestampsFilter)o;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    return this.getTimestamps().equals(other.getTimestamps());<a name="line.156"></a>
+<span class="sourceLineNo">085</span>   * @return the list of timestamps<a name="line.85"></a>
+<span class="sourceLineNo">086</span>   */<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  public List&lt;Long&gt; getTimestamps() {<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    List&lt;Long&gt; list = new ArrayList&lt;Long&gt;(timestamps.size());<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    list.addAll(timestamps);<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    return list;<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>  private void init() {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    if (this.timestamps.size() &gt; 0) {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      minTimeStamp = this.timestamps.first();<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>   * Gets the minimum timestamp requested by filter.<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   * @return  minimum timestamp requested by filter.<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   */<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  public long getMin() {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    return minTimeStamp;<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>  @Override<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public boolean filterRowKey(Cell cell) throws IOException {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    // Impl in FilterBase might do unnecessary copy for Off heap backed Cells.<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    return false;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  }<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>  @Override<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  public ReturnCode filterKeyValue(Cell v) {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    if (this.timestamps.contains(v.getTimestamp())) {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      return ReturnCode.INCLUDE;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    } else if (v.getTimestamp() &lt; minTimeStamp) {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      // The remaining versions of this column are guaranteed<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      // to be lesser than all of the other values.<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      return ReturnCode.NEXT_COL;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    }<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    return canHint ? ReturnCode.SEEK_NEXT_USING_HINT : ReturnCode.SKIP;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
+<span class="sourceLineNo">124</span><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>   * Pick the next cell that the scanner should seek to. Since this can skip any number of cells<a name="line.127"></a>
+<span class="sourceLineNo">128</span>   * any of which can be a delete this can resurect old data.<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   *<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   * The method will only be used if canHint was set to true while creating the filter.<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   *<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * @throws IOException This will never happen.<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   */<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  public Cell getNextCellHint(Cell currentCell) throws IOException {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    if (!canHint) {<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      return null;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    }<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>    Long nextTimestampObject = timestamps.lower(currentCell.getTimestamp());<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>    if (nextTimestampObject == null) {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      // This should only happen if the current column's<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      // timestamp is below the last one in the list.<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      //<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      // It should never happen as the filterKeyValue should return NEXT_COL<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      // but it's always better to be extra safe and protect against future<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      // behavioral changes.<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return CellUtil.createLastOnRowCol(currentCell);<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>    // Since we know the nextTimestampObject isn't null here there must still be<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    // timestamps that can be included. Cast the Long to a long and return the<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    // a cell with the current row/cf/col and the next found timestamp.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    long nextTimestamp = nextTimestampObject;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    return CellUtil.createFirstOnRowColTS(currentCell, nextTimestamp);<a name="line.156"></a>
 <span class="sourceLineNo">157</span>  }<a name="line.157"></a>
 <span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  @Override<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  public String toString() {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    return toString(MAX_LOG_TIMESTAMPS);<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>  protected String toString(int maxTimestamps) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    StringBuilder tsList = new StringBuilder();<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>    int count = 0;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    for (Long ts : this.timestamps) {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      if (count &gt;= maxTimestamps) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        break;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      }<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      ++count;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      tsList.append(ts.toString());<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      if (count &lt; this.timestamps.size() &amp;&amp; count &lt; maxTimestamps) {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>        tsList.append(", ");<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">159</span>  public static Filter createFilterFromArguments(ArrayList&lt;byte []&gt; filterArguments) {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    ArrayList&lt;Long&gt; timestamps = new ArrayList&lt;Long&gt;();<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    for (int i = 0; i&lt;filterArguments.size(); i++) {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      long timestamp = ParseFilter.convertByteArrayToLong(filterArguments.get(i));<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      timestamps.add(timestamp);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    return new TimestampsFilter(timestamps);<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>  /**<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * @return The filter serialized using pb<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  public byte[] toByteArray() {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    FilterProtos.TimestampsFilter.Builder builder =<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        FilterProtos.TimestampsFilter.newBuilder();<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    builder.addAllTimestamps(this.timestamps);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    builder.setCanHint(canHint);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    return builder.build().toByteArray();<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
 <span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    return String.format("%s (%d/%d): [%s]", this.getClass().getSimpleName(),<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        count, this.timestamps.size(), tsList.toString());<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">179</span>  /**<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param pbBytes A pb serialized {@link TimestampsFilter} instance<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   *<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @return An instance of {@link TimestampsFilter} made from &lt;code&gt;bytes&lt;/code&gt;<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @see #toByteArray<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   */<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  public static TimestampsFilter parseFrom(final byte[] pbBytes)<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      throws DeserializationException {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    FilterProtos.TimestampsFilter proto;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    try {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      proto = FilterProtos.TimestampsFilter.parseFrom(pbBytes);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    } catch (InvalidProtocolBufferException e) {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      throw new DeserializationException(e);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    }<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    return new TimestampsFilter(proto.getTimestampsList(),<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        proto.hasCanHint() &amp;&amp; proto.getCanHint());<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>  /**<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * @param other<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * @return true if and only if the fields of the filter that are serialized<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * are equal to the corresponding fields in other.  Used for testing.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   */<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  boolean areSerializedFieldsEqual(Filter o) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    if (o == this) return true;<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    if (!(o instanceof TimestampsFilter)) return false;<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
+<span class="sourceLineNo">206</span>    TimestampsFilter other = (TimestampsFilter)o;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    return this.getTimestamps().equals(other.getTimestamps());<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  @Override<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public String toString() {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    return toString(MAX_LOG_TIMESTAMPS);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  }<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>  protected String toString(int maxTimestamps) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    StringBuilder tsList = new StringBuilder();<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>    int count = 0;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    for (Long ts : this.timestamps) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      if (count &gt;= maxTimestamps) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        break;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      ++count;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      tsList.append(ts.toString());<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      if (count &lt; this.timestamps.size() &amp;&amp; count &lt; maxTimestamps) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        tsList.append(", ");<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><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    return String.format("%s (%d/%d): [%s] canHint: [%b]", this.getClass().getSimpleName(),<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        count, this.timestamps.size(), tsList.toString(), canHint);<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>}<a name="line.233"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html
index 1cc5963..e805311 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html
@@ -71,8 +71,8 @@
 <span class="sourceLineNo">063</span>  @Override<a name="line.63"></a>
 <span class="sourceLineNo">064</span>  public void cacheBlock(BlockCacheKey cacheKey, Cacheable buf, boolean inMemory,<a name="line.64"></a>
 <span class="sourceLineNo">065</span>      final boolean cacheDataInL1) {<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    boolean isMetaBlock = buf.getBlockType().getCategory() != BlockCategory.DATA;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    if (isMetaBlock || cacheDataInL1) {<a name="line.67"></a>
+<span class="sourceLineNo">066</span>    boolean metaBlock = buf.getBlockType().getCategory() != BlockCategory.DATA;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    if (metaBlock || cacheDataInL1) {<a name="line.67"></a>
 <span class="sourceLineNo">068</span>      lruCache.cacheBlock(cacheKey, buf, inMemory, cacheDataInL1);<a name="line.68"></a>
 <span class="sourceLineNo">069</span>    } else {<a name="line.69"></a>
 <span class="sourceLineNo">070</span>      l2Cache.cacheBlock(cacheKey, buf, inMemory, false);<a name="line.70"></a>
@@ -89,190 +89,187 @@
 <span class="sourceLineNo">081</span>      boolean repeat, boolean updateCacheMetrics) {<a name="line.81"></a>
 <span class="sourceLineNo">082</span>    // TODO: is there a hole here, or just awkwardness since in the lruCache getBlock<a name="line.82"></a>
 <span class="sourceLineNo">083</span>    // we end up calling l2Cache.getBlock.<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    if (lruCache.containsBlock(cacheKey)) {<a name="line.84"></a>
-<span class="sourceLineNo">085</span>      return lruCache.getBlock(cacheKey, caching, repeat, updateCacheMetrics);<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    }<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    Cacheable result = l2Cache.getBlock(cacheKey, caching, repeat, updateCacheMetrics);<a name="line.87"></a>
+<span class="sourceLineNo">084</span>    return lruCache.containsBlock(cacheKey)?<a name="line.84"></a>
+<span class="sourceLineNo">085</span>        lruCache.getBlock(cacheKey, caching, repeat, updateCacheMetrics):<a name="line.85"></a>
+<span class="sourceLineNo">086</span>        l2Cache.getBlock(cacheKey, caching, repeat, updateCacheMetrics);<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  }<a name="line.87"></a>
 <span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>    return result;<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">092</span>  @Override<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  public boolean evictBlock(BlockCacheKey cacheKey) {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    return lruCache.evictBlock(cacheKey) || l2Cache.evictBlock(cacheKey);<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>  @Override<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    return lruCache.evictBlocksByHfileName(hfileName)<a name="line.99"></a>
-<span class="sourceLineNo">100</span>        + l2Cache.evictBlocksByHfileName(hfileName);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  }<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>  @Override<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  public CacheStats getStats() {<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    return this.combinedCacheStats;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @Override<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  public void shutdown() {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    lruCache.shutdown();<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    l2Cache.shutdown();<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  @Override<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  public long size() {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    return lruCache.size() + l2Cache.size();<a name="line.116"></a>
-<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>  @Override<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  public long getFreeSize() {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    return lruCache.getFreeSize() + l2Cache.getFreeSize();<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>  @Override<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  public long getCurrentSize() {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    return lruCache.getCurrentSize() + l2Cache.getCurrentSize();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  @Override<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  public long getBlockCount() {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    return lruCache.getBlockCount() + l2Cache.getBlockCount();<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>  public static class CombinedCacheStats extends CacheStats {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    private final CacheStats lruCacheStats;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    private final CacheStats bucketCacheStats;<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>    CombinedCacheStats(CacheStats lbcStats, CacheStats fcStats) {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      super("CombinedBlockCache");<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      this.lruCacheStats = lbcStats;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      this.bucketCacheStats = fcStats;<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>    @Override<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    public long getRequestCount() {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      return lruCacheStats.getRequestCount()<a name="line.146"></a>
-<span class="sourceLineNo">147</span>          + bucketCacheStats.getRequestCount();<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>    @Override<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    public long getRequestCachingCount() {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      return lruCacheStats.getRequestCachingCount()<a name="line.152"></a>
-<span class="sourceLineNo">153</span>          + bucketCacheStats.getRequestCachingCount();<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>    @Override<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    public long getMissCount() {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      return lruCacheStats.getMissCount() + bucketCacheStats.getMissCount();<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>    @Override<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    public long getPrimaryMissCount() {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      return lruCacheStats.getPrimaryMissCount() + bucketCacheStats.getPrimaryMissCount();<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>    @Override<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    public long getMissCachingCount() {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      return lruCacheStats.getMissCachingCount()<a name="line.168"></a>
-<span class="sourceLineNo">169</span>          + bucketCacheStats.getMissCachingCount();<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>    @Override<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    public long getHitCount() {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      return lruCacheStats.getHitCount() + bucketCacheStats.getHitCount();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>    @Override<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    public long getPrimaryHitCount() {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      return lruCacheStats.getPrimaryHitCount() + bucketCacheStats.getPrimaryHitCount();<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    }<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    @Override<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    public long getHitCachingCount() {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      return lruCacheStats.getHitCachingCount()<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          + bucketCacheStats.getHitCachingCount();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    @Override<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    public long getEvictionCount() {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      return lruCacheStats.getEvictionCount()<a name="line.189"></a>
-<span class="sourceLineNo">190</span>          + bucketCacheStats.getEvictionCount();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>    @Override<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    public long getEvictedCount() {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      return lruCacheStats.getEvictedCount()<a name="line.195"></a>
-<span class="sourceLineNo">196</span>          + bucketCacheStats.getEvictedCount();<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>    @Override<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    public long getPrimaryEvictedCount() {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      return lruCacheStats.getPrimaryEvictedCount()<a name="line.201"></a>
-<span class="sourceLineNo">202</span>          + bucketCacheStats.getPrimaryEvictedCount();<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>    @Override<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    public void rollMetricsPeriod() {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      lruCacheStats.rollMetricsPeriod();<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      bucketCacheStats.rollMetricsPeriod();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    <a name="line.210"></a>
-<span class="sourceLineNo">211</span>    @Override<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    public long getFailedInserts() {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      return lruCacheStats.getFailedInserts() + bucketCacheStats.getFailedInserts();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    }<a name="line.214"></a>
-<span class="sourceLineNo">215</span><a name="line.215"></a>
-<span class="sourceLineNo">216</span>    @Override<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    public long getSumHitCountsPastNPeriods() {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      return lruCacheStats.getSumHitCountsPastNPeriods()<a name="line.218"></a>
-<span class="sourceLineNo">219</span>          + bucketCacheStats.getSumHitCountsPastNPeriods();<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>    @Override<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public long getSumRequestCountsPastNPeriods() {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      return lruCacheStats.getSumRequestCountsPastNPeriods()<a name="line.224"></a>
-<span class="sourceLineNo">225</span>          + bucketCacheStats.getSumRequestCountsPastNPeriods();<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    }<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    <a name="line.227"></a>
-<span class="sourceLineNo">228</span>    @Override<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    public long getSumHitCachingCountsPastNPeriods() {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      return lruCacheStats.getSumHitCachingCountsPastNPeriods()<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          + bucketCacheStats.getSumHitCachingCountsPastNPeriods();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    @Override<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    public long getSumRequestCachingCountsPastNPeriods() {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      return lruCacheStats.getSumRequestCachingCountsPastNPeriods()<a name="line.236"></a>
-<span class="sourceLineNo">237</span>          + bucketCacheStats.getSumRequestCachingCountsPastNPeriods();<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    }<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>  @Override<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  public Iterator&lt;CachedBlock&gt; iterator() {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    return new BlockCachesIterator(getBlockCaches());<a name="line.243"></a>
-<span class="sourceLineNo">244</span>  }<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Override<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  public BlockCache[] getBlockCaches() {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return new BlockCache [] {this.lruCache, this.l2Cache};<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>  @Override<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  public void setMaxSize(long size) {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    this.lruCache.setMaxSize(size);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>  @Override<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  public void returnBlock(BlockCacheKey cacheKey, Cacheable block) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    // A noop<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    this.lruCache.returnBlock(cacheKey, block);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    this.l2Cache.returnBlock(cacheKey, block);<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>  @VisibleForTesting<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public int getRefCount(BlockCacheKey cacheKey) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    return ((BucketCache) this.l2Cache).getRefCount(cacheKey);<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">089</span>  @Override<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  public boolean evictBlock(BlockCacheKey cacheKey) {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    return lruCache.evictBlock(cacheKey) || l2Cache.evictBlock(cacheKey);<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>  @Override<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  public int evictBlocksByHfileName(String hfileName) {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    return lruCache.evictBlocksByHfileName(hfileName)<a name="line.96"></a>
+<span class="sourceLineNo">097</span>        + l2Cache.evictBlocksByHfileName(hfileName);<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>  @Override<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  public CacheStats getStats() {<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    return this.combinedCacheStats;<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>  @Override<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  public void shutdown() {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    lruCache.shutdown();<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    l2Cache.shutdown();<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  @Override<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public long size() {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    return lruCache.size() + l2Cache.size();<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  }<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>  @Override<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  public long getFreeSize() {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    return lruCache.getFreeSize() + l2Cache.getFreeSize();<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>  @Override<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  public long getCurrentSize() {<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    return lruCache.getCurrentSize() + l2Cache.getCurrentSize();<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>  @Override<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public long getBlockCount() {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    return lruCache.getBlockCount() + l2Cache.getBlockCount();<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 class CombinedCacheStats extends CacheStats {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    private final CacheStats lruCacheStats;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    private final CacheStats bucketCacheStats;<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>    CombinedCacheStats(CacheStats lbcStats, CacheStats fcStats) {<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      super("CombinedBlockCache");<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      this.lruCacheStats = lbcStats;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      this.bucketCacheStats = fcStats;<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 long getRequestCount() {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      return lruCacheStats.getRequestCount()<a name="line.143"></a>
+<span class="sourceLineNo">144</span>          + bucketCacheStats.getRequestCount();<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>    @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    public long getRequestCachingCount() {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return lruCacheStats.getRequestCachingCount()<a name="line.149"></a>
+<span class="sourceLineNo">150</span>          + bucketCacheStats.getRequestCachingCount();<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>    @Override<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    public long getMissCount() {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      return lruCacheStats.getMissCount() + bucketCacheStats.getMissCount();<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 long getPrimaryMissCount() {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      return lruCacheStats.getPrimaryMissCount() + bucketCacheStats.getPrimaryMissCount();<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
+<span class="sourceLineNo">162</span><a name="line.162"></a>
+<span class="sourceLineNo">163</span>    @Override<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    public long getMissCachingCount() {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      return lruCacheStats.getMissCachingCount()<a name="line.165"></a>
+<span class="sourceLineNo">166</span>          + bucketCacheStats.getMissCachingCount();<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>    @Override<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    public long getHitCount() {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>      return lruCacheStats.getHitCount() + bucketCacheStats.getHitCount();<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    }<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>    @Override<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    public long getPrimaryHitCount() {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      return lruCacheStats.getPrimaryHitCount() + bucketCacheStats.getPrimaryHitCount();<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    @Override<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    public long getHitCachingCount() {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      return lruCacheStats.getHitCachingCount()<a name="line.180"></a>
+<span class="sourceLineNo">181</span>          + bucketCacheStats.getHitCachingCount();<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    }<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 long getEvictionCount() {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      return lruCacheStats.getEvictionCount()<a name="line.186"></a>
+<span class="sourceLineNo">187</span>          + bucketCacheStats.getEvictionCount();<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>    @Override<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    public long getEvictedCount() {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      return lruCacheStats.getEvictedCount()<a name="line.192"></a>
+<span class="sourceLineNo">193</span>          + bucketCacheStats.getEvictedCount();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    @Override<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public long getPrimaryEvictedCount() {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      return lruCacheStats.getPrimaryEvictedCount()<a name="line.198"></a>
+<span class="sourceLineNo">199</span>          + bucketCacheStats.getPrimaryEvictedCount();<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>    @Override<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    public void rollMetricsPeriod() {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      lruCacheStats.rollMetricsPeriod();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      bucketCacheStats.rollMetricsPeriod();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    <a name="line.207"></a>
+<span class="sourceLineNo">208</span>    @Override<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    public long getFailedInserts() {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      return lruCacheStats.getFailedInserts() + bucketCacheStats.getFailedInserts();<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>    @Override<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    public long getSumHitCountsPastNPeriods() {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      return lruCacheStats.getSumHitCountsPastNPeriods()<a name="line.215"></a>
+<span class="sourceLineNo">216</span>          + bucketCacheStats.getSumHitCountsPastNPeriods();<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    }<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    <a name="line.218"></a>
+<span class="sourceLineNo">219</span>    @Override<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    public long getSumRequestCountsPastNPeriods() {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      return lruCacheStats.getSumRequestCountsPastNPeriods()<a name="line.221"></a>
+<span class="sourceLineNo">222</span>          + bucketCacheStats.getSumRequestCountsPastNPeriods();<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    <a name="line.224"></a>
+<span class="sourceLineNo">225</span>    @Override<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    public long getSumHitCachingCountsPastNPeriods() {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      return lruCacheStats.getSumHitCachingCountsPastNPeriods()<a name="line.227"></a>
+<span class="sourceLineNo">228</span>          + bucketCacheStats.getSumHitCachingCountsPastNPeriods();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
+<span class="sourceLineNo">230</span><a name="line.230"></a>
+<span class="sourceLineNo">231</span>    @Override<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    public long getSumRequestCachingCountsPastNPeriods() {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return lruCacheStats.getSumRequestCachingCountsPastNPeriods()<a name="line.233"></a>
+<span class="sourceLineNo">234</span>          + bucketCacheStats.getSumRequestCachingCountsPastNPeriods();<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>  @Override<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  public Iterator&lt;CachedBlock&gt; iterator() {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    return new BlockCachesIterator(getBlockCaches());<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>  @Override<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public BlockCache[] getBlockCaches() {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    return new BlockCache [] {this.lruCache, this.l2Cache};<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  }<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  @Override<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  public void setMaxSize(long size) {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    this.lruCache.setMaxSize(size);<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>  @Override<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  public void returnBlock(BlockCacheKey cacheKey, Cacheable block) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    // A noop<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    this.lruCache.returnBlock(cacheKey, block);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    this.l2Cache.returnBlock(cacheKey, block);<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>  @VisibleForTesting<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  public int getRefCount(BlockCacheKey cacheKey) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    return ((BucketCache) this.l2Cache).getRefCount(cacheKey);<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>
 
 
 


[25/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html
index f4bddcd..7f40519 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html
@@ -25,100 +25,100 @@
 <span class="sourceLineNo">017</span> */<a name="line.17"></a>
 <span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.ipc;<a name="line.18"></a>
 <span class="sourceLineNo">019</span><a name="line.19"></a>
-<span class="sourceLineNo">020</span>import io.netty.bootstrap.Bootstrap;<a name="line.20"></a>
-<span class="sourceLineNo">021</span>import io.netty.buffer.ByteBuf;<a name="line.21"></a>
-<span class="sourceLineNo">022</span>import io.netty.buffer.ByteBufOutputStream;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import io.netty.channel.Channel;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import io.netty.channel.ChannelFuture;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import io.netty.channel.ChannelFutureListener;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import io.netty.handler.codec.LengthFieldBasedFrameDecoder;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import io.netty.util.Timeout;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import io.netty.util.TimerTask;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import io.netty.util.concurrent.GenericFutureListener;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import io.netty.util.concurrent.Promise;<a name="line.30"></a>
-<span class="sourceLineNo">031</span><a name="line.31"></a>
-<span class="sourceLineNo">032</span>import java.io.IOException;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import java.net.ConnectException;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.net.InetSocketAddress;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import java.nio.ByteBuffer;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import java.security.PrivilegedExceptionAction;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import java.util.ArrayList;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import java.util.HashMap;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import java.util.Iterator;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import java.util.List;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import java.util.Map;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import java.util.Random;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import java.util.concurrent.TimeUnit;<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>import javax.security.sasl.SaslException;<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.commons.logging.Log;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.commons.logging.LogFactory;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.HConstants;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.MetricsConnection;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.exceptions.ConnectionClosingException;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.protobuf.generated.AuthenticationProtos;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.protobuf.generated.TracingProtos;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.security.AuthMethod;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.security.SaslClientHandler;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.security.SaslUtil;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.security.SecurityInfo;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.security.User;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.security.token.AuthenticationTokenSelector;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.io.Text;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.security.SecurityUtil;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.security.UserGroupInformation;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.security.token.Token;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.security.token.TokenIdentifier;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.security.token.TokenSelector;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.htrace.Span;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.htrace.Trace;<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
-<span class="sourceLineNo">074</span>import com.google.protobuf.Descriptors;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import com.google.protobuf.Message;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import com.google.protobuf.RpcCallback;<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>/**<a name="line.78"></a>
-<span class="sourceLineNo">079</span> * Netty RPC channel<a name="line.79"></a>
-<span class="sourceLineNo">080</span> */<a name="line.80"></a>
-<span class="sourceLineNo">081</span>@InterfaceAudience.Private<a name="line.81"></a>
-<span class="sourceLineNo">082</span>public class AsyncRpcChannel {<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  private static final Log LOG = LogFactory.getLog(AsyncRpcChannel.class.getName());<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span>  private static final int MAX_SASL_RETRIES = 5;<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  protected final static Map&lt;AuthenticationProtos.TokenIdentifier.Kind, TokenSelector&lt;? extends<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      TokenIdentifier&gt;&gt; tokenHandlers = new HashMap&lt;&gt;();<a name="line.88"></a>
-<span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  static {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    tokenHandlers.put(AuthenticationProtos.TokenIdentifier.Kind.HBASE_AUTH_TOKEN,<a name="line.91"></a>
-<span class="sourceLineNo">092</span>        new AuthenticationTokenSelector());<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  final AsyncRpcClient client;<a name="line.95"></a>
-<span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  // Contains the channel to work with.<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  // Only exists when connected<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private Channel channel;<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>  String name;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  final User ticket;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  final String serviceName;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  final InetSocketAddress address;<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>  private int failureCounter = 0;<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  boolean useSasl;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  AuthMethod authMethod;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  private int reloginMaxBackoff;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  private Token&lt;? extends TokenIdentifier&gt; token;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  private String serverPrincipal;<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">020</span>import java.io.IOException;<a name="line.20"></a>
+<span class="sourceLineNo">021</span>import java.net.ConnectException;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import java.net.InetSocketAddress;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.nio.ByteBuffer;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.security.PrivilegedExceptionAction;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.util.ArrayList;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.util.HashMap;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.Iterator;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.List;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.Map;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.Random;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.concurrent.TimeUnit;<a name="line.31"></a>
+<span class="sourceLineNo">032</span><a name="line.32"></a>
+<span class="sourceLineNo">033</span>import javax.security.sasl.SaslException;<a name="line.33"></a>
+<span class="sourceLineNo">034</span><a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.commons.logging.Log;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.commons.logging.LogFactory;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.HConstants;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.client.MetricsConnection;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.exceptions.ConnectionClosingException;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.protobuf.generated.AuthenticationProtos;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.protobuf.generated.AuthenticationProtos.TokenIdentifier.Kind;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.protobuf.generated.TracingProtos;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.security.AuthMethod;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.security.SaslClientHandler;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.security.SaslUtil;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.security.SecurityInfo;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.security.User;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.security.token.AuthenticationTokenSelector;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.io.Text;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.security.SecurityUtil;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.security.UserGroupInformation;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.security.token.Token;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.security.token.TokenIdentifier;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.security.token.TokenSelector;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.htrace.Span;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.htrace.Trace;<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>import com.google.protobuf.Descriptors;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import com.google.protobuf.Message;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import com.google.protobuf.RpcCallback;<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>import io.netty.bootstrap.Bootstrap;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import io.netty.buffer.ByteBuf;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import io.netty.buffer.ByteBufOutputStream;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import io.netty.channel.Channel;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import io.netty.channel.ChannelFuture;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import io.netty.channel.ChannelFutureListener;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import io.netty.handler.codec.LengthFieldBasedFrameDecoder;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import io.netty.util.Timeout;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import io.netty.util.TimerTask;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import io.netty.util.concurrent.GenericFutureListener;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import io.netty.util.concurrent.Promise;<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> * Netty RPC channel<a name="line.80"></a>
+<span class="sourceLineNo">081</span> */<a name="line.81"></a>
+<span class="sourceLineNo">082</span>@InterfaceAudience.Private<a name="line.82"></a>
+<span class="sourceLineNo">083</span>public class AsyncRpcChannel {<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private static final Log LOG = LogFactory.getLog(AsyncRpcChannel.class.getName());<a name="line.84"></a>
+<span class="sourceLineNo">085</span><a name="line.85"></a>
+<span class="sourceLineNo">086</span>  private static final int MAX_SASL_RETRIES = 5;<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>  protected final static Map&lt;Kind, TokenSelector&lt;? extends TokenIdentifier&gt;&gt; TOKEN_HANDDLERS<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    = new HashMap&lt;&gt;();<a name="line.89"></a>
+<span class="sourceLineNo">090</span><a name="line.90"></a>
+<span class="sourceLineNo">091</span>  static {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    TOKEN_HANDDLERS.put(AuthenticationProtos.TokenIdentifier.Kind.HBASE_AUTH_TOKEN,<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      new AuthenticationTokenSelector());<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>  final AsyncRpcClient client;<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  // Contains the channel to work with.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  // Only exists when connected<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  private Channel channel;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>  String name;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  final User ticket;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  final String serviceName;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  final InetSocketAddress address;<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  private int failureCounter = 0;<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  boolean useSasl;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  AuthMethod authMethod;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  private int reloginMaxBackoff;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  private Token&lt;? extends TokenIdentifier&gt; token;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  private String serverPrincipal;<a name="line.113"></a>
 <span class="sourceLineNo">114</span><a name="line.114"></a>
 <span class="sourceLineNo">115</span>  // NOTE: closed and connected flags below are only changed when a lock on pendingCalls<a name="line.115"></a>
 <span class="sourceLineNo">116</span>  private final Map&lt;Integer, AsyncCall&gt; pendingCalls = new HashMap&lt;Integer, AsyncCall&gt;();<a name="line.116"></a>
@@ -136,629 +136,608 @@
 <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>   * Constructor for netty RPC channel<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   *<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @param bootstrap to construct channel on<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * @param client    to connect with<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   * @param ticket of user which uses connection<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   * @param serviceName name of service to connect to<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * @param address to connect to<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   */<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  public AsyncRpcChannel(Bootstrap bootstrap, final AsyncRpcClient client, User ticket, String<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      serviceName, InetSocketAddress address) {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    this.client = client;<a name="line.140"></a>
-<span class="sourceLineNo">141</span><a name="line.141"></a>
-<span class="sourceLineNo">142</span>    this.ticket = ticket;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    this.serviceName = serviceName;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    this.address = address;<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>    this.channel = connect(bootstrap).channel();<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>    name = ("IPC Client (" + channel.hashCode() + ") to " +<a name="line.148"></a>
-<span class="sourceLineNo">149</span>        address.toString() +<a name="line.149"></a>
-<span class="sourceLineNo">150</span>        ((ticket == null) ?<a name="line.150"></a>
-<span class="sourceLineNo">151</span>            " from unknown user" :<a name="line.151"></a>
-<span class="sourceLineNo">152</span>            (" from " + ticket.getName())));<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  }<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>   * Connect to channel<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   *<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * @param bootstrap to connect to<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   * @return future of connection<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   */<a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private ChannelFuture connect(final Bootstrap bootstrap) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    return bootstrap.remoteAddress(address).connect()<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        .addListener(new GenericFutureListener&lt;ChannelFuture&gt;() {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>          @Override<a name="line.164"></a>
-<span class="sourceLineNo">165</span>          public void operationComplete(final ChannelFuture f) throws Exception {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>            if (!f.isSuccess()) {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>              retryOrClose(bootstrap, failureCounter++, client.failureSleep, f.cause());<a name="line.167"></a>
-<span class="sourceLineNo">168</span>              return;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>            }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>            channel = f.channel();<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>            setupAuthorization();<a name="line.172"></a>
-<span class="sourceLineNo">173</span><a name="line.173"></a>
-<span class="sourceLineNo">174</span>            ByteBuf b = channel.alloc().directBuffer(6);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>            createPreamble(b, authMethod);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>            channel.writeAndFlush(b).addListener(ChannelFutureListener.CLOSE_ON_FAILURE);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>            if (useSasl) {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>              UserGroupInformation ticket = AsyncRpcChannel.this.ticket.getUGI();<a name="line.178"></a>
-<span class="sourceLineNo">179</span>              if (authMethod == AuthMethod.KERBEROS) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>                if (ticket != null &amp;&amp; ticket.getRealUser() != null) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>                  ticket = ticket.getRealUser();<a name="line.181"></a>
-<span class="sourceLineNo">182</span>                }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>              }<a name="line.183"></a>
-<span class="sourceLineNo">184</span>              SaslClientHandler saslHandler;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>              if (ticket == null) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>                throw new FatalConnectionException("ticket/user is null");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>              }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>              final UserGroupInformation realTicket = ticket;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>              saslHandler = ticket.doAs(new PrivilegedExceptionAction&lt;SaslClientHandler&gt;() {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>                @Override<a name="line.190"></a>
-<span class="sourceLineNo">191</span>                public SaslClientHandler run() throws IOException {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>                  return getSaslHandler(realTicket, bootstrap);<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>              if (saslHandler != null) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>                // Sasl connect is successful. Let's set up Sasl channel handler<a name="line.196"></a>
-<span class="sourceLineNo">197</span>                channel.pipeline().addFirst(saslHandler);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>              } else {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>                // fall back to simple auth because server told us so.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>                authMethod = AuthMethod.SIMPLE;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>                useSasl = false;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>              }<a name="line.202"></a>
-<span class="sourceLineNo">203</span>            } else {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>              startHBaseConnection(f.channel());<a name="line.204"></a>
-<span class="sourceLineNo">205</span>            }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          }<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><a name="line.209"></a>
-<span class="sourceLineNo">210</span>  /**<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   * Start HBase connection<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   *<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * @param ch channel to start connection on<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   */<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  private void startHBaseConnection(Channel ch) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    ch.pipeline()<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        .addLast("frameDecoder", new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4));<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    ch.pipeline().addLast(new AsyncServerResponseHandler(this));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    try {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      writeChannelHeader(ch).addListener(new GenericFutureListener&lt;ChannelFuture&gt;() {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        @Override<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        public void operationComplete(ChannelFuture future) throws Exception {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>          if (!future.isSuccess()) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>            close(future.cause());<a name="line.224"></a>
-<span class="sourceLineNo">225</span>            return;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>          }<a name="line.226"></a>
-<span class="sourceLineNo">227</span>          List&lt;AsyncCall&gt; callsToWrite;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>          synchronized (pendingCalls) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>            connected = true;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>            callsToWrite = new ArrayList&lt;AsyncCall&gt;(pendingCalls.values());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>          for (AsyncCall call : callsToWrite) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>            writeRequest(call);<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>      });<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    } catch (IOException e) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      close(e);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    }<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>   * Get SASL handler<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   * @param bootstrap to reconnect to<a name="line.244"></a>
-<span class="sourceLineNo">245</span>   * @return new SASL handler<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * @throws java.io.IOException if handler failed to create<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   */<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  private SaslClientHandler getSaslHandler(final UserGroupInformation realTicket,<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      final Bootstrap bootstrap) throws IOException {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    return new SaslClientHandler(realTicket, authMethod, token, serverPrincipal,<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        client.fallbackAllowed, client.conf.get("hbase.rpc.protection",<a name="line.251"></a>
-<span class="sourceLineNo">252</span>          SaslUtil.QualityOfProtection.AUTHENTICATION.name().toLowerCase()),<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        new SaslClientHandler.SaslExceptionHandler() {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          @Override<a name="line.254"></a>
-<span class="sourceLineNo">255</span>          public void handle(int retryCount, Random random, Throwable cause) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>            try {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>              // Handle Sasl failure. Try to potentially get new credentials<a name="line.257"></a>
-<span class="sourceLineNo">258</span>              handleSaslConnectionFailure(retryCount, cause, realTicket);<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>              retryOrClose(bootstrap, failureCounter++, random.nextInt(reloginMaxBackoff) + 1,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>                  cause);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>            } catch (IOException | InterruptedException e) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>              close(e);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>            }<a name="line.264"></a>
+<span class="sourceLineNo">131</span>   * @param bootstrap to construct channel on<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * @param client to connect with<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @param ticket of user which uses connection<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * @param serviceName name of service to connect to<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   * @param address to connect to<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   */<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  public AsyncRpcChannel(Bootstrap bootstrap, final AsyncRpcClient client, User ticket,<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      String serviceName, InetSocketAddress address) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    this.client = client;<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>    this.ticket = ticket;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    this.serviceName = serviceName;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    this.address = address;<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>    this.channel = connect(bootstrap).channel();<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    name = ("IPC Client (" + channel.hashCode() + ") to " + address.toString()<a name="line.147"></a>
+<span class="sourceLineNo">148</span>        + ((ticket == null) ? " from unknown user" : (" from " + ticket.getName())));<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  /**<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * Connect to channel<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   * @param bootstrap to connect to<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * @return future of connection<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   */<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private ChannelFuture connect(final Bootstrap bootstrap) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    return bootstrap.remoteAddress(address).connect()<a name="line.157"></a>
+<span class="sourceLineNo">158</span>        .addListener(new GenericFutureListener&lt;ChannelFuture&gt;() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>          @Override<a name="line.159"></a>
+<span class="sourceLineNo">160</span>          public void operationComplete(final ChannelFuture f) throws Exception {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>            if (!f.isSuccess()) {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>              retryOrClose(bootstrap, failureCounter++, client.failureSleep, f.cause());<a name="line.162"></a>
+<span class="sourceLineNo">163</span>              return;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>            }<a name="line.164"></a>
+<span class="sourceLineNo">165</span>            channel = f.channel();<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>            setupAuthorization();<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>            ByteBuf b = channel.alloc().directBuffer(6);<a name="line.169"></a>
+<span class="sourceLineNo">170</span>            createPreamble(b, authMethod);<a name="line.170"></a>
+<span class="sourceLineNo">171</span>            channel.writeAndFlush(b).addListener(ChannelFutureListener.CLOSE_ON_FAILURE);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>            if (useSasl) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>              UserGroupInformation ticket = AsyncRpcChannel.this.ticket.getUGI();<a name="line.173"></a>
+<span class="sourceLineNo">174</span>              if (authMethod == AuthMethod.KERBEROS) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>                if (ticket != null &amp;&amp; ticket.getRealUser() != null) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>                  ticket = ticket.getRealUser();<a name="line.176"></a>
+<span class="sourceLineNo">177</span>                }<a name="line.177"></a>
+<span class="sourceLineNo">178</span>              }<a name="line.178"></a>
+<span class="sourceLineNo">179</span>              SaslClientHandler saslHandler;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>              if (ticket == null) {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>                throw new FatalConnectionException("ticket/user is null");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>              }<a name="line.182"></a>
+<span class="sourceLineNo">183</span>              final UserGroupInformation realTicket = ticket;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>              saslHandler = ticket.doAs(new PrivilegedExceptionAction&lt;SaslClientHandler&gt;() {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>                @Override<a name="line.185"></a>
+<span class="sourceLineNo">186</span>                public SaslClientHandler run() throws IOException {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>                  return getSaslHandler(realTicket, bootstrap);<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>              if (saslHandler != null) {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>                // Sasl connect is successful. Let's set up Sasl channel handler<a name="line.191"></a>
+<span class="sourceLineNo">192</span>                channel.pipeline().addFirst(saslHandler);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>              } else {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>                // fall back to simple auth because server told us so.<a name="line.194"></a>
+<span class="sourceLineNo">195</span>                authMethod = AuthMethod.SIMPLE;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>                useSasl = false;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>              }<a name="line.197"></a>
+<span class="sourceLineNo">198</span>            } else {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>              startHBaseConnection(f.channel());<a name="line.199"></a>
+<span class="sourceLineNo">200</span>            }<a name="line.200"></a>
+<span class="sourceLineNo">201</span>          }<a name="line.201"></a>
+<span class="sourceLineNo">202</span>        });<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>   * Start HBase connection<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   * @param ch channel to start connection on<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  private void startHBaseConnection(Channel ch) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    ch.pipeline().addLast("frameDecoder",<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4));<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ch.pipeline().addLast(new AsyncServerResponseHandler(this));<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    try {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      writeChannelHeader(ch).addListener(new GenericFutureListener&lt;ChannelFuture&gt;() {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        @Override<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        public void operationComplete(ChannelFuture future) throws Exception {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>          if (!future.isSuccess()) {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>            close(future.cause());<a name="line.218"></a>
+<span class="sourceLineNo">219</span>            return;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>          }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>          List&lt;AsyncCall&gt; callsToWrite;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>          synchronized (pendingCalls) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>            connected = true;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>            callsToWrite = new ArrayList&lt;AsyncCall&gt;(pendingCalls.values());<a name="line.224"></a>
+<span class="sourceLineNo">225</span>          }<a name="line.225"></a>
+<span class="sourceLineNo">226</span>          for (AsyncCall call : callsToWrite) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>            writeRequest(call);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>          }<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        }<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      });<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    } catch (IOException e) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      close(e);<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>  /**<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * Get SASL handler<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param bootstrap to reconnect to<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @return new SASL handler<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   * @throws java.io.IOException if handler failed to create<a name="line.240"></a>
+<span class="sourceLineNo">241</span>   */<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  private SaslClientHandler getSaslHandler(final UserGroupInformation realTicket,<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      final Bootstrap bootstrap) throws IOException {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    return new SaslClientHandler(realTicket, authMethod, token, serverPrincipal,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        client.fallbackAllowed,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        client.conf.get("hbase.rpc.protection",<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          SaslUtil.QualityOfProtection.AUTHENTICATION.name().toLowerCase()),<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        new SaslClientHandler.SaslExceptionHandler() {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          @Override<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          public void handle(int retryCount, Random random, Throwable cause) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>            try {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>              // Handle Sasl failure. Try to potentially get new credentials<a name="line.252"></a>
+<span class="sourceLineNo">253</span>              handleSaslConnectionFailure(retryCount, cause, realTicket);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>              retryOrClose(bootstrap, failureCounter++, random.nextInt(reloginMaxBackoff) + 1,<a name="line.255"></a>
+<span class="sourceLineNo">256</span>                cause);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>            } catch (IOException | InterruptedException e) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>              close(e);<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>        }, new SaslClientHandler.SaslSuccessfulConnectHandler() {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>          @Override<a name="line.262"></a>
+<span class="sourceLineNo">263</span>          public void onSuccess(Channel channel) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>            startHBaseConnection(channel);<a name="line.264"></a>
 <span class="sourceLineNo">265</span>          }<a name="line.265"></a>
-<span class="sourceLineNo">266</span>        }, new SaslClientHandler.SaslSuccessfulConnectHandler() {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>          @Override<a name="line.267"></a>
-<span class="sourceLineNo">268</span>          public void onSuccess(Channel channel) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>            startHBaseConnection(channel);<a name="line.269"></a>
-<span class="sourceLineNo">270</span>          }<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        });<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  }<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>   * Retry to connect or close<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   *<a name="line.276"></a>
-<span class="sourceLineNo">277</span>   * @param bootstrap      to connect with<a name="line.277"></a>
-<span class="sourceLineNo">278</span>   * @param failureCount   failure count<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   * @param e              exception of fail<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  private void retryOrClose(final Bootstrap bootstrap, int failureCount,<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      long timeout, Throwable e) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    if (failureCount &lt; client.maxRetries) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      client.newTimeout(new TimerTask() {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        @Override<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        public void run(Timeout timeout) throws Exception {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>          connect(bootstrap);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        }<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      }, timeout, TimeUnit.MILLISECONDS);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    } else {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      client.failedServers.addToFailedServers(address);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      close(e);<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>   * Calls method on channel<a name="line.297"></a>
-<span class="sourceLineNo">298</span>   * @param method to call<a name="line.298"></a>
-<span class="sourceLineNo">299</span>   * @param controller to run call with<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * @param request to send<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * @param responsePrototype to construct response with<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   */<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  public Promise&lt;Message&gt; callMethod(final Descriptors.MethodDescriptor method,<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      final PayloadCarryingRpcController controller, final Message request,<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      final Message responsePrototype, MetricsConnection.CallStats callStats) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    final AsyncCall call =<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        new AsyncCall(channel.eventLoop(), client.callIdCnt.getAndIncrement(), method, request,<a name="line.307"></a>
-<span class="sourceLineNo">308</span>            controller, responsePrototype, callStats);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    controller.notifyOnCancel(new RpcCallback&lt;Object&gt;() {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      @Override<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      public void run(Object parameter) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        // TODO: do not need to call AsyncCall.setFailed?<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        synchronized (pendingCalls) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>          pendingCalls.remove(call.id);<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>    });<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    // TODO: this should be handled by PayloadCarryingRpcController.<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    if (controller.isCanceled()) {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // To finish if the call was cancelled before we set the notification (race condition)<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      call.cancel(true);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      return call;<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>    synchronized (pendingCalls) {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      if (closed) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>        Promise&lt;Message&gt; promise = channel.eventLoop().newPromise();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>        promise.setFailure(new ConnectException());<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        return promise;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      pendingCalls.put(call.id, call);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      // Add timeout for cleanup if none is present<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      if (cleanupTimer == null &amp;&amp; call.getRpcTimeout() &gt; 0) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        cleanupTimer =<a name="line.334"></a>
-<span class="sourceLineNo">335</span>            client.newTimeout(timeoutTask, call.getRpcTimeout(),<a name="line.335"></a>
-<span class="sourceLineNo">336</span>              TimeUnit.MILLISECONDS);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      }<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      if (!connected) {<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        return call;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      }<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    writeRequest(call);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    return call;<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>  AsyncCall removePendingCall(int id) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    synchronized (pendingCalls) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      return pendingCalls.remove(id);<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>   * Write the channel header<a name="line.353"></a>
-<span class="sourceLineNo">354</span>   *<a name="line.354"></a>
-<span class="sourceLineNo">355</span>   * @param channel to write to<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   * @return future of write<a name="line.356"></a>
-<span class="sourceLineNo">357</span>   * @throws java.io.IOException on failure to write<a name="line.357"></a>
-<span class="sourceLineNo">358</span>   */<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  private ChannelFuture writeChannelHeader(Channel channel) throws IOException {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    RPCProtos.ConnectionHeader.Builder headerBuilder =<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        RPCProtos.ConnectionHeader.newBuilder().setServiceName(serviceName);<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    RPCProtos.UserInformation userInfoPB = buildUserInfo(ticket.getUGI(), authMethod);<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    if (userInfoPB != null) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      headerBuilder.setUserInfo(userInfoPB);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></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><a name="line.268"></a>
+<span class="sourceLineNo">269</span>  /**<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   * Retry to connect or close<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * @param bootstrap to connect with<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * @param failureCount failure count<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * @param e exception of fail<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   */<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  private void retryOrClose(final Bootstrap bootstrap, int failureCount, long timeout,<a name="line.275"></a>
+<span class="sourceLineNo">276</span>      Throwable e) {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    if (failureCount &lt; client.maxRetries) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      client.newTimeout(new TimerTask() {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        @Override<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        public void run(Timeout timeout) throws Exception {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          connect(bootstrap);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>        }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      }, timeout, TimeUnit.MILLISECONDS);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    } else {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      client.failedServers.addToFailedServers(address);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      close(e);<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><a name="line.289"></a>
+<span class="sourceLineNo">290</span>  /**<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * Calls method on channel<a name="line.291"></a>
+<span class="sourceLineNo">292</span>   * @param method to call<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   * @param controller to run call with<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * @param request to send<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * @param responsePrototype to construct response with<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   */<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public Promise&lt;Message&gt; callMethod(final Descriptors.MethodDescriptor method,<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      final PayloadCarryingRpcController controller, final Message request,<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      final Message responsePrototype, MetricsConnection.CallStats callStats) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    final AsyncCall call = new AsyncCall(channel.eventLoop(), client.callIdCnt.getAndIncrement(),<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        method, request, controller, responsePrototype, callStats);<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    controller.notifyOnCancel(new RpcCallback&lt;Object&gt;() {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>      @Override<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      public void run(Object parameter) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        // TODO: do not need to call AsyncCall.setFailed?<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        synchronized (pendingCalls) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          pendingCalls.remove(call.id);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      }<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    });<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    // TODO: this should be handled by PayloadCarryingRpcController.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    if (controller.isCanceled()) {<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      // To finish if the call was cancelled before we set the notification (race condition)<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      call.cancel(true);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      return call;<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>    synchronized (pendingCalls) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      if (closed) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        Promise&lt;Message&gt; promise = channel.eventLoop().newPromise();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        promise.setFailure(new ConnectException());<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        return promise;<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      }<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      pendingCalls.put(call.id, call);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      // Add timeout for cleanup if none is present<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      if (cleanupTimer == null &amp;&amp; call.getRpcTimeout() &gt; 0) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        cleanupTimer = client.newTimeout(timeoutTask, call.getRpcTimeout(), TimeUnit.MILLISECONDS);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      }<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      if (!connected) {<a name="line.329"></a>
+<span class="sourceLineNo">330</span>        return call;<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>    writeRequest(call);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    return call;<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>  AsyncCall removePendingCall(int id) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    synchronized (pendingCalls) {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      return pendingCalls.remove(id);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  }<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>  /**<a name="line.343"></a>
+<span class="sourceLineNo">344</span>   * Write the channel header<a name="line.344"></a>
+<span class="sourceLineNo">345</span>   * @param channel to write to<a name="line.345"></a>
+<span class="sourceLineNo">346</span>   * @return future of write<a name="line.346"></a>
+<span class="sourceLineNo">347</span>   * @throws java.io.IOException on failure to write<a name="line.347"></a>
+<span class="sourceLineNo">348</span>   */<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  private ChannelFuture writeChannelHeader(Channel channel) throws IOException {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    RPCProtos.ConnectionHeader.Builder headerBuilder = RPCProtos.ConnectionHeader.newBuilder()<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        .setServiceName(serviceName);<a name="line.351"></a>
+<span class="sourceLineNo">352</span><a name="line.352"></a>
+<span class="sourceLineNo">353</span>    RPCProtos.UserInformation userInfoPB = buildUserInfo(ticket.getUGI(), authMethod);<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    if (userInfoPB != null) {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      headerBuilder.setUserInfo(userInfoPB);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    if (client.codec != null) {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      headerBuilder.setCellBlockCodecClass(client.codec.getClass().getCanonicalName());<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    }<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    if (client.compressor != null) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      headerBuilder.setCellBlockCompressorClass(client.compressor.getClass().getCanonicalName());<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>    headerBuilder.setVersionInfo(ProtobufUtil.getVersionInfo());<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    RPCProtos.ConnectionHeader header = headerBuilder.build();<a name="line.366"></a>
 <span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    if (client.codec != null) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      headerBuilder.setCellBlockCodecClass(client.codec.getClass().getCanonicalName());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    if (client.compressor != null) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      headerBuilder.setCellBlockCompressorClass(client.compressor.getClass().getCanonicalName());<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
+<span class="sourceLineNo">368</span>    int totalSize = IPCUtil.getTotalSizeWhenWrittenDelimited(header);<a name="line.368"></a>
+<span class="sourceLineNo">369</span><a name="line.369"></a>
+<span class="sourceLineNo">370</span>    ByteBuf b = channel.alloc().directBuffer(totalSize);<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    b.writeInt(header.getSerializedSize());<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    b.writeBytes(header.toByteArray());<a name="line.373"></a>
 <span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>    headerBuilder.setVersionInfo(ProtobufUtil.getVersionInfo());<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    RPCProtos.ConnectionHeader header = headerBuilder.build();<a name="line.376"></a>
+<span class="sourceLineNo">375</span>    return channel.writeAndFlush(b);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
 <span class="sourceLineNo">377</span><a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>    int totalSize = IPCUtil.getTotalSizeWhenWrittenDelimited(header);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>    ByteBuf b = channel.alloc().directBuffer(totalSize);<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span>    b.writeInt(header.getSerializedSize());<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    b.writeBytes(header.toByteArray());<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>    return channel.writeAndFlush(b);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
+<span class="sourceLineNo">378</span>  /**<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * Write request to channel<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * @param call to write<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   */<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  private void writeRequest(final AsyncCall call) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    try {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      final RPCProtos.RequestHeader.Builder requestHeaderBuilder = RPCProtos.RequestHeader<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          .newBuilder();<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      requestHeaderBuilder.setCallId(call.id).setMethodName(call.method.getName())<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          .setRequestParam(call.param != null);<a name="line.387"></a>
 <span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * Write request to channel<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   *<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * @param call    to write<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  private void writeRequest(final AsyncCall call) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    try {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      final RPCProtos.RequestHeader.Builder requestHeaderBuilder = RPCProtos.RequestHeader<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          .newBuilder();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      requestHeaderBuilder.setCallId(call.id)<a name="line.398"></a>
-<span class="sourceLineNo">399</span>              .setMethodName(call.method.getName()).setRequestParam(call.param != null);<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>      if (Trace.isTracing()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        Span s = Trace.currentSpan();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        requestHeaderBuilder.setTraceInfo(TracingProtos.RPCTInfo.newBuilder().<a name="line.403"></a>
-<span class="sourceLineNo">404</span>            setParentId(s.getSpanId()).setTraceId(s.getTraceId()));<a name="line.404"></a>
+<span class="sourceLineNo">389</span>      if (Trace.isTracing()) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>        Span s = Trace.currentSpan();<a name="line.390"></a>
+<span class="sourceLineNo">391</span>        requestHeaderBuilder.setTraceInfo(TracingProtos.RPCTInfo.newBuilder()<a name="line.391"></a>
+<span class="sourceLineNo">392</span>            .setParentId(s.getSpanId()).setTraceId(s.getTraceId()));<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>      ByteBuffer cellBlock = client.buildCellBlock(call.controller.cellScanner());<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      if (cellBlock != null) {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        final RPCProtos.CellBlockMeta.Builder cellBlockBuilder = RPCProtos.CellBlockMeta<a name="line.397"></a>
+<span class="sourceLineNo">398</span>            .newBuilder();<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        cellBlockBuilder.setLength(cellBlock.limit());<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        requestHeaderBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      // Only pass priority if there one. Let zero be same as no priority.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      if (call.controller.getPriority() != PayloadCarryingRpcController.PRIORITY_UNSET) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        requestHeaderBuilder.setPriority(call.controller.getPriority());<a name="line.404"></a>
 <span class="sourceLineNo">405</span>      }<a name="line.405"></a>
 <span class="sourceLineNo">406</span><a name="line.406"></a>
-<span class="sourceLineNo">407</span>      ByteBuffer cellBlock = client.buildCellBlock(call.controller.cellScanner());<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      if (cellBlock != null) {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        final RPCProtos.CellBlockMeta.Builder cellBlockBuilder = RPCProtos.CellBlockMeta<a name="line.409"></a>
-<span class="sourceLineNo">410</span>            .newBuilder();<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        cellBlockBuilder.setLength(cellBlock.limit());<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        requestHeaderBuilder.setCellBlockMeta(cellBlockBuilder.build());<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      }<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      // Only pass priority if there one.  Let zero be same as no priority.<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      if (call.controller.getPriority() != PayloadCarryingRpcController.PRIORITY_UNSET) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        requestHeaderBuilder.setPriority(call.controller.getPriority());<a name="line.416"></a>
+<span class="sourceLineNo">407</span>      RPCProtos.RequestHeader rh = requestHeaderBuilder.build();<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>      int totalSize = IPCUtil.getTotalSizeWhenWrittenDelimited(rh, call.param);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      if (cellBlock != null) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        totalSize += cellBlock.remaining();<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>      ByteBuf b = channel.alloc().directBuffer(4 + totalSize);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      try (ByteBufOutputStream out = new ByteBufOutputStream(b)) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        call.callStats.setRequestSizeBytes(IPCUtil.write(out, rh, call.param, cellBlock));<a name="line.416"></a>
 <span class="sourceLineNo">417</span>      }<a name="line.417"></a>
 <span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>      RPCProtos.RequestHeader rh = requestHeaderBuilder.build();<a name="line.419"></a>
-<span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>      int totalSize = IPCUtil.getTotalSizeWhenWrittenDelimited(rh, call.param);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      if (cellBlock != null) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        totalSize += cellBlock.remaining();<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>      ByteBuf b = channel.alloc().directBuffer(4 + totalSize);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      try(ByteBufOutputStream out = new ByteBufOutputStream(b)) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        call.callStats.setRequestSizeBytes(IPCUtil.write(out, rh, call.param, cellBlock));<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      }<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>      channel.writeAndFlush(b).addListener(new CallWriteListener(this, call.id));<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    } catch (IOException e) {<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      close(e);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  }<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  /**<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * Set up server authorization<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   *<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * @throws java.io.IOException if auth setup failed<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   */<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  private void setupAuthorization() throws IOException {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    SecurityInfo securityInfo = SecurityInfo.getInfo(serviceName);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    this.useSasl = client.userProvider.isHBaseSecurityEnabled();<a name="line.444"></a>
-<span class="sourceLineNo">445</span><a name="line.445"></a>
-<span class="sourceLineNo">446</span>    this.token = null;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    if (useSasl &amp;&amp; securityInfo != null) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      AuthenticationProtos.TokenIdentifier.Kind tokenKind = securityInfo.getTokenKind();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      if (tokenKind != null) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        TokenSelector&lt;? extends TokenIdentifier&gt; tokenSelector = tokenHandlers.get(tokenKind);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        if (tokenSelector != null) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          token = tokenSelector<a name="line.452"></a>
-<span class="sourceLineNo">453</span>              .selectToken(new Text(client.clusterId), ticket.getUGI().getTokens());<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        } else if (LOG.isDebugEnabled()) {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>          LOG.debug("No token selector found for type " + tokenKind);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      String serverKey = securityInfo.getServerPrincipal();<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      if (serverKey == null) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>        throw new IOException("Can't obtain server Kerberos config key from SecurityInfo");<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      }<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      this.serverPrincipal = SecurityUtil.getServerPrincipal(client.conf.get(serverKey),<a name="line.462"></a>
-<span class="sourceLineNo">463</span>          address.getAddress().getCanonicalHostName().toLowerCase());<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      if (LOG.isDebugEnabled()) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        LOG.debug("RPC Server Kerberos principal name for service=" + serviceName + " is "<a name="line.465"></a>
-<span class="sourceLineNo">466</span>            + serverPrincipal);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      }<a name="line.467"></a>
+<span class="sourceLineNo">419</span>      channel.writeAndFlush(b).addListener(new CallWriteListener(this, call.id));<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    } catch (IOException e) {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      close(e);<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><a name="line.424"></a>
+<span class="sourceLineNo">425</span>  /**<a name="line.425"></a>
+<span class="sourceLineNo">426</span>   * Set up server authorization<a name="line.426"></a>
+<span class="sourceLineNo">427</span>   * @throws java.io.IOException if auth setup failed<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   */<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  private void setupAuthorization() throws IOException {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    SecurityInfo securityInfo = SecurityInfo.getInfo(serviceName);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    this.useSasl = client.userProvider.isHBaseSecurityEnabled();<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span>    this.token = null;<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    if (useSasl &amp;&amp; securityInfo != null) {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      AuthenticationProtos.TokenIdentifier.Kind tokenKind = securityInfo.getTokenKind();<a name="line.435"></a>
+<span class="sourceLineNo">436</span>      if (tokenKind != null) {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>        TokenSelector&lt;? extends TokenIdentifier&gt; tokenSelector = TOKEN_HANDDLERS.get(tokenKind);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        if (tokenSelector != null) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>          token = tokenSelector.selectToken(new Text(client.clusterId),<a name="line.439"></a>
+<span class="sourceLineNo">440</span>            ticket.getUGI().getTokens());<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        } else if (LOG.isDebugEnabled()) {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>          LOG.debug("No token selector found for type " + tokenKind);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        }<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      }<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      String serverKey = securityInfo.getServerPrincipal();<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      if (serverKey == null) {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        throw new IOException("Can't obtain server Kerberos config key from SecurityInfo");<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      }<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      this.serverPrincipal = SecurityUtil.getServerPrincipal(client.conf.get(serverKey),<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        address.getAddress().getCanonicalHostName().toLowerCase());<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      if (LOG.isDebugEnabled()) {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        LOG.debug("RPC Server Kerberos principal name for service=" + serviceName + " is "<a name="line.452"></a>
+<span class="sourceLineNo">453</span>            + serverPrincipal);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
+<span class="sourceLineNo">456</span><a name="line.456"></a>
+<span class="sourceLineNo">457</span>    if (!useSasl) {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      authMethod = AuthMethod.SIMPLE;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    } else if (token != null) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      authMethod = AuthMethod.DIGEST;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    } else {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      authMethod = AuthMethod.KERBEROS;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>    if (LOG.isDebugEnabled()) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      LOG.debug(<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        "Use " + authMethod + " authentication for service " + serviceName + ", sasl=" + useSasl);<a name="line.467"></a>
 <span class="sourceLineNo">468</span>    }<a name="line.468"></a>
-<span class="sourceLineNo">469</span><a name="line.469"></a>
-<span class="sourceLineNo">470</span>    if (!useSasl) {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      authMethod = AuthMethod.SIMPLE;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    } else if (token != null) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      authMethod = AuthMethod.DIGEST;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    } else {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      authMethod = AuthMethod.KERBEROS;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span><a name="line.477"></a>
-<span class="sourceLineNo">478</span>    if (LOG.isDebugEnabled()) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      LOG.debug("Use " + authMethod + " authentication for service " + serviceName +<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          ", sasl=" + useSasl);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    reloginMaxBackoff = client.conf.getInt("hbase.security.relogin.maxbackoff", 5000);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  /**<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   * Build the user information<a name="line.486"></a>
-<span class="sourceLineNo">487</span>   *<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   * @param ugi        User Group Information<a name="line.488"></a>
-<span class="sourceLineNo">489</span>   * @param authMethod Authorization method<a name="line.489"></a>
-<span class="sourceLineNo">490</span>   * @return UserInformation protobuf<a name="line.490"></a>
-<span class="sourceLineNo">491</span>   */<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  private RPCProtos.UserInformation buildUserInfo(UserGroupInformation ugi, AuthMethod authMethod) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    if (ugi == null || authMethod == AuthMethod.DIGEST) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      // Don't send user for token auth<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      return null;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    RPCProtos.UserInformation.Builder userInfoPB = RPCProtos.UserInformation.newBuilder();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    if (authMethod == AuthMethod.KERBEROS) {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // Send effective user for Kerberos auth<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      userInfoPB.setEffectiveUser(ugi.getUserName());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    } else if (authMethod == AuthMethod.SIMPLE) {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      //Send both effective user and real user for simple auth<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      userInfoPB.setEffectiveUser(ugi.getUserName());<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      if (ugi.getRealUser() != null) {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        userInfoPB.setRealUser(ugi.getRealUser().getUserName());<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      }<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    }<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    return userInfoPB.build();<a name="line.508"></a>
-<span class="sourceLineNo">509</span>  }<a name="line.509"></a>
-<span class="sourceLineNo">510</span><a name="line.510"></a>
-<span class="sourceLineNo">511</span>  /**<a name="line.511"></a>
-<span class="sourceLineNo">512</span>   * Create connection preamble<a name="line.512"></a>
-<span class="sourceLineNo">513</span>   *<a name="line.513"></a>
-<span class="sourceLineNo">514</span>   * @param byteBuf    to write to<a name="line.514"></a>
-<span class="sourceLineNo">515</span>   * @param authMethod to write<a name="line.515"></a>
-<span class="sourceLineNo">516</span>   */<a name="line.516"></a>
-<span class="sourceLineNo">517</span>  private void createPreamble(ByteBuf byteBuf, AuthMethod authMethod) {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    byteBuf.writeBytes(HConstants.RPC_HEADER);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    byteBuf.writeByte(HConstants.RPC_CURRENT_VERSION);<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    byteBuf.writeByte(authMethod.code);<a name="line.520"></a>
-<span class="sourceLineN

<TRUNCATED>

[16/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 d02b86d..372987f 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 = "bcv", 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 = "format", 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 = "format", type = "String"),<a name="line.28"></a>
+<span class="sourceLineNo">029</span>    @org.jamon.annotations.Argument(name = "filter", 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 = "bcn", 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>    // 24, 1<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    public void setBcv(String bcv)<a name="line.73"></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">074</span>    {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      // 24, 1<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      m_bcv = bcv;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      m_bcv__IsNotDefault = true;<a name="line.77"></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">078</span>    }<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public String getBcv()<a name="line.79"></a>
+<span class="sourceLineNo">079</span>    public String getFormat()<a name="line.79"></a>
 <span class="sourceLineNo">080</span>    {<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      return m_bcv;<a name="line.81"></a>
+<span class="sourceLineNo">081</span>      return m_format;<a name="line.81"></a>
 <span class="sourceLineNo">082</span>    }<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    private String m_bcv;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    public boolean getBcv__IsNotDefault()<a name="line.84"></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">085</span>    {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      return m_bcv__IsNotDefault;<a name="line.86"></a>
+<span class="sourceLineNo">086</span>      return m_format__IsNotDefault;<a name="line.86"></a>
 <span class="sourceLineNo">087</span>    }<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    private boolean m_bcv__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_format__IsNotDefault;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    // 21, 1<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    public void setFilter(String filter)<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>      // 21, 1<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      m_filter = filter;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      m_filter__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 getFilter()<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_filter;<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_filter;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    public boolean getFilter__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_filter__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>    // 22, 1<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void setFormat(String format)<a name="line.107"></a>
+<span class="sourceLineNo">105</span>    private boolean m_filter__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">108</span>    {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      // 22, 1<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      m_format = format;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>      m_format__IsNotDefault = true;<a name="line.111"></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">112</span>    }<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public String getFormat()<a name="line.113"></a>
+<span class="sourceLineNo">113</span>    public String getBcv()<a name="line.113"></a>
 <span class="sourceLineNo">114</span>    {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      return m_format;<a name="line.115"></a>
+<span class="sourceLineNo">115</span>      return m_bcv;<a name="line.115"></a>
 <span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    private String m_format;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    public boolean getFormat__IsNotDefault()<a name="line.118"></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">119</span>    {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      return m_format__IsNotDefault;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>      return m_bcv__IsNotDefault;<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    private boolean m_format__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_bcv__IsNotDefault;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    // 23, 1<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    public void setBcn(String bcn)<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>      // 23, 1<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      m_bcn = bcn;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      m_bcn__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 getBcn()<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_bcn;<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_bcn;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    public boolean getBcn__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_bcn__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_bcn__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 bcv;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcv(String p_bcv)<a name="line.152"></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">153</span>  {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    (getImplData()).setBcv(p_bcv);<a name="line.154"></a>
+<span class="sourceLineNo">154</span>    (getImplData()).setFormat(p_format);<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 filter;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFilter(String p_filter)<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()).setFilter(p_filter);<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 format;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFormat(String p_format)<a name="line.166"></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">167</span>  {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    (getImplData()).setFormat(p_format);<a name="line.168"></a>
+<span class="sourceLineNo">168</span>    (getImplData()).setBcv(p_bcv);<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 bcn;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcn(String p_bcn)<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()).setBcn(p_bcn);<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/f30982bd/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 fd5958c..3b61661 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 bcv;<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 format;<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 format;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>  private final String filter;<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 bcn;<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.getBcv__IsNotDefault())<a name="line.35"></a>
+<span class="sourceLineNo">035</span>    if(! p_implData.getFormat__IsNotDefault())<a name="line.35"></a>
 <span class="sourceLineNo">036</span>    {<a name="line.36"></a>
-<span class="sourceLineNo">037</span>      p_implData.setBcv("");<a name="line.37"></a>
+<span class="sourceLineNo">037</span>      p_implData.setFormat("html");<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.getFilter__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.setFilter("general");<a name="line.41"></a>
 <span class="sourceLineNo">042</span>    }<a name="line.42"></a>
-<span class="sourceLineNo">043</span>    if(! p_implData.getFormat__IsNotDefault())<a name="line.43"></a>
+<span class="sourceLineNo">043</span>    if(! p_implData.getBcv__IsNotDefault())<a name="line.43"></a>
 <span class="sourceLineNo">044</span>    {<a name="line.44"></a>
-<span class="sourceLineNo">045</span>      p_implData.setFormat("html");<a name="line.45"></a>
+<span class="sourceLineNo">045</span>      p_implData.setBcv("");<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.getBcn__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.setBcn("");<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>    bcv = p_implData.getBcv();<a name="line.57"></a>
-<span class="sourceLineNo">058</span>    bcn = p_implData.getBcn();<a name="line.58"></a>
-<span class="sourceLineNo">059</span>    format = p_implData.getFormat();<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    filter = p_implData.getFilter();<a name="line.60"></a>
+<span class="sourceLineNo">057</span>    format = p_implData.getFormat();<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    filter = p_implData.getFilter();<a name="line.58"></a>
+<span class="sourceLineNo">059</span>    bcv = p_implData.getBcv();<a name="line.59"></a>
+<span class="sourceLineNo">060</span>    bcn = p_implData.getBcn();<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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html b/devapidocs/src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html
index 916b04a..2d8cae8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html
@@ -38,103 +38,102 @@
 <span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.regionserver.NonReversedNonLazyKeyValueScanner;<a name="line.30"></a>
 <span class="sourceLineNo">031</span><a name="line.31"></a>
 <span class="sourceLineNo">032</span>/**<a name="line.32"></a>
-<span class="sourceLineNo">033</span> * Utility scanner that wraps a sortable collection and serves<a name="line.33"></a>
-<span class="sourceLineNo">034</span> * as a KeyValueScanner.<a name="line.34"></a>
-<span class="sourceLineNo">035</span> */<a name="line.35"></a>
-<span class="sourceLineNo">036</span>@InterfaceAudience.Private<a name="line.36"></a>
-<span class="sourceLineNo">037</span>public class CollectionBackedScanner extends NonReversedNonLazyKeyValueScanner {<a name="line.37"></a>
-<span class="sourceLineNo">038</span>  final private Iterable&lt;Cell&gt; data;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>  final CellComparator comparator;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>  private Iterator&lt;Cell&gt; iter;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>  private Cell current;<a name="line.41"></a>
-<span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>  public CollectionBackedScanner(SortedSet&lt;Cell&gt; set) {<a name="line.43"></a>
-<span class="sourceLineNo">044</span>    this(set, CellComparator.COMPARATOR);<a name="line.44"></a>
-<span class="sourceLineNo">045</span>  }<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>  public CollectionBackedScanner(SortedSet&lt;Cell&gt; set,<a name="line.47"></a>
-<span class="sourceLineNo">048</span>      CellComparator comparator) {<a name="line.48"></a>
-<span class="sourceLineNo">049</span>    this.comparator = comparator;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>    data = set;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>    init();<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>
-<span class="sourceLineNo">054</span>  public CollectionBackedScanner(List&lt;Cell&gt; list) {<a name="line.54"></a>
-<span class="sourceLineNo">055</span>    this(list, CellComparator.COMPARATOR);<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>  public CollectionBackedScanner(List&lt;Cell&gt; list,<a name="line.58"></a>
-<span class="sourceLineNo">059</span>      CellComparator comparator) {<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    Collections.sort(list, comparator);<a name="line.60"></a>
-<span class="sourceLineNo">061</span>    this.comparator = comparator;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    data = list;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    init();<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  }<a name="line.64"></a>
-<span class="sourceLineNo">065</span><a name="line.65"></a>
-<span class="sourceLineNo">066</span>  public CollectionBackedScanner(CellComparator comparator,<a name="line.66"></a>
-<span class="sourceLineNo">067</span>      Cell... array) {<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    this.comparator = comparator;<a name="line.68"></a>
-<span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>    List&lt;Cell&gt; tmp = new ArrayList&lt;Cell&gt;(array.length);<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    Collections.addAll(tmp, array);<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    Collections.sort(tmp, comparator);<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    data = tmp;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    init();<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  }<a name="line.75"></a>
-<span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private void init() {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    iter = data.iterator();<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    if(iter.hasNext()){<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      current = iter.next();<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    }<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  }<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>  @Override<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  public Cell peek() {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    return current;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  }<a name="line.87"></a>
-<span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>  @Override<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  public Cell next() {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    Cell oldCurrent = current;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    if(iter.hasNext()){<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      current = iter.next();<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    } else {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      current = null;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    }<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    return oldCurrent;<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>  @Override<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  public boolean seek(Cell seekCell) {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    // restart iterator<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    iter = data.iterator();<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    return reseek(seekCell);<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>  @Override<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  public boolean reseek(Cell seekCell) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    while(iter.hasNext()){<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      Cell next = iter.next();<a name="line.110"></a>
-<span class="sourceLineNo">111</span>      int ret = comparator.compare(next, seekCell);<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      if(ret &gt;= 0){<a name="line.112"></a>
-<span class="sourceLineNo">113</span>        current = next;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>        return true;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      }<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    return false;<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>  @Override<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  public long getSequenceID() {<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    return 0;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
-<span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>  @Override<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  public void close() {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    // do nothing<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">033</span> * Utility scanner that wraps a sortable collection and serves as a KeyValueScanner.<a name="line.33"></a>
+<span class="sourceLineNo">034</span> */<a name="line.34"></a>
+<span class="sourceLineNo">035</span>@InterfaceAudience.Private<a name="line.35"></a>
+<span class="sourceLineNo">036</span>public class CollectionBackedScanner extends NonReversedNonLazyKeyValueScanner {<a name="line.36"></a>
+<span class="sourceLineNo">037</span>  final private Iterable&lt;Cell&gt; data;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>  final CellComparator comparator;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>  private Iterator&lt;Cell&gt; iter;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  private Cell current;<a name="line.40"></a>
+<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">042</span>  public CollectionBackedScanner(SortedSet&lt;Cell&gt; set) {<a name="line.42"></a>
+<span class="sourceLineNo">043</span>    this(set, CellComparator.COMPARATOR);<a name="line.43"></a>
+<span class="sourceLineNo">044</span>  }<a name="line.44"></a>
+<span class="sourceLineNo">045</span><a name="line.45"></a>
+<span class="sourceLineNo">046</span>  public CollectionBackedScanner(SortedSet&lt;Cell&gt; set,<a name="line.46"></a>
+<span class="sourceLineNo">047</span>      CellComparator comparator) {<a name="line.47"></a>
+<span class="sourceLineNo">048</span>    this.comparator = comparator;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>    data = set;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>    init();<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>  public CollectionBackedScanner(List&lt;Cell&gt; list) {<a name="line.53"></a>
+<span class="sourceLineNo">054</span>    this(list, CellComparator.COMPARATOR);<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  }<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>  public CollectionBackedScanner(List&lt;Cell&gt; list,<a name="line.57"></a>
+<span class="sourceLineNo">058</span>      CellComparator comparator) {<a name="line.58"></a>
+<span class="sourceLineNo">059</span>    Collections.sort(list, comparator);<a name="line.59"></a>
+<span class="sourceLineNo">060</span>    this.comparator = comparator;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    data = list;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>    init();<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>  public CollectionBackedScanner(CellComparator comparator,<a name="line.65"></a>
+<span class="sourceLineNo">066</span>      Cell... array) {<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    this.comparator = comparator;<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>    List&lt;Cell&gt; tmp = new ArrayList&lt;Cell&gt;(array.length);<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    Collections.addAll(tmp, array);<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    Collections.sort(tmp, comparator);<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    data = tmp;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    init();<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>  private void init() {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>    iter = data.iterator();<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    if(iter.hasNext()){<a name="line.78"></a>
+<span class="sourceLineNo">079</span>      current = iter.next();<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><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  @Override<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  public Cell peek() {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    return current;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  }<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>  @Override<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  public Cell next() {<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    Cell oldCurrent = current;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    if(iter.hasNext()){<a name="line.91"></a>
+<span class="sourceLineNo">092</span>      current = iter.next();<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    } else {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      current = null;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    }<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    return oldCurrent;<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>  @Override<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  public boolean seek(Cell seekCell) {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    // restart iterator<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    iter = data.iterator();<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    return reseek(seekCell);<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>  @Override<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  public boolean reseek(Cell seekCell) {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    while(iter.hasNext()){<a name="line.108"></a>
+<span class="sourceLineNo">109</span>      Cell next = iter.next();<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      int ret = comparator.compare(next, seekCell);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      if(ret &gt;= 0){<a name="line.111"></a>
+<span class="sourceLineNo">112</span>        current = next;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>        return true;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>      }<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    }<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    return false;<a name="line.116"></a>
+<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>  @Override<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  public long getSequenceID() {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    return 0;<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>  @Override<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  public void close() {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    // do nothing<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
+<span class="sourceLineNo">128</span>}<a name="line.128"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/distribution-management.html
----------------------------------------------------------------------
diff --git a/distribution-management.html b/distribution-management.html
index 619d596..d7130c8 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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <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-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index c4a844f..0c78d99 100644
--- a/export_control.html
+++ b/export_control.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -330,7 +330,7 @@ for more details.</p>
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-annotations/checkstyle.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/checkstyle.html b/hbase-annotations/checkstyle.html
index b6d894d..03ccef9 100644
--- a/hbase-annotations/checkstyle.html
+++ b/hbase-annotations/checkstyle.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-annotations/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/dependencies.html b/hbase-annotations/dependencies.html
index 45afd7b..207d854 100644
--- a/hbase-annotations/dependencies.html
+++ b/hbase-annotations/dependencies.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-annotations/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/dependency-convergence.html b/hbase-annotations/dependency-convergence.html
index 0240fb2..321edc3 100644
--- a/hbase-annotations/dependency-convergence.html
+++ b/hbase-annotations/dependency-convergence.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>
@@ -1188,7 +1188,7 @@
 <td>
 <table border="0" class="bodyTable">
 <tr class="b">
-<td width="25%">3.4.6</td>
+<td width="25%">3.4.8</td>
 <td>
 <ol style="list-style-type: lower-alpha">
 <li><a class="externalLink" href="http://hbase.apache.org/hbase-client">org.apache.hbase:hbase-client</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-annotations/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/dependency-info.html b/hbase-annotations/dependency-info.html
index ae15f8b..c63007b 100644
--- a/hbase-annotations/dependency-info.html
+++ b/hbase-annotations/dependency-info.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-annotations/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/dependency-management.html b/hbase-annotations/dependency-management.html
index 8739dfd..396126d 100644
--- a/hbase-annotations/dependency-management.html
+++ b/hbase-annotations/dependency-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>
@@ -404,7 +404,7 @@
 <tr class="b">
 <td>org.apache.zookeeper</td>
 <td>zookeeper</td>
-<td>3.4.6</td>
+<td>3.4.8</td>
 <td>jar</td>
 <td>-</td></tr>
 <tr class="a">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-annotations/distribution-management.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/distribution-management.html b/hbase-annotations/distribution-management.html
index 324945c..327745d 100644
--- a/hbase-annotations/distribution-management.html
+++ b/hbase-annotations/distribution-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-annotations/index.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/index.html b/hbase-annotations/index.html
index 800763e..5c2962f 100644
--- a/hbase-annotations/index.html
+++ b/hbase-annotations/index.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-annotations/integration.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/integration.html b/hbase-annotations/integration.html
index 59ba9e1..6943c98 100644
--- a/hbase-annotations/integration.html
+++ b/hbase-annotations/integration.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-annotations/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/issue-tracking.html b/hbase-annotations/issue-tracking.html
index e28a128..5250cea 100644
--- a/hbase-annotations/issue-tracking.html
+++ b/hbase-annotations/issue-tracking.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-annotations/license.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/license.html b/hbase-annotations/license.html
index ab5c8a6..2b700fd 100644
--- a/hbase-annotations/license.html
+++ b/hbase-annotations/license.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-annotations/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/mail-lists.html b/hbase-annotations/mail-lists.html
index b7f7561..4e5be93 100644
--- a/hbase-annotations/mail-lists.html
+++ b/hbase-annotations/mail-lists.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-annotations/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/plugin-management.html b/hbase-annotations/plugin-management.html
index d241564..dba30d8 100644
--- a/hbase-annotations/plugin-management.html
+++ b/hbase-annotations/plugin-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-annotations/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/plugins.html b/hbase-annotations/plugins.html
index 4f9bb33..c6e0470 100644
--- a/hbase-annotations/plugins.html
+++ b/hbase-annotations/plugins.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-annotations/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/project-info.html b/hbase-annotations/project-info.html
index 5667eb8..ded953c 100644
--- a/hbase-annotations/project-info.html
+++ b/hbase-annotations/project-info.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-annotations/project-reports.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/project-reports.html b/hbase-annotations/project-reports.html
index 623aa71..a5791ea 100644
--- a/hbase-annotations/project-reports.html
+++ b/hbase-annotations/project-reports.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-annotations/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/project-summary.html b/hbase-annotations/project-summary.html
index d06b333..5f013b8 100644
--- a/hbase-annotations/project-summary.html
+++ b/hbase-annotations/project-summary.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-annotations/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/source-repository.html b/hbase-annotations/source-repository.html
index c1f0dcd..08df9ae 100644
--- a/hbase-annotations/source-repository.html
+++ b/hbase-annotations/source-repository.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-annotations/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-annotations/team-list.html b/hbase-annotations/team-list.html
index 0a39136..5439177 100644
--- a/hbase-annotations/team-list.html
+++ b/hbase-annotations/team-list.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Annotations">Apache HBase - Annotations</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/dependencies.html b/hbase-archetypes/dependencies.html
index ee1b620..b0ac964 100644
--- a/hbase-archetypes/dependencies.html
+++ b/hbase-archetypes/dependencies.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetypes">Apache HBase - Archetypes</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/dependency-convergence.html b/hbase-archetypes/dependency-convergence.html
index 9561809..0c86a39 100644
--- a/hbase-archetypes/dependency-convergence.html
+++ b/hbase-archetypes/dependency-convergence.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetypes">Apache HBase - Archetypes</a>
@@ -1200,7 +1200,7 @@
 <td>
 <table border="0" class="bodyTable">
 <tr class="b">
-<td width="25%">3.4.6</td>
+<td width="25%">3.4.8</td>
 <td>
 <ol style="list-style-type: lower-alpha">
 <li><a class="externalLink" href="http://hbase.apache.org/hbase-client">org.apache.hbase:hbase-client</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/dependency-info.html b/hbase-archetypes/dependency-info.html
index d487e98..d5244bd 100644
--- a/hbase-archetypes/dependency-info.html
+++ b/hbase-archetypes/dependency-info.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetypes">Apache HBase - Archetypes</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/dependency-management.html b/hbase-archetypes/dependency-management.html
index 25d12c2..d694683 100644
--- a/hbase-archetypes/dependency-management.html
+++ b/hbase-archetypes/dependency-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetypes">Apache HBase - Archetypes</a>
@@ -416,7 +416,7 @@
 <tr class="b">
 <td>org.apache.zookeeper</td>
 <td>zookeeper</td>
-<td>3.4.6</td>
+<td>3.4.8</td>
 <td>jar</td>
 <td>-</td></tr>
 <tr class="a">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/distribution-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/distribution-management.html b/hbase-archetypes/distribution-management.html
index fd42d21..4ba19f2 100644
--- a/hbase-archetypes/distribution-management.html
+++ b/hbase-archetypes/distribution-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetypes">Apache HBase - Archetypes</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-archetype-builder/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/dependencies.html b/hbase-archetypes/hbase-archetype-builder/dependencies.html
index 9e94155..6d851c3 100644
--- a/hbase-archetypes/hbase-archetype-builder/dependencies.html
+++ b/hbase-archetypes/hbase-archetype-builder/dependencies.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetype builder">Apache HBase - Archetype builder</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-archetype-builder/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/dependency-convergence.html b/hbase-archetypes/hbase-archetype-builder/dependency-convergence.html
index 5e41ac9..b55f40b 100644
--- a/hbase-archetypes/hbase-archetype-builder/dependency-convergence.html
+++ b/hbase-archetypes/hbase-archetype-builder/dependency-convergence.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetype builder">Apache HBase - Archetype builder</a>
@@ -1185,7 +1185,7 @@
 <td>
 <table border="0" class="bodyTable">
 <tr class="b">
-<td width="25%">3.4.6</td>
+<td width="25%">3.4.8</td>
 <td>
 <ol style="list-style-type: lower-alpha">
 <li><a class="externalLink" href="http://hbase.apache.org/hbase-client">org.apache.hbase:hbase-client</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-archetype-builder/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/dependency-info.html b/hbase-archetypes/hbase-archetype-builder/dependency-info.html
index cbfdc60..f390354 100644
--- a/hbase-archetypes/hbase-archetype-builder/dependency-info.html
+++ b/hbase-archetypes/hbase-archetype-builder/dependency-info.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetype builder">Apache HBase - Archetype builder</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-archetype-builder/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/dependency-management.html b/hbase-archetypes/hbase-archetype-builder/dependency-management.html
index 2f886c3..3a76be2 100644
--- a/hbase-archetypes/hbase-archetype-builder/dependency-management.html
+++ b/hbase-archetypes/hbase-archetype-builder/dependency-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetype builder">Apache HBase - Archetype builder</a>
@@ -401,7 +401,7 @@
 <tr class="b">
 <td>org.apache.zookeeper</td>
 <td>zookeeper</td>
-<td>3.4.6</td>
+<td>3.4.8</td>
 <td>jar</td>
 <td>-</td></tr>
 <tr class="a">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-archetype-builder/distribution-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/distribution-management.html b/hbase-archetypes/hbase-archetype-builder/distribution-management.html
index e6bdac3..4c3d14a 100644
--- a/hbase-archetypes/hbase-archetype-builder/distribution-management.html
+++ b/hbase-archetypes/hbase-archetype-builder/distribution-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetype builder">Apache HBase - Archetype builder</a>


[12/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html b/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
index c30a641..d3a62ff 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
@@ -99,7 +99,7 @@
 </dl>
 <hr>
 <br>
-<pre>public abstract class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.76">AbstractTestIPC</a>
+<pre>public abstract class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.75">AbstractTestIPC</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">Some basic ipc tests.</div>
 </li>
@@ -286,7 +286,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <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/ipc/AbstractTestIPC.html#line.78">LOG</a></pre>
+<pre>private static final&nbsp;org.apache.commons.logging.Log <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.77">LOG</a></pre>
 </li>
 </ul>
 <a name="CELL_BYTES">
@@ -295,7 +295,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>CELL_BYTES</h4>
-<pre>private static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.80">CELL_BYTES</a></pre>
+<pre>private static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.79">CELL_BYTES</a></pre>
 </li>
 </ul>
 <a name="CELL">
@@ -304,7 +304,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>CELL</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.KeyValue <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.81">CELL</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.KeyValue <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.80">CELL</a></pre>
 </li>
 </ul>
 <a name="BIG_CELL_BYTES">
@@ -313,7 +313,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>BIG_CELL_BYTES</h4>
-<pre>static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.82">BIG_CELL_BYTES</a></pre>
+<pre>static&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.81">BIG_CELL_BYTES</a></pre>
 </li>
 </ul>
 <a name="BIG_CELL">
@@ -322,7 +322,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>BIG_CELL</h4>
-<pre>static&nbsp;org.apache.hadoop.hbase.KeyValue <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.83">BIG_CELL</a></pre>
+<pre>static&nbsp;org.apache.hadoop.hbase.KeyValue <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.82">BIG_CELL</a></pre>
 </li>
 </ul>
 <a name="CONF">
@@ -331,7 +331,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>CONF</h4>
-<pre>static final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.84">CONF</a></pre>
+<pre>static final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.83">CONF</a></pre>
 </li>
 </ul>
 <a name="SERVICE">
@@ -340,7 +340,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SERVICE</h4>
-<pre>static final&nbsp;com.google.protobuf.BlockingService <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.89">SERVICE</a></pre>
+<pre>static final&nbsp;com.google.protobuf.BlockingService <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.88">SERVICE</a></pre>
 </li>
 </ul>
 </li>
@@ -357,7 +357,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AbstractTestIPC</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.76">AbstractTestIPC</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.75">AbstractTestIPC</a>()</pre>
 </li>
 </ul>
 </li>
@@ -374,7 +374,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createRpcClientNoCodec</h4>
-<pre>protected abstract&nbsp;org.apache.hadoop.hbase.ipc.AbstractRpcClient&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.162">createRpcClientNoCodec</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>protected abstract&nbsp;org.apache.hadoop.hbase.ipc.AbstractRpcClient&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.161">createRpcClientNoCodec</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 <a name="testNoCodec()">
@@ -383,7 +383,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testNoCodec</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.170">testNoCodec</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.169">testNoCodec</a>()
                  throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
                         <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">Ensure we do not HAVE TO HAVE a codec.</div>
@@ -398,7 +398,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createRpcClient</h4>
-<pre>protected abstract&nbsp;org.apache.hadoop.hbase.ipc.AbstractRpcClient&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.195">createRpcClient</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>protected abstract&nbsp;org.apache.hadoop.hbase.ipc.AbstractRpcClient&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.194">createRpcClient</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 <a name="testCompressCellBlock()">
@@ -407,7 +407,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testCompressCellBlock</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.207">testCompressCellBlock</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.206">testCompressCellBlock</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>,
                                   <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
                                   <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/SecurityException.html?is-external=true" title="class or interface in java.lang">SecurityException</a>,
@@ -430,7 +430,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>createRpcClientRTEDuringConnectionSetup</h4>
-<pre>protected abstract&nbsp;org.apache.hadoop.hbase.ipc.AbstractRpcClient&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.243">createRpcClientRTEDuringConnectionSetup</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
+<pre>protected abstract&nbsp;org.apache.hadoop.hbase.ipc.AbstractRpcClient&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.242">createRpcClientRTEDuringConnectionSetup</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
                                                                                                   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>
@@ -442,7 +442,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testRTEDuringConnectionSetup</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.247">testRTEDuringConnectionSetup</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.246">testRTEDuringConnectionSetup</a>()
                                   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>
@@ -454,7 +454,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testRpcScheduler</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.273">testRpcScheduler</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.272">testRpcScheduler</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>,
                              <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">Tests that the rpc scheduler is called when requests arrive.</div>
@@ -469,7 +469,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testRpcMaxRequestSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.302">testRpcMaxRequestSize</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.301">testRpcMaxRequestSize</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>,
                                   <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">Tests that the rpc scheduler is called when requests arrive.</div>
@@ -484,7 +484,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testRpcServerForNotNullRemoteAddressInCallObject</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.377">testRpcServerForNotNullRemoteAddressInCallObject</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.376">testRpcServerForNotNullRemoteAddressInCallObject</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>,
                                                              com.google.protobuf.ServiceException</pre>
 <div class="block">Tests that the RpcServer creates & dispatches CallRunner object to scheduler with non-null
@@ -500,7 +500,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testWrapException</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.407">testWrapException</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.406">testWrapException</a>()
                        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/f30982bd/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
index 7722ad3..2ef945b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -516,16 +516,16 @@
 <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.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="strong">HBaseClusterManager.CommandProvider.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="strong">ResourceChecker.Phase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterManager.ServiceType.html" title="enum in org.apache.hadoop.hbase"><span class="strong">ClusterManager.ServiceType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ScanPerformanceEvaluation.ScanCounter.html" title="enum in org.apache.hadoop.hbase"><span class="strong">ScanPerformanceEvaluation.ScanCounter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="strong">RESTApiClusterManager.Service</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="strong">PerformanceEvaluation.Counter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ScanPerformanceEvaluation.ScanCounter.html" title="enum in org.apache.hadoop.hbase"><span class="strong">ScanPerformanceEvaluation.ScanCounter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="strong">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="strong">HBaseClusterManager.CommandProvider.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="strong">RESTApiClusterManager.RoleCommand</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/TestRegionServerMetrics.Metric.html" title="enum in org.apache.hadoop.hbase"><span class="strong">TestRegionServerMetrics.Metric</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="strong">ResourceChecker.Phase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="strong">PerformanceEvaluation.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="strong">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="strong">RESTApiClusterManager.RoleCommand</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="strong">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index ebc1849..0c8eaf9 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -151,8 +151,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.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="strong">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="strong">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="strong">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html
index 70a9c22..0f32912 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html
@@ -114,7 +114,7 @@
 </dl>
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html#line.35">KeyValueScanFixture</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html#line.36">KeyValueScanFixture</a>
 extends org.apache.hadoop.hbase.util.CollectionBackedScanner</pre>
 <div class="block">A fixture that implements and presents a KeyValueScanner.
  It takes a list of key/values which is then sorted according
@@ -153,8 +153,8 @@ extends org.apache.hadoop.hbase.util.CollectionBackedScanner</pre>
 <th class="colOne" scope="col">Constructor and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colOne"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html#KeyValueScanFixture(org.apache.hadoop.hbase.CellComparator,%20org.apache.hadoop.hbase.KeyValue...)">KeyValueScanFixture</a></strong>(org.apache.hadoop.hbase.CellComparator&nbsp;comparator,
-                                      org.apache.hadoop.hbase.KeyValue...&nbsp;incData)</code>&nbsp;</td>
+<td class="colOne"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html#KeyValueScanFixture(org.apache.hadoop.hbase.CellComparator,%20org.apache.hadoop.hbase.Cell...)">KeyValueScanFixture</a></strong>(org.apache.hadoop.hbase.CellComparator&nbsp;comparator,
+                                      org.apache.hadoop.hbase.Cell...&nbsp;cells)</code>&nbsp;</td>
 </tr>
 </table>
 </li>
@@ -225,14 +225,14 @@ extends org.apache.hadoop.hbase.util.CollectionBackedScanner</pre>
 <!--   -->
 </a>
 <h3>Constructor Detail</h3>
-<a name="KeyValueScanFixture(org.apache.hadoop.hbase.CellComparator, org.apache.hadoop.hbase.KeyValue...)">
+<a name="KeyValueScanFixture(org.apache.hadoop.hbase.CellComparator, org.apache.hadoop.hbase.Cell...)">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>KeyValueScanFixture</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html#line.36">KeyValueScanFixture</a>(org.apache.hadoop.hbase.CellComparator&nbsp;comparator,
-                   org.apache.hadoop.hbase.KeyValue...&nbsp;incData)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html#line.37">KeyValueScanFixture</a>(org.apache.hadoop.hbase.CellComparator&nbsp;comparator,
+                   org.apache.hadoop.hbase.Cell...&nbsp;cells)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html
new file mode 100644
index 0000000..5f4955f
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html
@@ -0,0 +1,419 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>TestStoreScanner.CellGridStoreScanner (Apache HBase 2.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<script type="text/javascript"><!--
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="TestStoreScanner.CellGridStoreScanner (Apache HBase 2.0.0-SNAPSHOT Test API)";
+    }
+//-->
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar_top">
+<!--   -->
+</a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestStoreScanner.CellGridStoreScanner.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Prev Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStripeCompactor.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Next Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" target="_top">Frames</a></li>
+<li><a href="TestStoreScanner.CellGridStoreScanner.html" target="_top">No Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../allclasses-noframe.html">All Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li><a href="#nested_classes_inherited_from_class_org.apache.hadoop.hbase.regionserver.StoreScanner">Nested</a>&nbsp;|&nbsp;</li>
+<li><a href="#field_summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor_summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method_summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field_detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor_detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method_detail">Method</a></li>
+</ul>
+</div>
+<a name="skip-navbar_top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.regionserver</div>
+<h2 title="Class TestStoreScanner.CellGridStoreScanner" class="title">Class TestStoreScanner.CellGridStoreScanner</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.regionserver.NonLazyKeyValueScanner</li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.regionserver.NonReversedNonLazyKeyValueScanner</li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.regionserver.StoreScanner</li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.regionserver.TestStoreScanner.CellGridStoreScanner</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<dl>
+<dt>All Implemented Interfaces:</dt>
+<dd><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>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/AutoCloseable.html?is-external=true" title="class or interface in java.lang">AutoCloseable</a>, org.apache.hadoop.hbase.regionserver.ChangedReadersObserver, org.apache.hadoop.hbase.regionserver.InternalScanner, org.apache.hadoop.hbase.regionserver.KeyValueScanner, org.apache.hadoop.hbase.regionserver.Shipper</dd>
+</dl>
+<dl>
+<dt>Enclosing class:</dt>
+<dd><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dd>
+</dl>
+<hr>
+<br>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.133">TestStoreScanner.CellGridStoreScanner</a>
+extends org.apache.hadoop.hbase.regionserver.StoreScanner</pre>
+<div class="block">A StoreScanner for our CELL_GRID above. Fakes the block transitions. Does counts of
+ calls to optimize and counts of when optimize actually did an optimize.</div>
+</li>
+</ul>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="nested_class_summary">
+<!--   -->
+</a>
+<h3>Nested Class Summary</h3>
+<ul class="blockList">
+<li class="blockList"><a name="nested_classes_inherited_from_class_org.apache.hadoop.hbase.regionserver.StoreScanner">
+<!--   -->
+</a>
+<h3>Nested classes/interfaces inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.StoreScanner</h3>
+<code>org.apache.hadoop.hbase.regionserver.StoreScanner.StoreScannerCompactionRace</code></li>
+</ul>
+</li>
+</ul>
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field_summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
+<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>(package private) <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></code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html#count">count</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>(package private) <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></code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html#optimization">optimization</a></strong></code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="fields_inherited_from_class_org.apache.hadoop.hbase.regionserver.StoreScanner">
+<!--   -->
+</a>
+<h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.StoreScanner</h3>
+<code>cacheBlocks, cellsPerHeartbeatCheck, closing, columns, countPerRow, currentScanners, DEFAULT_HBASE_CELLS_SCANNED_PER_HEARTBEAT_CHECK, executor, explicitColumnQuery, flushed, flushedStoreFiles, get, HBASE_CELLS_SCANNED_PER_HEARTBEAT_CHECK, heap, heapsForDelayedClose, lastTop, LAZY_SEEK_ENABLED_BY_DEFAULT, lazySeekEnabledGlobally, matcher, maxRowSize, minVersions, now, oldestUnexpiredTS, parallelSeekEnabled, readPt, scan, store, storeLimit, storeOffset, STORESCANNER_PARALLEL_SEEK_ENABLE, useRowColBloom</code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="fields_inherited_from_class_org.apache.hadoop.hbase.regionserver.KeyValueScanner">
+<!--   -->
+</a>
+<h3>Fields inherited from interface&nbsp;org.apache.hadoop.hbase.regionserver.KeyValueScanner</h3>
+<code>NO_NEXT_INDEXED_KEY</code></li>
+</ul>
+</li>
+</ul>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor_summary">
+<!--   -->
+</a>
+<h3>Constructor Summary</h3>
+<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
+<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html#TestStoreScanner.CellGridStoreScanner(org.apache.hadoop.hbase.client.Scan,%20org.apache.hadoop.hbase.regionserver.ScanInfo,%20org.apache.hadoop.hbase.regionserver.ScanType)">TestStoreScanner.CellGridStoreScanner</a></strong>(org.apache.hadoop.hbase.client.Scan&nbsp;scan,
+                                                                          org.apache.hadoop.hbase.regionserver.ScanInfo&nbsp;scanInfo,
+                                                                          org.apache.hadoop.hbase.regionserver.ScanType&nbsp;scanType)</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method_summary">
+<!--   -->
+</a>
+<h3>Method Summary</h3>
+<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
+<caption><span>Methods</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>org.apache.hadoop.hbase.Cell</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html#getNextIndexedKey()">getNextIndexedKey</a></strong>()</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>protected org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html#optimize(org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode,%20org.apache.hadoop.hbase.Cell)">optimize</a></strong>(org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode&nbsp;qcode,
+                org.apache.hadoop.hbase.Cell&nbsp;cell)</code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods_inherited_from_class_org.apache.hadoop.hbase.regionserver.StoreScanner">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.StoreScanner</h3>
+<code><clinit>, addCurrentScanners, checkFlushed, checkReseek, checkScanOrder, close, enableLazySeekGlobally, getAllScannersForTesting, getEstimatedNumberOfKvsScanned, getScannersNoCompaction, getSequenceID, next, next, next, peek, reseek, resetKVHeap, resetScannerStack, seek, seekAsDirection, seekScanners, seekToNextRow, selectScannersFrom, shipped, updateReaders</code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods_inherited_from_class_org.apache.hadoop.hbase.regionserver.NonReversedNonLazyKeyValueScanner">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.NonReversedNonLazyKeyValueScanner</h3>
+<code>backwardSeek, seekToLastRow, seekToPreviousRow</code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods_inherited_from_class_org.apache.hadoop.hbase.regionserver.NonLazyKeyValueScanner">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.NonLazyKeyValueScanner</h3>
+<code>doRealSeek, enforceSeek, isFileScanner, realSeekDone, requestSeek, shouldUseScanner</code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;java.lang.<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></h3>
+<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#clone()" title="class or interface in java.lang">clone</a>, <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>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#finalize()" title="class or interface in java.lang">finalize</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang">getClass</a>, <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>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#notify()" title="class or interface in java.lang">notify</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang
 /Object.html?is-external=true#notifyAll()" title="class or interface in java.lang">notifyAll</a>, <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>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#wait()" title="class or interface in java.lang">wait</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#wait(long)" title="class or interface in java.lang">wait</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#wait(long,%20int)" title="class or interface in java.lang">wait</a></code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods_inherited_from_class_org.apache.hadoop.hbase.regionserver.KeyValueScanner">
+<!--   -->
+</a>
+<h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.regionserver.KeyValueScanner</h3>
+<code>backwardSeek, enforceSeek, isFileScanner, realSeekDone, requestSeek, seekToLastRow, seekToPreviousRow, shouldUseScanner</code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="details">
+<ul class="blockList">
+<li class="blockList">
+<!-- ============ FIELD DETAIL =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field_detail">
+<!--   -->
+</a>
+<h3>Field Detail</h3>
+<a name="count">
+<!--   -->
+</a>
+<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/TestStoreScanner.CellGridStoreScanner.html#line.135">count</a></pre>
+</li>
+</ul>
+<a name="optimization">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>optimization</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/TestStoreScanner.CellGridStoreScanner.html#line.136">optimization</a></pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor_detail">
+<!--   -->
+</a>
+<h3>Constructor Detail</h3>
+<a name="TestStoreScanner.CellGridStoreScanner(org.apache.hadoop.hbase.client.Scan, org.apache.hadoop.hbase.regionserver.ScanInfo, org.apache.hadoop.hbase.regionserver.ScanType)">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TestStoreScanner.CellGridStoreScanner</h4>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html#line.138">TestStoreScanner.CellGridStoreScanner</a>(org.apache.hadoop.hbase.client.Scan&nbsp;scan,
+                                     org.apache.hadoop.hbase.regionserver.ScanInfo&nbsp;scanInfo,
+                                     org.apache.hadoop.hbase.regionserver.ScanType&nbsp;scanType)
+                                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>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method_detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="optimize(org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode, org.apache.hadoop.hbase.Cell)">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>optimize</h4>
+<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html#line.145">optimize</a>(org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode&nbsp;qcode,
+                                                                       org.apache.hadoop.hbase.Cell&nbsp;cell)</pre>
+<dl>
+<dt><strong>Overrides:</strong></dt>
+<dd><code>optimize</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.regionserver.StoreScanner</code></dd>
+</dl>
+</li>
+</ul>
+<a name="getNextIndexedKey()">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>getNextIndexedKey</h4>
+<pre>public&nbsp;org.apache.hadoop.hbase.Cell&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html#line.157">getNextIndexedKey</a>()</pre>
+<dl>
+<dt><strong>Specified by:</strong></dt>
+<dd><code>getNextIndexedKey</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.regionserver.KeyValueScanner</code></dd>
+<dt><strong>Overrides:</strong></dt>
+<dd><code>getNextIndexedKey</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.regionserver.StoreScanner</code></dd>
+</dl>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar_bottom">
+<!--   -->
+</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestStoreScanner.CellGridStoreScanner.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Prev Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStripeCompactor.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Next Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" target="_top">Frames</a></li>
+<li><a href="TestStoreScanner.CellGridStoreScanner.html" target="_top">No Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../allclasses-noframe.html">All Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li><a href="#nested_classes_inherited_from_class_org.apache.hadoop.hbase.regionserver.StoreScanner">Nested</a>&nbsp;|&nbsp;</li>
+<li><a href="#field_summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor_summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method_summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field_detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor_detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method_detail">Method</a></li>
+</ul>
+</div>
+<a name="skip-navbar_bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2016 <a href="http://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>


[15/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-archetype-builder/index.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/index.html b/hbase-archetypes/hbase-archetype-builder/index.html
index 548c865..5eab91a 100644
--- a/hbase-archetypes/hbase-archetype-builder/index.html
+++ b/hbase-archetypes/hbase-archetype-builder/index.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetype builder">Apache HBase - Archetype builder</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-archetype-builder/integration.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/integration.html b/hbase-archetypes/hbase-archetype-builder/integration.html
index 22cbe4c..883b16c 100644
--- a/hbase-archetypes/hbase-archetype-builder/integration.html
+++ b/hbase-archetypes/hbase-archetype-builder/integration.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetype builder">Apache HBase - Archetype builder</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-archetype-builder/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/issue-tracking.html b/hbase-archetypes/hbase-archetype-builder/issue-tracking.html
index 1c66f9a..d94c8ff 100644
--- a/hbase-archetypes/hbase-archetype-builder/issue-tracking.html
+++ b/hbase-archetypes/hbase-archetype-builder/issue-tracking.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetype builder">Apache HBase - Archetype builder</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-archetype-builder/license.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/license.html b/hbase-archetypes/hbase-archetype-builder/license.html
index ebfa999..e9b909d 100644
--- a/hbase-archetypes/hbase-archetype-builder/license.html
+++ b/hbase-archetypes/hbase-archetype-builder/license.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetype builder">Apache HBase - Archetype builder</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-archetype-builder/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/mail-lists.html b/hbase-archetypes/hbase-archetype-builder/mail-lists.html
index 742cc28..258487d 100644
--- a/hbase-archetypes/hbase-archetype-builder/mail-lists.html
+++ b/hbase-archetypes/hbase-archetype-builder/mail-lists.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetype builder">Apache HBase - Archetype builder</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-archetype-builder/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/plugin-management.html b/hbase-archetypes/hbase-archetype-builder/plugin-management.html
index 8f9ebd1..d774060 100644
--- a/hbase-archetypes/hbase-archetype-builder/plugin-management.html
+++ b/hbase-archetypes/hbase-archetype-builder/plugin-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetype builder">Apache HBase - Archetype builder</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-archetype-builder/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/plugins.html b/hbase-archetypes/hbase-archetype-builder/plugins.html
index 17d6768..ca63a54 100644
--- a/hbase-archetypes/hbase-archetype-builder/plugins.html
+++ b/hbase-archetypes/hbase-archetype-builder/plugins.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetype builder">Apache HBase - Archetype builder</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-archetype-builder/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/project-info.html b/hbase-archetypes/hbase-archetype-builder/project-info.html
index 99ba1e3..06fef19 100644
--- a/hbase-archetypes/hbase-archetype-builder/project-info.html
+++ b/hbase-archetypes/hbase-archetype-builder/project-info.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetype builder">Apache HBase - Archetype builder</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-archetype-builder/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/project-summary.html b/hbase-archetypes/hbase-archetype-builder/project-summary.html
index 0b3f9f7..01566b1 100644
--- a/hbase-archetypes/hbase-archetype-builder/project-summary.html
+++ b/hbase-archetypes/hbase-archetype-builder/project-summary.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetype builder">Apache HBase - Archetype builder</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-archetype-builder/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/source-repository.html b/hbase-archetypes/hbase-archetype-builder/source-repository.html
index 35fc903..f35ff5a 100644
--- a/hbase-archetypes/hbase-archetype-builder/source-repository.html
+++ b/hbase-archetypes/hbase-archetype-builder/source-repository.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetype builder">Apache HBase - Archetype builder</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-archetype-builder/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-archetype-builder/team-list.html b/hbase-archetypes/hbase-archetype-builder/team-list.html
index b9b8ef9..45d67b6 100644
--- a/hbase-archetypes/hbase-archetype-builder/team-list.html
+++ b/hbase-archetypes/hbase-archetype-builder/team-list.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetype builder">Apache HBase - Archetype builder</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-client-project/checkstyle.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/checkstyle.html b/hbase-archetypes/hbase-client-project/checkstyle.html
index a6d1659..a2a698e 100644
--- a/hbase-archetypes/hbase-client-project/checkstyle.html
+++ b/hbase-archetypes/hbase-client-project/checkstyle.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-client archetype">Apache HBase - Exemplar for hbase-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-client-project/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/dependencies.html b/hbase-archetypes/hbase-client-project/dependencies.html
index 69317e8..74721d8 100644
--- a/hbase-archetypes/hbase-client-project/dependencies.html
+++ b/hbase-archetypes/hbase-client-project/dependencies.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-client archetype">Apache HBase - Exemplar for hbase-client archetype</a>
@@ -476,7 +476,7 @@
 <tr class="b">
 <td>org.apache.zookeeper</td>
 <td>zookeeper</td>
-<td>3.4.6</td>
+<td>3.4.8</td>
 <td>jar</td>
 <td>-</td></tr>
 <tr class="a">
@@ -2255,7 +2255,7 @@ file comparators, endian transformation classes, and much more.</p>
     clients.</p>
 <p><b>URL: </b><a class="externalLink" href="http://netty.io/netty-all/">http://netty.io/netty-all/</a></p>
 <p><b>Project License: </b><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a></p></td></tr></table></div></li>
-<li>org.apache.zookeeper:zookeeper:jar:3.4.6 (compile) <img id="_img251" src="./images/icon_info_sml.gif" alt="Information" onclick="toggleDependencyDetail( '_dep250', '_img251' );" style="cursor: pointer;vertical-align:text-bottom;"></img><div id="_dep250" style="display:none">
+<li>org.apache.zookeeper:zookeeper:jar:3.4.8 (compile) <img id="_img251" src="./images/icon_info_sml.gif" alt="Information" onclick="toggleDependencyDetail( '_dep250', '_img251' );" style="cursor: pointer;vertical-align:text-bottom;"></img><div id="_dep250" style="display:none">
 <table border="0" class="bodyTable">
 <tr class="a">
 <th>zookeeper</th></tr>
@@ -3230,7 +3230,7 @@ built on Jackson JSON processor</p>
 <td>-</td></tr>
 <tr class="b">
 <td>hbase-server-2.0.0-SNAPSHOT-tests.jar</td>
-<td>7.38 MB</td>
+<td>7.39 MB</td>
 <td>-</td>
 <td>-</td>
 <td>-</td>
@@ -3301,10 +3301,10 @@ built on Jackson JSON processor</p>
 <td>debug</td>
 <td>-</td></tr>
 <tr class="b">
-<td>zookeeper-3.4.6.jar</td>
-<td>774.38 kB</td>
-<td>464</td>
-<td>440</td>
+<td>zookeeper-3.4.8.jar</td>
+<td>785.74 kB</td>
+<td>471</td>
+<td>447</td>
 <td>19</td>
 <td>1.5</td>
 <td>debug</td>
@@ -3536,18 +3536,18 @@ built on Jackson JSON processor</p>
 <th>Sealed</th></tr>
 <tr class="b">
 <td>125</td>
-<td>62.01 MB</td>
-<td>30,362</td>
-<td>26,831</td>
+<td>62.03 MB</td>
+<td>30,369</td>
+<td>26,838</td>
 <td>1,372</td>
 <td>1.6</td>
 <td>99</td>
 <td>1</td></tr>
 <tr class="a">
 <td>compile: 64</td>
-<td>compile: 23.47 MB</td>
-<td>compile: 16,718</td>
-<td>compile: 14,796</td>
+<td>compile: 23.49 MB</td>
+<td>compile: 16,725</td>
+<td>compile: 14,803</td>
 <td>compile: 802</td>
 <td>-</td>
 <td>compile: 58</td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-client-project/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/dependency-convergence.html b/hbase-archetypes/hbase-client-project/dependency-convergence.html
index bee07a7..8dda872 100644
--- a/hbase-archetypes/hbase-client-project/dependency-convergence.html
+++ b/hbase-archetypes/hbase-client-project/dependency-convergence.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-client archetype">Apache HBase - Exemplar for hbase-client archetype</a>
@@ -1188,7 +1188,7 @@
 <td>
 <table border="0" class="bodyTable">
 <tr class="b">
-<td width="25%">3.4.6</td>
+<td width="25%">3.4.8</td>
 <td>
 <ol style="list-style-type: lower-alpha">
 <li><a class="externalLink" href="http://hbase.apache.org/hbase-client">org.apache.hbase:hbase-client</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-client-project/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/dependency-info.html b/hbase-archetypes/hbase-client-project/dependency-info.html
index 9c8e37a..7fcce27 100644
--- a/hbase-archetypes/hbase-client-project/dependency-info.html
+++ b/hbase-archetypes/hbase-client-project/dependency-info.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-client archetype">Apache HBase - Exemplar for hbase-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-client-project/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/dependency-management.html b/hbase-archetypes/hbase-client-project/dependency-management.html
index 2931879..85c55d4 100644
--- a/hbase-archetypes/hbase-client-project/dependency-management.html
+++ b/hbase-archetypes/hbase-client-project/dependency-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-client archetype">Apache HBase - Exemplar for hbase-client archetype</a>
@@ -404,7 +404,7 @@
 <tr class="b">
 <td>org.apache.zookeeper</td>
 <td>zookeeper</td>
-<td>3.4.6</td>
+<td>3.4.8</td>
 <td>jar</td>
 <td>-</td></tr>
 <tr class="a">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-client-project/distribution-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/distribution-management.html b/hbase-archetypes/hbase-client-project/distribution-management.html
index 67048c0..e5dbefb 100644
--- a/hbase-archetypes/hbase-client-project/distribution-management.html
+++ b/hbase-archetypes/hbase-client-project/distribution-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-client archetype">Apache HBase - Exemplar for hbase-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-client-project/index.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/index.html b/hbase-archetypes/hbase-client-project/index.html
index b462b3e..49480c6 100644
--- a/hbase-archetypes/hbase-client-project/index.html
+++ b/hbase-archetypes/hbase-client-project/index.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-client archetype">Apache HBase - Exemplar for hbase-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-client-project/integration.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/integration.html b/hbase-archetypes/hbase-client-project/integration.html
index 2f2cec5..d1e81f3 100644
--- a/hbase-archetypes/hbase-client-project/integration.html
+++ b/hbase-archetypes/hbase-client-project/integration.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-client archetype">Apache HBase - Exemplar for hbase-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-client-project/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/issue-tracking.html b/hbase-archetypes/hbase-client-project/issue-tracking.html
index eef3cde..8a9ab57 100644
--- a/hbase-archetypes/hbase-client-project/issue-tracking.html
+++ b/hbase-archetypes/hbase-client-project/issue-tracking.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-client archetype">Apache HBase - Exemplar for hbase-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-client-project/license.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/license.html b/hbase-archetypes/hbase-client-project/license.html
index 6011370..0f6d6a2 100644
--- a/hbase-archetypes/hbase-client-project/license.html
+++ b/hbase-archetypes/hbase-client-project/license.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-client archetype">Apache HBase - Exemplar for hbase-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-client-project/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/mail-lists.html b/hbase-archetypes/hbase-client-project/mail-lists.html
index c25c342..8720084 100644
--- a/hbase-archetypes/hbase-client-project/mail-lists.html
+++ b/hbase-archetypes/hbase-client-project/mail-lists.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-client archetype">Apache HBase - Exemplar for hbase-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-client-project/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/plugin-management.html b/hbase-archetypes/hbase-client-project/plugin-management.html
index 7cc8c01..11287d4 100644
--- a/hbase-archetypes/hbase-client-project/plugin-management.html
+++ b/hbase-archetypes/hbase-client-project/plugin-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-client archetype">Apache HBase - Exemplar for hbase-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-client-project/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/plugins.html b/hbase-archetypes/hbase-client-project/plugins.html
index 14a8d2a..115dbac 100644
--- a/hbase-archetypes/hbase-client-project/plugins.html
+++ b/hbase-archetypes/hbase-client-project/plugins.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-client archetype">Apache HBase - Exemplar for hbase-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-client-project/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/project-info.html b/hbase-archetypes/hbase-client-project/project-info.html
index 1da37ce..959f8b6 100644
--- a/hbase-archetypes/hbase-client-project/project-info.html
+++ b/hbase-archetypes/hbase-client-project/project-info.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-client archetype">Apache HBase - Exemplar for hbase-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-client-project/project-reports.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/project-reports.html b/hbase-archetypes/hbase-client-project/project-reports.html
index 97beb9b..3dbcbd5 100644
--- a/hbase-archetypes/hbase-client-project/project-reports.html
+++ b/hbase-archetypes/hbase-client-project/project-reports.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-client archetype">Apache HBase - Exemplar for hbase-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-client-project/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/project-summary.html b/hbase-archetypes/hbase-client-project/project-summary.html
index 5699ad4..7faa46e 100644
--- a/hbase-archetypes/hbase-client-project/project-summary.html
+++ b/hbase-archetypes/hbase-client-project/project-summary.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-client archetype">Apache HBase - Exemplar for hbase-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-client-project/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/source-repository.html b/hbase-archetypes/hbase-client-project/source-repository.html
index 1f4b89f..8e5e4a0 100644
--- a/hbase-archetypes/hbase-client-project/source-repository.html
+++ b/hbase-archetypes/hbase-client-project/source-repository.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-client archetype">Apache HBase - Exemplar for hbase-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-client-project/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-client-project/team-list.html b/hbase-archetypes/hbase-client-project/team-list.html
index 17140c9..d4b39c5 100644
--- a/hbase-archetypes/hbase-client-project/team-list.html
+++ b/hbase-archetypes/hbase-client-project/team-list.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-client archetype">Apache HBase - Exemplar for hbase-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-shaded-client-project/checkstyle.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/checkstyle.html b/hbase-archetypes/hbase-shaded-client-project/checkstyle.html
index 0f8ea3d..37c9a7c 100644
--- a/hbase-archetypes/hbase-shaded-client-project/checkstyle.html
+++ b/hbase-archetypes/hbase-shaded-client-project/checkstyle.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-shaded-client archetype">Apache HBase - Exemplar for hbase-shaded-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-shaded-client-project/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/dependencies.html b/hbase-archetypes/hbase-shaded-client-project/dependencies.html
index f077d9a..ff98b15 100644
--- a/hbase-archetypes/hbase-shaded-client-project/dependencies.html
+++ b/hbase-archetypes/hbase-shaded-client-project/dependencies.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-shaded-client archetype">Apache HBase - Exemplar for hbase-shaded-client archetype</a>
@@ -482,7 +482,7 @@
 <tr class="a">
 <td>org.apache.zookeeper</td>
 <td>zookeeper</td>
-<td>3.4.6</td>
+<td>3.4.8</td>
 <td>jar</td>
 <td>-</td></tr>
 <tr class="b">
@@ -1247,7 +1247,7 @@ file comparators, endian transformation classes, and much more.</p>
     clients.</p>
 <p><b>URL: </b><a class="externalLink" href="http://netty.io/netty-all/">http://netty.io/netty-all/</a></p>
 <p><b>Project License: </b><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a></p></td></tr></table></div></li>
-<li>org.apache.zookeeper:zookeeper:jar:3.4.6 (compile) <img id="_img37" src="./images/icon_info_sml.gif" alt="Information" onclick="toggleDependencyDetail( '_dep36', '_img37' );" style="cursor: pointer;vertical-align:text-bottom;"></img><div id="_dep36" style="display:none">
+<li>org.apache.zookeeper:zookeeper:jar:3.4.8 (compile) <img id="_img37" src="./images/icon_info_sml.gif" alt="Information" onclick="toggleDependencyDetail( '_dep36', '_img37' );" style="cursor: pointer;vertical-align:text-bottom;"></img><div id="_dep36" style="display:none">
 <table border="0" class="bodyTable">
 <tr class="a">
 <th>zookeeper</th></tr>
@@ -3245,7 +3245,7 @@ These include: bzip2, gzip, pack200, xz and ar, cpio, jar, tar, zip, dump.</p>
 <td>-</td></tr>
 <tr class="b">
 <td>hbase-server-2.0.0-SNAPSHOT-tests.jar</td>
-<td>7.38 MB</td>
+<td>7.39 MB</td>
 <td>-</td>
 <td>-</td>
 <td>-</td>
@@ -3325,10 +3325,10 @@ These include: bzip2, gzip, pack200, xz and ar, cpio, jar, tar, zip, dump.</p>
 <td>debug</td>
 <td>-</td></tr>
 <tr class="a">
-<td>zookeeper-3.4.6.jar</td>
-<td>774.38 kB</td>
-<td>464</td>
-<td>440</td>
+<td>zookeeper-3.4.8.jar</td>
+<td>785.74 kB</td>
+<td>471</td>
+<td>447</td>
 <td>19</td>
 <td>1.5</td>
 <td>debug</td>
@@ -3560,18 +3560,18 @@ These include: bzip2, gzip, pack200, xz and ar, cpio, jar, tar, zip, dump.</p>
 <th>Sealed</th></tr>
 <tr class="a">
 <td>126</td>
-<td>62.01 MB</td>
-<td>30,362</td>
-<td>26,831</td>
+<td>62.03 MB</td>
+<td>30,369</td>
+<td>26,838</td>
 <td>1,372</td>
 <td>1.6</td>
 <td>99</td>
 <td>1</td></tr>
 <tr class="b">
 <td>compile: 65</td>
-<td>compile: 23.48 MB</td>
-<td>compile: 16,718</td>
-<td>compile: 14,796</td>
+<td>compile: 23.49 MB</td>
+<td>compile: 16,725</td>
+<td>compile: 14,803</td>
 <td>compile: 802</td>
 <td>-</td>
 <td>compile: 58</td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-shaded-client-project/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/dependency-convergence.html b/hbase-archetypes/hbase-shaded-client-project/dependency-convergence.html
index edaf60f..32a39fd 100644
--- a/hbase-archetypes/hbase-shaded-client-project/dependency-convergence.html
+++ b/hbase-archetypes/hbase-shaded-client-project/dependency-convergence.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-shaded-client archetype">Apache HBase - Exemplar for hbase-shaded-client archetype</a>
@@ -1188,7 +1188,7 @@
 <td>
 <table border="0" class="bodyTable">
 <tr class="b">
-<td width="25%">3.4.6</td>
+<td width="25%">3.4.8</td>
 <td>
 <ol style="list-style-type: lower-alpha">
 <li><a class="externalLink" href="http://hbase.apache.org/hbase-client">org.apache.hbase:hbase-client</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-shaded-client-project/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/dependency-info.html b/hbase-archetypes/hbase-shaded-client-project/dependency-info.html
index 7ebc95d..2f889f6 100644
--- a/hbase-archetypes/hbase-shaded-client-project/dependency-info.html
+++ b/hbase-archetypes/hbase-shaded-client-project/dependency-info.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-shaded-client archetype">Apache HBase - Exemplar for hbase-shaded-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-shaded-client-project/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/dependency-management.html b/hbase-archetypes/hbase-shaded-client-project/dependency-management.html
index 8220c40..e6d60d2 100644
--- a/hbase-archetypes/hbase-shaded-client-project/dependency-management.html
+++ b/hbase-archetypes/hbase-shaded-client-project/dependency-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-shaded-client archetype">Apache HBase - Exemplar for hbase-shaded-client archetype</a>
@@ -404,7 +404,7 @@
 <tr class="b">
 <td>org.apache.zookeeper</td>
 <td>zookeeper</td>
-<td>3.4.6</td>
+<td>3.4.8</td>
 <td>jar</td>
 <td>-</td></tr>
 <tr class="a">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-shaded-client-project/distribution-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/distribution-management.html b/hbase-archetypes/hbase-shaded-client-project/distribution-management.html
index 2a21e8d..0900cf2 100644
--- a/hbase-archetypes/hbase-shaded-client-project/distribution-management.html
+++ b/hbase-archetypes/hbase-shaded-client-project/distribution-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-shaded-client archetype">Apache HBase - Exemplar for hbase-shaded-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-shaded-client-project/index.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/index.html b/hbase-archetypes/hbase-shaded-client-project/index.html
index 936a75a..06d309d 100644
--- a/hbase-archetypes/hbase-shaded-client-project/index.html
+++ b/hbase-archetypes/hbase-shaded-client-project/index.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-shaded-client archetype">Apache HBase - Exemplar for hbase-shaded-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-shaded-client-project/integration.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/integration.html b/hbase-archetypes/hbase-shaded-client-project/integration.html
index 2e51080..25877db 100644
--- a/hbase-archetypes/hbase-shaded-client-project/integration.html
+++ b/hbase-archetypes/hbase-shaded-client-project/integration.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-shaded-client archetype">Apache HBase - Exemplar for hbase-shaded-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-shaded-client-project/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/issue-tracking.html b/hbase-archetypes/hbase-shaded-client-project/issue-tracking.html
index 208388b..852b16a 100644
--- a/hbase-archetypes/hbase-shaded-client-project/issue-tracking.html
+++ b/hbase-archetypes/hbase-shaded-client-project/issue-tracking.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-shaded-client archetype">Apache HBase - Exemplar for hbase-shaded-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-shaded-client-project/license.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/license.html b/hbase-archetypes/hbase-shaded-client-project/license.html
index 92f4b0d..982e2dc 100644
--- a/hbase-archetypes/hbase-shaded-client-project/license.html
+++ b/hbase-archetypes/hbase-shaded-client-project/license.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-shaded-client archetype">Apache HBase - Exemplar for hbase-shaded-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-shaded-client-project/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/mail-lists.html b/hbase-archetypes/hbase-shaded-client-project/mail-lists.html
index 2126c4f..c023baf 100644
--- a/hbase-archetypes/hbase-shaded-client-project/mail-lists.html
+++ b/hbase-archetypes/hbase-shaded-client-project/mail-lists.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-shaded-client archetype">Apache HBase - Exemplar for hbase-shaded-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-shaded-client-project/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/plugin-management.html b/hbase-archetypes/hbase-shaded-client-project/plugin-management.html
index aafab6c..13bb05d 100644
--- a/hbase-archetypes/hbase-shaded-client-project/plugin-management.html
+++ b/hbase-archetypes/hbase-shaded-client-project/plugin-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-shaded-client archetype">Apache HBase - Exemplar for hbase-shaded-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-shaded-client-project/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/plugins.html b/hbase-archetypes/hbase-shaded-client-project/plugins.html
index b037937..fb0c3eb 100644
--- a/hbase-archetypes/hbase-shaded-client-project/plugins.html
+++ b/hbase-archetypes/hbase-shaded-client-project/plugins.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-shaded-client archetype">Apache HBase - Exemplar for hbase-shaded-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-shaded-client-project/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/project-info.html b/hbase-archetypes/hbase-shaded-client-project/project-info.html
index 41d00c0..c255891 100644
--- a/hbase-archetypes/hbase-shaded-client-project/project-info.html
+++ b/hbase-archetypes/hbase-shaded-client-project/project-info.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-shaded-client archetype">Apache HBase - Exemplar for hbase-shaded-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-shaded-client-project/project-reports.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/project-reports.html b/hbase-archetypes/hbase-shaded-client-project/project-reports.html
index c00356b..ee95058 100644
--- a/hbase-archetypes/hbase-shaded-client-project/project-reports.html
+++ b/hbase-archetypes/hbase-shaded-client-project/project-reports.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-shaded-client archetype">Apache HBase - Exemplar for hbase-shaded-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-shaded-client-project/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/project-summary.html b/hbase-archetypes/hbase-shaded-client-project/project-summary.html
index 1ad0a5d..af6a77c 100644
--- a/hbase-archetypes/hbase-shaded-client-project/project-summary.html
+++ b/hbase-archetypes/hbase-shaded-client-project/project-summary.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-shaded-client archetype">Apache HBase - Exemplar for hbase-shaded-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-shaded-client-project/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/source-repository.html b/hbase-archetypes/hbase-shaded-client-project/source-repository.html
index 1c27cd6..1194daf 100644
--- a/hbase-archetypes/hbase-shaded-client-project/source-repository.html
+++ b/hbase-archetypes/hbase-shaded-client-project/source-repository.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-shaded-client archetype">Apache HBase - Exemplar for hbase-shaded-client archetype</a>


[46/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.CreateRescanAsyncCallback.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.CreateRescanAsyncCallback.html b/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.CreateRescanAsyncCallback.html
index b8415c8..9835bab 100644
--- a/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.CreateRescanAsyncCallback.html
+++ b/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.CreateRescanAsyncCallback.html
@@ -127,7 +127,7 @@ implements org.apache.zookeeper.AsyncCallback.StringCallback</pre>
 <!--   -->
 </a>
 <h3>Nested classes/interfaces inherited from interface&nbsp;org.apache.zookeeper.AsyncCallback</h3>
-<code>org.apache.zookeeper.AsyncCallback.ACLCallback, org.apache.zookeeper.AsyncCallback.Children2Callback, org.apache.zookeeper.AsyncCallback.ChildrenCallback, org.apache.zookeeper.AsyncCallback.DataCallback, org.apache.zookeeper.AsyncCallback.StatCallback, org.apache.zookeeper.AsyncCallback.StringCallback, org.apache.zookeeper.AsyncCallback.VoidCallback</code></li>
+<code>org.apache.zookeeper.AsyncCallback.ACLCallback, org.apache.zookeeper.AsyncCallback.Children2Callback, org.apache.zookeeper.AsyncCallback.ChildrenCallback, org.apache.zookeeper.AsyncCallback.DataCallback, org.apache.zookeeper.AsyncCallback.MultiCallback, org.apache.zookeeper.AsyncCallback.StatCallback, org.apache.zookeeper.AsyncCallback.StringCallback, org.apache.zookeeper.AsyncCallback.VoidCallback</code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.DeleteAsyncCallback.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.DeleteAsyncCallback.html b/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.DeleteAsyncCallback.html
index c6daa8b..9544fca 100644
--- a/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.DeleteAsyncCallback.html
+++ b/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.DeleteAsyncCallback.html
@@ -124,7 +124,7 @@ implements org.apache.zookeeper.AsyncCallback.VoidCallback</pre>
 <!--   -->
 </a>
 <h3>Nested classes/interfaces inherited from interface&nbsp;org.apache.zookeeper.AsyncCallback</h3>
-<code>org.apache.zookeeper.AsyncCallback.ACLCallback, org.apache.zookeeper.AsyncCallback.Children2Callback, org.apache.zookeeper.AsyncCallback.ChildrenCallback, org.apache.zookeeper.AsyncCallback.DataCallback, org.apache.zookeeper.AsyncCallback.StatCallback, org.apache.zookeeper.AsyncCallback.StringCallback, org.apache.zookeeper.AsyncCallback.VoidCallback</code></li>
+<code>org.apache.zookeeper.AsyncCallback.ACLCallback, org.apache.zookeeper.AsyncCallback.Children2Callback, org.apache.zookeeper.AsyncCallback.ChildrenCallback, org.apache.zookeeper.AsyncCallback.DataCallback, org.apache.zookeeper.AsyncCallback.MultiCallback, org.apache.zookeeper.AsyncCallback.StatCallback, org.apache.zookeeper.AsyncCallback.StringCallback, org.apache.zookeeper.AsyncCallback.VoidCallback</code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.GetDataAsyncCallback.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.GetDataAsyncCallback.html b/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.GetDataAsyncCallback.html
index 6132181..df21a81 100644
--- a/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.GetDataAsyncCallback.html
+++ b/devapidocs/org/apache/hadoop/hbase/coordination/ZKSplitLogManagerCoordination.GetDataAsyncCallback.html
@@ -124,7 +124,7 @@ implements org.apache.zookeeper.AsyncCallback.DataCallback</pre>
 <!--   -->
 </a>
 <h3>Nested classes/interfaces inherited from interface&nbsp;org.apache.zookeeper.AsyncCallback</h3>
-<code>org.apache.zookeeper.AsyncCallback.ACLCallback, org.apache.zookeeper.AsyncCallback.Children2Callback, org.apache.zookeeper.AsyncCallback.ChildrenCallback, org.apache.zookeeper.AsyncCallback.DataCallback, org.apache.zookeeper.AsyncCallback.StatCallback, org.apache.zookeeper.AsyncCallback.StringCallback, org.apache.zookeeper.AsyncCallback.VoidCallback</code></li>
+<code>org.apache.zookeeper.AsyncCallback.ACLCallback, org.apache.zookeeper.AsyncCallback.Children2Callback, org.apache.zookeeper.AsyncCallback.ChildrenCallback, org.apache.zookeeper.AsyncCallback.DataCallback, org.apache.zookeeper.AsyncCallback.MultiCallback, org.apache.zookeeper.AsyncCallback.StatCallback, org.apache.zookeeper.AsyncCallback.StringCallback, org.apache.zookeeper.AsyncCallback.VoidCallback</code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/coordination/ZkSplitLogWorkerCoordination.GetDataAsyncCallback.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/coordination/ZkSplitLogWorkerCoordination.GetDataAsyncCallback.html b/devapidocs/org/apache/hadoop/hbase/coordination/ZkSplitLogWorkerCoordination.GetDataAsyncCallback.html
index fb77db1..756bb49 100644
--- a/devapidocs/org/apache/hadoop/hbase/coordination/ZkSplitLogWorkerCoordination.GetDataAsyncCallback.html
+++ b/devapidocs/org/apache/hadoop/hbase/coordination/ZkSplitLogWorkerCoordination.GetDataAsyncCallback.html
@@ -124,7 +124,7 @@ implements org.apache.zookeeper.AsyncCallback.DataCallback</pre>
 <!--   -->
 </a>
 <h3>Nested classes/interfaces inherited from interface&nbsp;org.apache.zookeeper.AsyncCallback</h3>
-<code>org.apache.zookeeper.AsyncCallback.ACLCallback, org.apache.zookeeper.AsyncCallback.Children2Callback, org.apache.zookeeper.AsyncCallback.ChildrenCallback, org.apache.zookeeper.AsyncCallback.DataCallback, org.apache.zookeeper.AsyncCallback.StatCallback, org.apache.zookeeper.AsyncCallback.StringCallback, org.apache.zookeeper.AsyncCallback.VoidCallback</code></li>
+<code>org.apache.zookeeper.AsyncCallback.ACLCallback, org.apache.zookeeper.AsyncCallback.Children2Callback, org.apache.zookeeper.AsyncCallback.ChildrenCallback, org.apache.zookeeper.AsyncCallback.DataCallback, org.apache.zookeeper.AsyncCallback.MultiCallback, org.apache.zookeeper.AsyncCallback.StatCallback, org.apache.zookeeper.AsyncCallback.StringCallback, org.apache.zookeeper.AsyncCallback.VoidCallback</code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/filter/TimestampsFilter.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/TimestampsFilter.html b/devapidocs/org/apache/hadoop/hbase/filter/TimestampsFilter.html
index 69446c3..e39b5da 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/TimestampsFilter.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/TimestampsFilter.html
@@ -107,7 +107,7 @@
 <br>
 <pre><a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceAudience.Public.html" title="annotation in org.apache.hadoop.hbase.classification">@InterfaceAudience.Public</a>
 <a href="../../../../../org/apache/hadoop/hbase/classification/InterfaceStability.Stable.html" title="annotation in org.apache.hadoop.hbase.classification">@InterfaceStability.Stable</a>
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.45">TimestampsFilter</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.46">TimestampsFilter</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></pre>
 <div class="block">Filter that returns only cells whose timestamp (version) is
  in the specified list of timestamps (versions).
@@ -150,14 +150,18 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 <th class="colLast" scope="col">Field and Description</th>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>private boolean</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#canHint">canHint</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>private static int</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#MAX_LOG_TIMESTAMPS">MAX_LOG_TIMESTAMPS</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) long</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#minTimeStamp">minTimeStamp</a></strong></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/TreeSet.html?is-external=true" title="class or interface in java.util">TreeSet</a>&lt;<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;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#timestamps">timestamps</a></strong></code>&nbsp;</td>
 </tr>
@@ -184,6 +188,12 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 </tr>
 <tr class="altColor">
 <td class="colOne"><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#TimestampsFilter(java.util.List)">TimestampsFilter</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/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;timestamps)</code>
+<div class="block">Constructor for filter that retains only the specified timestamps in the list.</div>
+</td>
+</tr>
+<tr class="rowColor">
+<td class="colOne"><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#TimestampsFilter(java.util.List,%20boolean)">TimestampsFilter</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/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;timestamps,
+                                boolean&nbsp;canHint)</code>
 <div class="block">Constructor for filter that retains only those
  cells whose timestamp (version) is in the specified
  list of timestamps.</div>
@@ -233,30 +243,36 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 </td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code>
+<div class="block">Pick the next cell that the scanner should seek to.</div>
+</td>
+</tr>
+<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="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;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#getTimestamps()">getTimestamps</a></strong>()</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/filter/TimestampsFilter.html#init()">init</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html" title="class in org.apache.hadoop.hbase.filter">TimestampsFilter</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#parseFrom(byte[])">parseFrom</a></strong>(byte[]&nbsp;pbBytes)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>byte[]</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#toByteArray()">toByteArray</a></strong>()</code>
 <div class="block">Return length 0 byte array for Filters that don't require special serialization</div>
 </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/filter/TimestampsFilter.html#toString()">toString</a></strong>()</code>
 <div class="block">Return filter's info for debugging and logging purpose.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected <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/filter/TimestampsFilter.html#toString(int)">toString</a></strong>(int&nbsp;maxTimestamps)</code>&nbsp;</td>
 </tr>
@@ -266,7 +282,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#filterAllRemaining()">filterAllRemaining</a>, <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#filterRow()">filterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#filterRowCells(java.util.List)">filterRowCells</a>, <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#filterRowKey(byte[],%20int,%20int)">filterRowKey</a>, <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a>, <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#hasFilterRow()">hasFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#isFamilyEssential(byte[])">isFamilyEssential</a>, <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#reset()">reset</a>, <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#
 transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#filterAllRemaining()">filterAllRemaining</a>, <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#filterRow()">filterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#filterRowCells(java.util.List)">filterRowCells</a>, <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#filterRowKey(byte[],%20int,%20int)">filterRowKey</a>, <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#hasFilterRow()">hasFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#isFamilyEssential(byte[])">isFamilyEssential</a>, <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#reset()">reset</a>, <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods_inherited_from_class_org.apache.hadoop.hbase.filter.Filter">
@@ -296,13 +312,22 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 <!--   -->
 </a>
 <h3>Field Detail</h3>
+<a name="canHint">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>canHint</h4>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.48">canHint</a></pre>
+</li>
+</ul>
 <a name="timestamps">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>timestamps</h4>
-<pre><a href="http://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html?is-external=true" title="class or interface in java.util">TreeSet</a>&lt;<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; <a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.47">timestamps</a></pre>
+<pre><a href="http://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html?is-external=true" title="class or interface in java.util">TreeSet</a>&lt;<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; <a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.49">timestamps</a></pre>
 </li>
 </ul>
 <a name="MAX_LOG_TIMESTAMPS">
@@ -311,7 +336,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>MAX_LOG_TIMESTAMPS</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.48">MAX_LOG_TIMESTAMPS</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.50">MAX_LOG_TIMESTAMPS</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.filter.TimestampsFilter.MAX_LOG_TIMESTAMPS">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -321,7 +346,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 <ul class="blockListLast">
 <li class="blockList">
 <h4>minTimeStamp</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.52">minTimeStamp</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.54">minTimeStamp</a></pre>
 </li>
 </ul>
 </li>
@@ -335,14 +360,29 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 <a name="TimestampsFilter(java.util.List)">
 <!--   -->
 </a>
+<ul class="blockList">
+<li class="blockList">
+<h4>TimestampsFilter</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.60">TimestampsFilter</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="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;timestamps)</pre>
+<div class="block">Constructor for filter that retains only the specified timestamps in the list.</div>
+<dl><dt><span class="strong">Parameters:</span></dt><dd><code>timestamps</code> - </dd></dl>
+</li>
+</ul>
+<a name="TimestampsFilter(java.util.List, boolean)">
+<!--   -->
+</a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TimestampsFilter</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.61">TimestampsFilter</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="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;timestamps)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.75">TimestampsFilter</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="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;timestamps,
+                boolean&nbsp;canHint)</pre>
 <div class="block">Constructor for filter that retains only those
  cells whose timestamp (version) is in the specified
  list of timestamps.</div>
-<dl><dt><span class="strong">Parameters:</span></dt><dd><code>timestamps</code> - </dd></dl>
+<dl><dt><span class="strong">Parameters:</span></dt><dd><code>timestamps</code> - list of timestamps that are wanted.</dd><dd><code>canHint</code> - should the filter provide a seek hint? This can skip
+                past delete tombstones, so it should only be used when that
+                is not an issue ( no deletes, or don't care if data
+                becomes visible)</dd></dl>
 </li>
 </ul>
 </li>
@@ -359,7 +399,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getTimestamps</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/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.72">getTimestamps</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="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;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.87">getTimestamps</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>the list of timestamps</dd></dl>
 </li>
 </ul>
@@ -369,7 +409,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.78">init</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.93">init</a>()</pre>
 </li>
 </ul>
 <a name="getMin()">
@@ -378,7 +418,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getMin</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.88">getMin</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.103">getMin</a>()</pre>
 <div class="block">Gets the minimum timestamp requested by filter.</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>minimum timestamp requested by filter.</dd></dl>
 </li>
@@ -389,7 +429,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>filterRowKey</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.93">filterRowKey</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.108">filterRowKey</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"><strong>Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)">Filter</a></code></strong></div>
 <div class="block">Filters a row based on the row key. If this returns true, the entire row will be excluded. If
@@ -412,7 +452,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>filterKeyValue</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter">Filter.ReturnCode</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.99">filterKeyValue</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter">Filter.ReturnCode</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.114">filterKeyValue</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</pre>
 <div class="block"><strong>Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html#filterKeyValue(org.apache.hadoop.hbase.Cell)">Filter</a></code></strong></div>
 <div class="block">A way to filter based on the column family, column qualifier and/or the column value. Return
  code is described below. This allows filters to filter only certain number of columns, then
@@ -435,13 +475,34 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 <dt><span class="strong">Returns:</span></dt><dd>code as described below</dd><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><code>Filter.ReturnCode</code></a></dd></dl>
 </li>
 </ul>
+<a name="getNextCellHint(org.apache.hadoop.hbase.Cell)">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getNextCellHint</h4>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.134">getNextCellHint</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)
+                     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">Pick the next cell that the scanner should seek to. Since this can skip any number of cells
+ any of which can be a delete this can resurect old data.
+
+ The method will only be used if canHint was set to true while creating the filter.</div>
+<dl>
+<dt><strong>Overrides:</strong></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html" title="class in org.apache.hadoop.hbase.filter">FilterBase</a></code></dd>
+<dt><span class="strong">Returns:</span></dt><dd>KeyValue which must be next seeked. return null if the filter is not sure which key to
+         seek to next.</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> - This will never happen.</dd></dl>
+</li>
+</ul>
 <a name="createFilterFromArguments(java.util.ArrayList)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>createFilterFromArguments</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.110">createFilterFromArguments</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;byte[]&gt;&nbsp;filterArguments)</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.159">createFilterFromArguments</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;byte[]&gt;&nbsp;filterArguments)</pre>
 </li>
 </ul>
 <a name="toByteArray()">
@@ -450,7 +511,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>toByteArray</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.122">toByteArray</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.171">toByteArray</a>()</pre>
 <div class="block"><strong>Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#toByteArray()">FilterBase</a></code></strong></div>
 <div class="block">Return length 0 byte array for Filters that don't require special serialization</div>
 <dl>
@@ -465,7 +526,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>parseFrom</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html" title="class in org.apache.hadoop.hbase.filter">TimestampsFilter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.135">parseFrom</a>(byte[]&nbsp;pbBytes)
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html" title="class in org.apache.hadoop.hbase.filter">TimestampsFilter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.185">parseFrom</a>(byte[]&nbsp;pbBytes)
                                   throws <a href="../../../../../org/apache/hadoop/hbase/exceptions/DeserializationException.html" title="class in org.apache.hadoop.hbase.exceptions">DeserializationException</a></pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>pbBytes</code> - A pb serialized <a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html" title="class in org.apache.hadoop.hbase.filter"><code>TimestampsFilter</code></a> instance</dd>
 <dt><span class="strong">Returns:</span></dt><dd>An instance of <a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html" title="class in org.apache.hadoop.hbase.filter"><code>TimestampsFilter</code></a> made from <code>bytes</code></dd>
@@ -479,7 +540,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>areSerializedFieldsEqual</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.151">areSerializedFieldsEqual</a>(<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&nbsp;o)</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.202">areSerializedFieldsEqual</a>(<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&nbsp;o)</pre>
 <div class="block"><strong>Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#areSerializedFieldsEqual(org.apache.hadoop.hbase.filter.Filter)">FilterBase</a></code></strong></div>
 <div class="block">Default implementation so that writers of custom filters aren't forced to implement.</div>
 <dl>
@@ -496,7 +557,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 <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/filter/TimestampsFilter.html#line.160">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/filter/TimestampsFilter.html#line.211">toString</a>()</pre>
 <div class="block"><strong>Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#toString()">FilterBase</a></code></strong></div>
 <div class="block">Return filter's info for debugging and logging purpose.</div>
 <dl>
@@ -511,7 +572,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html"
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toString</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>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.164">toString</a>(int&nbsp;maxTimestamps)</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>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.215">toString</a>(int&nbsp;maxTimestamps)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 ba6f5ac..8c85834 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -162,13 +162,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.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/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/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/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/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/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/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/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/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/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/f30982bd/devapidocs/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html
index 9568fdf..9f2c586 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html
@@ -104,7 +104,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.134">CombinedBlockCache.CombinedCacheStats</a>
+<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.131">CombinedBlockCache.CombinedCacheStats</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></pre>
 </li>
 </ul>
@@ -275,7 +275,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockList">
 <li class="blockList">
 <h4>lruCacheStats</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.135">lruCacheStats</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.132">lruCacheStats</a></pre>
 </li>
 </ul>
 <a name="bucketCacheStats">
@@ -284,7 +284,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockListLast">
 <li class="blockList">
 <h4>bucketCacheStats</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.136">bucketCacheStats</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.133">bucketCacheStats</a></pre>
 </li>
 </ul>
 </li>
@@ -301,7 +301,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CombinedBlockCache.CombinedCacheStats</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.138">CombinedBlockCache.CombinedCacheStats</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a>&nbsp;lbcStats,
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.135">CombinedBlockCache.CombinedCacheStats</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a>&nbsp;lbcStats,
                                      <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a>&nbsp;fcStats)</pre>
 </li>
 </ul>
@@ -319,7 +319,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getRequestCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.145">getRequestCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.142">getRequestCount</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html#getRequestCount()">getRequestCount</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></code></dd>
@@ -332,7 +332,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getRequestCachingCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.151">getRequestCachingCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.148">getRequestCachingCount</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html#getRequestCachingCount()">getRequestCachingCount</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></code></dd>
@@ -345,7 +345,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getMissCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.157">getMissCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.154">getMissCount</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html#getMissCount()">getMissCount</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></code></dd>
@@ -358,7 +358,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getPrimaryMissCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.162">getPrimaryMissCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.159">getPrimaryMissCount</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html#getPrimaryMissCount()">getPrimaryMissCount</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></code></dd>
@@ -371,7 +371,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getMissCachingCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.167">getMissCachingCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.164">getMissCachingCount</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html#getMissCachingCount()">getMissCachingCount</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></code></dd>
@@ -384,7 +384,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getHitCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.173">getHitCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.170">getHitCount</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html#getHitCount()">getHitCount</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></code></dd>
@@ -397,7 +397,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getPrimaryHitCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.178">getPrimaryHitCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.175">getPrimaryHitCount</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html#getPrimaryHitCount()">getPrimaryHitCount</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></code></dd>
@@ -410,7 +410,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getHitCachingCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.182">getHitCachingCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.179">getHitCachingCount</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html#getHitCachingCount()">getHitCachingCount</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></code></dd>
@@ -423,7 +423,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getEvictionCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.188">getEvictionCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.185">getEvictionCount</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html#getEvictionCount()">getEvictionCount</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></code></dd>
@@ -436,7 +436,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getEvictedCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.194">getEvictedCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.191">getEvictedCount</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html#getEvictedCount()">getEvictedCount</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></code></dd>
@@ -449,7 +449,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getPrimaryEvictedCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.200">getPrimaryEvictedCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.197">getPrimaryEvictedCount</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html#getPrimaryEvictedCount()">getPrimaryEvictedCount</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></code></dd>
@@ -462,7 +462,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockList">
 <li class="blockList">
 <h4>rollMetricsPeriod</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.206">rollMetricsPeriod</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.203">rollMetricsPeriod</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html#rollMetricsPeriod()">rollMetricsPeriod</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></code></dd>
@@ -475,7 +475,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getFailedInserts</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.212">getFailedInserts</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.209">getFailedInserts</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html#getFailedInserts()">getFailedInserts</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></code></dd>
@@ -488,7 +488,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getSumHitCountsPastNPeriods</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.217">getSumHitCountsPastNPeriods</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.214">getSumHitCountsPastNPeriods</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html#getSumHitCountsPastNPeriods()">getSumHitCountsPastNPeriods</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></code></dd>
@@ -501,7 +501,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getSumRequestCountsPastNPeriods</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.223">getSumRequestCountsPastNPeriods</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.220">getSumRequestCountsPastNPeriods</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html#getSumRequestCountsPastNPeriods()">getSumRequestCountsPastNPeriods</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></code></dd>
@@ -514,7 +514,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockList">
 <li class="blockList">
 <h4>getSumHitCachingCountsPastNPeriods</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.229">getSumHitCachingCountsPastNPeriods</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.226">getSumHitCachingCountsPastNPeriods</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html#getSumHitCachingCountsPastNPeriods()">getSumHitCachingCountsPastNPeriods</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></code></dd>
@@ -527,7 +527,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.h
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getSumRequestCachingCountsPastNPeriods</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.235">getSumRequestCachingCountsPastNPeriods</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.CombinedCacheStats.html#line.232">getSumRequestCachingCountsPastNPeriods</a>()</pre>
 <dl>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html#getSumRequestCachingCountsPastNPeriods()">getSumRequestCachingCountsPastNPeriods</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html
index 6ec2c59..ccb2648 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html
@@ -450,7 +450,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Resizable
 <ul class="blockList">
 <li class="blockList">
 <h4>evictBlock</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.93">evictBlock</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;cacheKey)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.90">evictBlock</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;cacheKey)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#evictBlock(org.apache.hadoop.hbase.io.hfile.BlockCacheKey)">BlockCache</a></code></strong></div>
 <div class="block">Evict block from cache.</div>
 <dl>
@@ -466,7 +466,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Resizable
 <ul class="blockList">
 <li class="blockList">
 <h4>evictBlocksByHfileName</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.98">evictBlocksByHfileName</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;hfileName)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.95">evictBlocksByHfileName</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;hfileName)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#evictBlocksByHfileName(java.lang.String)">BlockCache</a></code></strong></div>
 <div class="block">Evicts all blocks for the given HFile.</div>
 <dl>
@@ -481,7 +481,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Resizable
 <ul class="blockList">
 <li class="blockList">
 <h4>getStats</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.104">getStats</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheStats.html" title="class in org.apache.hadoop.hbase.io.hfile">CacheStats</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.101">getStats</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getStats()">BlockCache</a></code></strong></div>
 <div class="block">Get the statistics for this block cache.</div>
 <dl>
@@ -496,7 +496,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Resizable
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.109">shutdown</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.106">shutdown</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#shutdown()">BlockCache</a></code></strong></div>
 <div class="block">Shutdown the cache.</div>
 <dl>
@@ -511,7 +511,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Resizable
 <ul class="blockList">
 <li class="blockList">
 <h4>size</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.115">size</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.112">size</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#size()">BlockCache</a></code></strong></div>
 <div class="block">Returns the total size of the block cache, in bytes.</div>
 <dl>
@@ -526,7 +526,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Resizable
 <ul class="blockList">
 <li class="blockList">
 <h4>getFreeSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.120">getFreeSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.117">getFreeSize</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getFreeSize()">BlockCache</a></code></strong></div>
 <div class="block">Returns the free size of the block cache, in bytes.</div>
 <dl>
@@ -541,7 +541,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Resizable
 <ul class="blockList">
 <li class="blockList">
 <h4>getCurrentSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.125">getCurrentSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.122">getCurrentSize</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getCurrentSize()">BlockCache</a></code></strong></div>
 <div class="block">Returns the occupied size of the block cache, in bytes.</div>
 <dl>
@@ -556,7 +556,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Resizable
 <ul class="blockList">
 <li class="blockList">
 <h4>getBlockCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.130">getBlockCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.127">getBlockCount</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getBlockCount()">BlockCache</a></code></strong></div>
 <div class="block">Returns the number of blocks currently cached in the block cache.</div>
 <dl>
@@ -571,7 +571,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Resizable
 <ul class="blockList">
 <li class="blockList">
 <h4>iterator</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html?is-external=true" title="class or interface in java.util">Iterator</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CachedBlock.html" title="interface in org.apache.hadoop.hbase.io.hfile">CachedBlock</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.242">iterator</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html?is-external=true" title="class or interface in java.util">Iterator</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CachedBlock.html" title="interface in org.apache.hadoop.hbase.io.hfile">CachedBlock</a>&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.239">iterator</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Iterable.html?is-external=true#iterator()" title="class or interface in java.lang">iterator</a></code>&nbsp;in interface&nbsp;<code><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="../../../../../../org/apache/hadoop/hbase/io/hfile/CachedBlock.html" title="interface in org.apache.hadoop.hbase.io.hfile">CachedBlock</a>&gt;</code></dd>
@@ -586,7 +586,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Resizable
 <ul class="blockList">
 <li class="blockList">
 <h4>getBlockCaches</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html" title="interface in org.apache.hadoop.hbase.io.hfile">BlockCache</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.247">getBlockCaches</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html" title="interface in org.apache.hadoop.hbase.io.hfile">BlockCache</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.244">getBlockCaches</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#getBlockCaches()">getBlockCaches</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html" title="interface in org.apache.hadoop.hbase.io.hfile">BlockCache</a></code></dd>
@@ -599,7 +599,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Resizable
 <ul class="blockList">
 <li class="blockList">
 <h4>setMaxSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.252">setMaxSize</a>(long&nbsp;size)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.249">setMaxSize</a>(long&nbsp;size)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/ResizableBlockCache.html#setMaxSize(long)">ResizableBlockCache</a></code></strong></div>
 <div class="block">Sets the max heap size that can be used by the BlockCache.</div>
 <dl>
@@ -614,7 +614,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Resizable
 <ul class="blockList">
 <li class="blockList">
 <h4>returnBlock</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.257">returnBlock</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;cacheKey,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.254">returnBlock</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;cacheKey,
                <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.html" title="interface in org.apache.hadoop.hbase.io.hfile">Cacheable</a>&nbsp;block)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCache.html#returnBlock(org.apache.hadoop.hbase.io.hfile.BlockCacheKey,%20org.apache.hadoop.hbase.io.hfile.Cacheable)">BlockCache</a></code></strong></div>
 <div class="block">Called when the scanner using the block decides to return the block once its usage
@@ -635,7 +635,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Resizable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getRefCount</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.264">getRefCount</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;cacheKey)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.html#line.261">getRefCount</a>(<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheKey.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheKey</a>&nbsp;cacheKey)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 fd907a5..892ddbc 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -271,12 +271,12 @@
 <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.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.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/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/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/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>
 <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/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="strong">BlockType.BlockCategory</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html b/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html
index 4ae89fb..352b879 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html
@@ -103,7 +103,7 @@
 </dl>
 <hr>
 <br>
-<pre>private static final class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.730">AsyncRpcChannel.CallWriteListener</a>
+<pre>private static final class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#line.709">AsyncRpcChannel.CallWriteListener</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 io.netty.channel.ChannelFutureListener</pre>
 <div class="block">Listens to call writes and fails if write failed</div>
@@ -205,7 +205,7 @@ implements io.netty.channel.ChannelFutureListener</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>rpcChannel</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html" title="class in org.apache.hadoop.hbase.ipc">AsyncRpcChannel</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html#line.731">rpcChannel</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html" title="class in org.apache.hadoop.hbase.ipc">AsyncRpcChannel</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html#line.710">rpcChannel</a></pre>
 </li>
 </ul>
 <a name="id">
@@ -214,7 +214,7 @@ implements io.netty.channel.ChannelFutureListener</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>id</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html#line.732">id</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html#line.711">id</a></pre>
 </li>
 </ul>
 </li>
@@ -231,7 +231,7 @@ implements io.netty.channel.ChannelFutureListener</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AsyncRpcChannel.CallWriteListener</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html#line.734">AsyncRpcChannel.CallWriteListener</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html" title="class in org.apache.hadoop.hbase.ipc">AsyncRpcChannel</a>&nbsp;asyncRpcChannel,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html#line.713">AsyncRpcChannel.CallWriteListener</a>(<a href="../../../../../org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html" title="class in org.apache.hadoop.hbase.ipc">AsyncRpcChannel</a>&nbsp;asyncRpcChannel,
                                  int&nbsp;id)</pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ implements io.netty.channel.ChannelFutureListener</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>operationComplete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html#line.740">operationComplete</a>(io.netty.channel.ChannelFuture&nbsp;future)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AsyncRpcChannel.CallWriteListener.html#line.719">operationComplete</a>(io.netty.channel.ChannelFuture&nbsp;future)
                        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><strong>Specified by:</strong></dt>


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

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html
index 9e42ac9..054df6f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.RunnerStats.html
@@ -71,411 +71,413 @@
 <span class="sourceLineNo">063</span>  private static final String MEMLOAD_BASE = "memstoreLoad_";<a name="line.63"></a>
 <span class="sourceLineNo">064</span>  private static final String HEAP_BASE = "heapOccupancy_";<a name="line.64"></a>
 <span class="sourceLineNo">065</span>  private static final String CACHE_BASE = "cacheDroppingExceptions_";<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  private static final String CLIENT_SVC = ClientService.getDescriptor().getName();<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  /** A container class for collecting details about the RPC call as it percolates. */<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  public static class CallStats {<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    private long requestSizeBytes = 0;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    private long responseSizeBytes = 0;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    private long startTime = 0;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    private long callTimeMs = 0;<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>    public long getRequestSizeBytes() {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      return requestSizeBytes;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    }<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public void setRequestSizeBytes(long requestSizeBytes) {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      this.requestSizeBytes = requestSizeBytes;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    }<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>    public long getResponseSizeBytes() {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      return responseSizeBytes;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    }<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>    public void setResponseSizeBytes(long responseSizeBytes) {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      this.responseSizeBytes = responseSizeBytes;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    }<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>    public long getStartTime() {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      return startTime;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>    public void setStartTime(long startTime) {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>      this.startTime = startTime;<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>    public long getCallTimeMs() {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      return callTimeMs;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    }<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>    public void setCallTimeMs(long callTimeMs) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      this.callTimeMs = callTimeMs;<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><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @VisibleForTesting<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  protected static final class CallTracker {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    private final String name;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    @VisibleForTesting final Timer callTimer;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    @VisibleForTesting final Histogram reqHist;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    @VisibleForTesting final Histogram respHist;<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    private CallTracker(MetricRegistry registry, String name, String subName, String scope) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      StringBuilder sb = new StringBuilder(CLIENT_SVC).append("_").append(name);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      if (subName != null) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        sb.append("(").append(subName).append(")");<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      }<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      this.name = sb.toString();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      this.callTimer = registry.timer(name(MetricsConnection.class,<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        DRTN_BASE + this.name, scope));<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      this.reqHist = registry.histogram(name(MetricsConnection.class,<a name="line.123"></a>
-<span class="sourceLineNo">124</span>        REQ_BASE + this.name, scope));<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      this.respHist = registry.histogram(name(MetricsConnection.class,<a name="line.125"></a>
-<span class="sourceLineNo">126</span>        RESP_BASE + this.name, scope));<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>    private CallTracker(MetricRegistry registry, String name, String scope) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      this(registry, name, null, scope);<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>    public void updateRpc(CallStats stats) {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      this.callTimer.update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      this.reqHist.update(stats.getRequestSizeBytes());<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      this.respHist.update(stats.getResponseSizeBytes());<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>    @Override<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    public String toString() {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      return "CallTracker:" + name;<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>  protected static class RegionStats {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    final String name;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    final Histogram memstoreLoadHist;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    final Histogram heapOccupancyHist;<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    public RegionStats(MetricRegistry registry, String name) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      this.name = name;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      this.memstoreLoadHist = registry.histogram(name(MetricsConnection.class,<a name="line.152"></a>
-<span class="sourceLineNo">153</span>          MEMLOAD_BASE + this.name));<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      this.heapOccupancyHist = registry.histogram(name(MetricsConnection.class,<a name="line.154"></a>
-<span class="sourceLineNo">155</span>          HEAP_BASE + this.name));<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>    public void update(ClientProtos.RegionLoadStats regionStatistics) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      this.memstoreLoadHist.update(regionStatistics.getMemstoreLoad());<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      this.heapOccupancyHist.update(regionStatistics.getHeapOccupancy());<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    }<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>  protected static class RunnerStats {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    final Counter normalRunners;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    final Counter delayRunners;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    final Histogram delayIntevalHist;<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    public RunnerStats(MetricRegistry registry) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      this.normalRunners = registry.counter(<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        name(MetricsConnection.class, "normalRunnersCount"));<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      this.delayRunners = registry.counter(<a name="line.173"></a>
-<span class="sourceLineNo">174</span>        name(MetricsConnection.class, "delayRunnersCount"));<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      this.delayIntevalHist = registry.histogram(<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        name(MetricsConnection.class, "delayIntervalHist"));<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    public void incrNormalRunners() {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      this.normalRunners.inc();<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>    public void incrDelayRunners() {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      this.delayRunners.inc();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    public void updateDelayInterval(long interval) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      this.delayIntevalHist.update(interval);<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><a name="line.191"></a>
-<span class="sourceLineNo">192</span>  @VisibleForTesting<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  protected ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt; serverStats<a name="line.193"></a>
-<span class="sourceLineNo">194</span>          = new ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt;();<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>  public void updateServerStats(ServerName serverName, byte[] regionName,<a name="line.196"></a>
-<span class="sourceLineNo">197</span>                                Object r) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    if (!(r instanceof Result)) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      return;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    Result result = (Result) r;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    ClientProtos.RegionLoadStats stats = result.getStats();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    if (stats == null) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      return;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    updateRegionStats(serverName, regionName, stats);<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>  @Override<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  public void updateRegionStats(ServerName serverName, byte[] regionName,<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ClientProtos.RegionLoadStats stats) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    String name = serverName.getServerName() + "," + Bytes.toStringBinary(regionName);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ConcurrentMap&lt;byte[], RegionStats&gt; rsStats = null;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    if (serverStats.containsKey(serverName)) {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      rsStats = serverStats.get(serverName);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    } else {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      rsStats = serverStats.putIfAbsent(serverName,<a name="line.217"></a>
-<span class="sourceLineNo">218</span>          new ConcurrentSkipListMap&lt;byte[], RegionStats&gt;(Bytes.BYTES_COMPARATOR));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      if (rsStats == null) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        rsStats = serverStats.get(serverName);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    RegionStats regionStats = null;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    if (rsStats.containsKey(regionName)) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      regionStats = rsStats.get(regionName);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    } else {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      regionStats = rsStats.putIfAbsent(regionName, new RegionStats(this.registry, name));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      if (regionStats == null) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>        regionStats = rsStats.get(regionName);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      }<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    regionStats.update(stats);<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">066</span>  private static final String UNKNOWN_EXCEPTION = "UnknownException";<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  private static final String CLIENT_SVC = ClientService.getDescriptor().getName();<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>  /** A container class for collecting details about the RPC call as it percolates. */<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  public static class CallStats {<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    private long requestSizeBytes = 0;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    private long responseSizeBytes = 0;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    private long startTime = 0;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    private long callTimeMs = 0;<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>    public long getRequestSizeBytes() {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      return requestSizeBytes;<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>    public void setRequestSizeBytes(long requestSizeBytes) {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>      this.requestSizeBytes = requestSizeBytes;<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>    public long getResponseSizeBytes() {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      return responseSizeBytes;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    }<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>    public void setResponseSizeBytes(long responseSizeBytes) {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      this.responseSizeBytes = responseSizeBytes;<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">092</span>    public long getStartTime() {<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      return startTime;<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>    public void setStartTime(long startTime) {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      this.startTime = startTime;<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>    public long getCallTimeMs() {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      return callTimeMs;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>    public void setCallTimeMs(long callTimeMs) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      this.callTimeMs = callTimeMs;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    }<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  }<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  @VisibleForTesting<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  protected static final class CallTracker {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    private final String name;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    @VisibleForTesting final Timer callTimer;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    @VisibleForTesting final Histogram reqHist;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    @VisibleForTesting final Histogram respHist;<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>    private CallTracker(MetricRegistry registry, String name, String subName, String scope) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      StringBuilder sb = new StringBuilder(CLIENT_SVC).append("_").append(name);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      if (subName != null) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        sb.append("(").append(subName).append(")");<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      }<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      this.name = sb.toString();<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      this.callTimer = registry.timer(name(MetricsConnection.class,<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        DRTN_BASE + this.name, scope));<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      this.reqHist = registry.histogram(name(MetricsConnection.class,<a name="line.124"></a>
+<span class="sourceLineNo">125</span>        REQ_BASE + this.name, scope));<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      this.respHist = registry.histogram(name(MetricsConnection.class,<a name="line.126"></a>
+<span class="sourceLineNo">127</span>        RESP_BASE + this.name, scope));<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>    private CallTracker(MetricRegistry registry, String name, String scope) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      this(registry, name, null, scope);<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>    public void updateRpc(CallStats stats) {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      this.callTimer.update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      this.reqHist.update(stats.getRequestSizeBytes());<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      this.respHist.update(stats.getResponseSizeBytes());<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>    @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    public String toString() {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      return "CallTracker:" + name;<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><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  protected static class RegionStats {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    final String name;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    final Histogram memstoreLoadHist;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    final Histogram heapOccupancyHist;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>    public RegionStats(MetricRegistry registry, String name) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      this.name = name;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      this.memstoreLoadHist = registry.histogram(name(MetricsConnection.class,<a name="line.153"></a>
+<span class="sourceLineNo">154</span>          MEMLOAD_BASE + this.name));<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      this.heapOccupancyHist = registry.histogram(name(MetricsConnection.class,<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          HEAP_BASE + this.name));<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>    public void update(ClientProtos.RegionLoadStats regionStatistics) {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      this.memstoreLoadHist.update(regionStatistics.getMemstoreLoad());<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      this.heapOccupancyHist.update(regionStatistics.getHeapOccupancy());<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><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  @VisibleForTesting<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  protected static class RunnerStats {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    final Counter normalRunners;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    final Counter delayRunners;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    final Histogram delayIntevalHist;<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    public RunnerStats(MetricRegistry registry) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      this.normalRunners = registry.counter(<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        name(MetricsConnection.class, "normalRunnersCount"));<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      this.delayRunners = registry.counter(<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        name(MetricsConnection.class, "delayRunnersCount"));<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      this.delayIntevalHist = registry.histogram(<a name="line.176"></a>
+<span class="sourceLineNo">177</span>        name(MetricsConnection.class, "delayIntervalHist"));<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
+<span class="sourceLineNo">179</span><a name="line.179"></a>
+<span class="sourceLineNo">180</span>    public void incrNormalRunners() {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      this.normalRunners.inc();<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
+<span class="sourceLineNo">183</span><a name="line.183"></a>
+<span class="sourceLineNo">184</span>    public void incrDelayRunners() {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      this.delayRunners.inc();<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public void updateDelayInterval(long interval) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      this.delayIntevalHist.update(interval);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  }<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>  @VisibleForTesting<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  protected ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt; serverStats<a name="line.194"></a>
+<span class="sourceLineNo">195</span>          = new ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt;();<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>  public void updateServerStats(ServerName serverName, byte[] regionName,<a name="line.197"></a>
+<span class="sourceLineNo">198</span>                                Object r) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    if (!(r instanceof Result)) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      return;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    Result result = (Result) r;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    ClientProtos.RegionLoadStats stats = result.getStats();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    if (stats == null) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      return;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    updateRegionStats(serverName, regionName, stats);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  @Override<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public void updateRegionStats(ServerName serverName, byte[] regionName,<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ClientProtos.RegionLoadStats stats) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    String name = serverName.getServerName() + "," + Bytes.toStringBinary(regionName);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ConcurrentMap&lt;byte[], RegionStats&gt; rsStats = null;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    if (serverStats.containsKey(serverName)) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      rsStats = serverStats.get(serverName);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    } else {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      rsStats = serverStats.putIfAbsent(serverName,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>          new ConcurrentSkipListMap&lt;byte[], RegionStats&gt;(Bytes.BYTES_COMPARATOR));<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      if (rsStats == null) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        rsStats = serverStats.get(serverName);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    RegionStats regionStats = null;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    if (rsStats.containsKey(regionName)) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      regionStats = rsStats.get(regionName);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    } else {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      regionStats = rsStats.putIfAbsent(regionName, new RegionStats(this.registry, name));<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      if (regionStats == null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        regionStats = rsStats.get(regionName);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      }<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    regionStats.update(stats);<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>  /** A lambda for dispatching to the appropriate metric factory method */<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  private static interface NewMetric&lt;T&gt; {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    T newMetric(Class&lt;?&gt; clazz, String name, String scope);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>  /** Anticipated number of metric entries */<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  private static final int CAPACITY = 50;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>  /** Default load factor from {@link java.util.HashMap#DEFAULT_LOAD_FACTOR} */<a name="line.243"></a>
-<span class="sourceLineNo">244</span>  private static final float LOAD_FACTOR = 0.75f;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /**<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * Anticipated number of concurrent accessor threads, from<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * {@link ConnectionImplementation#getBatchPool()}<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   */<a name="line.248"></a>
-<span class="sourceLineNo">249</span>  private static final int CONCURRENCY_LEVEL = 256;<a name="line.249"></a>
-<span class="sourceLineNo">250</span><a name="line.250"></a>
-<span class="sourceLineNo">251</span>  private final MetricRegistry registry;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  private final JmxReporter reporter;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  private final String scope;<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private final NewMetric&lt;Timer&gt; timerFactory = new NewMetric&lt;Timer&gt;() {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    @Override public Timer newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      return registry.timer(name(clazz, name, scope));<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>  private final NewMetric&lt;Histogram&gt; histogramFactory = new NewMetric&lt;Histogram&gt;() {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    @Override public Histogram newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return registry.histogram(name(clazz, name, scope));<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  };<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  private final NewMetric&lt;Counter&gt; counterFactory = new NewMetric&lt;Counter&gt;() {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    @Override public Counter newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      return registry.counter(name(clazz, name, scope));<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  };<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  // static metrics<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>  @VisibleForTesting protected final Counter metaCacheHits;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  @VisibleForTesting protected final Counter metaCacheMisses;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  @VisibleForTesting protected final CallTracker getTracker;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @VisibleForTesting protected final CallTracker scanTracker;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  @VisibleForTesting protected final CallTracker appendTracker;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  @VisibleForTesting protected final CallTracker deleteTracker;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  @VisibleForTesting protected final CallTracker incrementTracker;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  @VisibleForTesting protected final CallTracker putTracker;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @VisibleForTesting protected final CallTracker multiTracker;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  @VisibleForTesting protected final RunnerStats runnerStats;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  private final Counter metaCacheNumClearServer;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  private final Counter metaCacheNumClearRegion;<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // dynamic metrics<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>  // These maps are used to cache references to the metric instances that are managed by the<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // registry. I don't think their use perfectly removes redundant allocations, but it's<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  // a big improvement over calling registry.newMetric each time.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Timer&gt; rpcTimers =<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Histogram&gt; rpcHistograms =<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY * 2 /* tracking both request and response sizes */,<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  private final ConcurrentMap&lt;String, Counter&gt; cacheDroppingExceptions =<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>  public MetricsConnection(final ConnectionImplementation conn) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    this.scope = conn.toString();<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    this.registry = new MetricRegistry();<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    final ThreadPoolExecutor batchPool = (ThreadPoolExecutor) conn.getCurrentBatchPool();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    final ThreadPoolExecutor metaPool = (ThreadPoolExecutor) conn.getCurrentMetaLookupPool();<a name="line.305"></a>
-<span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>    this.registry.register(name(this.getClass(), "executorPoolActiveThreads", scope),<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        new RatioGauge() {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>          @Override<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          protected Ratio getRatio() {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>            return Ratio.of(batchPool.getActiveCount(), batchPool.getMaximumPoolSize());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          }<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        });<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    this.registry.register(name(this.getClass(), "metaPoolActiveThreads", scope),<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        new RatioGauge() {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>          @Override<a name="line.316"></a>
-<span class="sourceLineNo">317</span>          protected Ratio getRatio() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>            return Ratio.of(metaPool.getActiveCount(), metaPool.getMaximumPoolSize());<a name="line.318"></a>
-<span class="sourceLineNo">319</span>          }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        });<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    this.metaCacheHits = registry.counter(name(this.getClass(), "metaCacheHits", scope));<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    this.metaCacheMisses = registry.counter(name(this.getClass(), "metaCacheMisses", scope));<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    this.metaCacheNumClearServer = registry.counter(name(this.getClass(),<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      "metaCacheNumClearServer", scope));<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    this.metaCacheNumClearRegion = registry.counter(name(this.getClass(),<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      "metaCacheNumClearRegion", scope));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    this.getTracker = new CallTracker(this.registry, "Get", scope);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    this.scanTracker = new CallTracker(this.registry, "Scan", scope);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    this.appendTracker = new CallTracker(this.registry, "Mutate", "Append", scope);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    this.deleteTracker = new CallTracker(this.registry, "Mutate", "Delete", scope);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    this.incrementTracker = new CallTracker(this.registry, "Mutate", "Increment", scope);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    this.putTracker = new CallTracker(this.registry, "Mutate", "Put", scope);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    this.multiTracker = new CallTracker(this.registry, "Multi", scope);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    this.runnerStats = new RunnerStats(this.registry);<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    this.reporter = JmxReporter.forRegistry(this.registry).build();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    this.reporter.start();<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>  public void shutdown() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    this.reporter.stop();<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>  /** Produce an instance of {@link CallStats} for clients to attach to RPCs. */<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  public static CallStats newCallStats() {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    // TODO: instance pool to reduce GC?<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    return new CallStats();<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">350</span>  /** Increment the number of meta cache hits. */<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  public void incrMetaCacheHit() {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    metaCacheHits.inc();<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>  /** Increment the number of meta cache misses. */<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  public void incrMetaCacheMiss() {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    metaCacheMisses.inc();<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>  /** Increment the number of meta cache drops requested for entire RegionServer. */<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  public void incrMetaCacheNumClearServer() {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    metaCacheNumClearServer.inc();<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>  /** Increment the number of meta cache drops requested for individual region. */<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  public void incrMetaCacheNumClearRegion() {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    metaCacheNumClearRegion.inc();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  /** Increment the number of normal runner counts. */<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  public void incrNormalRunners() {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    this.runnerStats.incrNormalRunners();<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  /** Increment the number of delay runner counts. */<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  public void incrDelayRunners() {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    this.runnerStats.incrDelayRunners();<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>  /** Update delay interval of delay runner. */<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public void updateDelayInterval(long interval) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    this.runnerStats.updateDelayInterval(interval);<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>   * Get a metric for {@code key} from {@code map}, or create it with {@code factory}.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   */<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  private &lt;T&gt; T getMetric(String key, ConcurrentMap&lt;String, T&gt; map, NewMetric&lt;T&gt; factory) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    T t = map.get(key);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    if (t == null) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      t = factory.newMetric(this.getClass(), key, scope);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      T tmp = map.putIfAbsent(key, t);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      t = (tmp == null) ? t : tmp;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    }<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    return t;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  }<a name="line.396"></a>
-<span class="sourceLineNo">397</span><a name="line.397"></a>
-<span class="sourceLineNo">398</span>  /** Update call stats for non-critical-path methods */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>  private void updateRpcGeneric(MethodDescriptor method, CallStats stats) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    final String methodName = method.getService().getName() + "_" + method.getName();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    getMetric(DRTN_BASE + methodName, rpcTimers, timerFactory)<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        .update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    getMetric(REQ_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        .update(stats.getRequestSizeBytes());<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    getMetric(RESP_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        .update(stats.getResponseSizeBytes());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>  /** Report RPC context to metrics system. */<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  public void updateRpc(MethodDescriptor method, Message param, CallStats stats) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // this implementation is tied directly to protobuf implementation details. would be better<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // if we could dispatch based on something static, ie, request Message type.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    if (method.getService() == ClientService.getDescriptor()) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      switch(method.getIndex()) {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      case 0:<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        assert "Get".equals(method.getName());<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        getTracker.updateRpc(stats);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        return;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      case 1:<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        assert "Mutate".equals(method.getName());<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        final MutationType mutationType = ((MutateRequest) param).getMutation().getMutateType();<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        switch(mutationType) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        case APPEND:<a name="line.423"></a>
-<span class="sourceLineNo">424</span>          appendTracker.updateRpc(stats);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          return;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        case DELETE:<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          deleteTracker.updateRpc(stats);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          return;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        case INCREMENT:<a name="line.429"></a>
-<span class="sourceLineNo">430</span>          incrementTracker.updateRpc(stats);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>          return;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        case PUT:<a name="line.432"></a>
-<span class="sourceLineNo">433</span>          putTracker.updateRpc(stats);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>          return;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        default:<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          throw new RuntimeException("Unrecognized mutation type " + mutationType);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        }<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      case 2:<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        assert "Scan".equals(method.getName());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        scanTracker.updateRpc(stats);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        return;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      case 3:<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        assert "BulkLoadHFile".equals(method.getName());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        // use generic implementation<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        break;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      case 4:<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        assert "ExecService".equals(method.getName());<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        // use generic implementation<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        break;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      case 5:<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        assert "ExecRegionServerService".equals(method.getName());<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        // use generic implementation<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        break;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      case 6:<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        assert "Multi".equals(method.getName());<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        multiTracker.updateRpc(stats);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        return;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      default:<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        throw new RuntimeException("Unrecognized ClientService RPC type " + method.getFullName());<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      }<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    }<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // Fallback to dynamic registry lookup for DDL methods.<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    updateRpcGeneric(method, stats);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  }<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>  public void incrCacheDroppingExceptions(Object exception) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    getMetric(CACHE_BASE + exception.getClass().getSimpleName(),<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      cacheDroppingExceptions, counterFactory).inc();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>  }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>}<a name="line.470"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /** A lambda for dispatching to the appropriate metric factory method */<a name="line.237"></a>
+<span class="sourceLineNo">238</span>  private static interface NewMetric&lt;T&gt; {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    T newMetric(Class&lt;?&gt; clazz, String name, String scope);<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>  /** Anticipated number of metric entries */<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  private static final int CAPACITY = 50;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  /** Default load factor from {@link java.util.HashMap#DEFAULT_LOAD_FACTOR} */<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  private static final float LOAD_FACTOR = 0.75f;<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  /**<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * Anticipated number of concurrent accessor threads, from<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * {@link ConnectionImplementation#getBatchPool()}<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  private static final int CONCURRENCY_LEVEL = 256;<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  private final MetricRegistry registry;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  private final JmxReporter reporter;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  private final String scope;<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  private final NewMetric&lt;Timer&gt; timerFactory = new NewMetric&lt;Timer&gt;() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    @Override public Timer newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      return registry.timer(name(clazz, name, scope));<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>  private final NewMetric&lt;Histogram&gt; histogramFactory = new NewMetric&lt;Histogram&gt;() {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    @Override public Histogram newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      return registry.histogram(name(clazz, name, scope));<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  };<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  private final NewMetric&lt;Counter&gt; counterFactory = new NewMetric&lt;Counter&gt;() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    @Override public Counter newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      return registry.counter(name(clazz, name, scope));<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span>  };<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>  // static metrics<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @VisibleForTesting protected final Counter metaCacheHits;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @VisibleForTesting protected final Counter metaCacheMisses;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  @VisibleForTesting protected final CallTracker getTracker;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  @VisibleForTesting protected final CallTracker scanTracker;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  @VisibleForTesting protected final CallTracker appendTracker;<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  @VisibleForTesting protected final CallTracker deleteTracker;<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @VisibleForTesting protected final CallTracker incrementTracker;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  @VisibleForTesting protected final CallTracker putTracker;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  @VisibleForTesting protected final CallTracker multiTracker;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  @VisibleForTesting protected final RunnerStats runnerStats;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  private final Counter metaCacheNumClearServer;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  private final Counter metaCacheNumClearRegion;<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>  // dynamic metrics<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>  // These maps are used to cache references to the metric instances that are managed by the<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  // registry. I don't think their use perfectly removes redundant allocations, but it's<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  // a big improvement over calling registry.newMetric each time.<a name="line.293"></a>
+<span class="sourceLineNo">294</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Timer&gt; rpcTimers =<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Histogram&gt; rpcHistograms =<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY * 2 /* tracking both request and response sizes */,<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  private final ConcurrentMap&lt;String, Counter&gt; cacheDroppingExceptions =<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  public MetricsConnection(final ConnectionImplementation conn) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    this.scope = conn.toString();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    this.registry = new MetricRegistry();<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    final ThreadPoolExecutor batchPool = (ThreadPoolExecutor) conn.getCurrentBatchPool();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    final ThreadPoolExecutor metaPool = (ThreadPoolExecutor) conn.getCurrentMetaLookupPool();<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>    this.registry.register(name(this.getClass(), "executorPoolActiveThreads", scope),<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        new RatioGauge() {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>          @Override<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          protected Ratio getRatio() {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            return Ratio.of(batchPool.getActiveCount(), batchPool.getMaximumPoolSize());<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>    this.registry.register(name(this.getClass(), "metaPoolActiveThreads", scope),<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        new RatioGauge() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          @Override<a name="line.317"></a>
+<span class="sourceLineNo">318</span>          protected Ratio getRatio() {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>            return Ratio.of(metaPool.getActiveCount(), metaPool.getMaximumPoolSize());<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>    this.metaCacheHits = registry.counter(name(this.getClass(), "metaCacheHits", scope));<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    this.metaCacheMisses = registry.counter(name(this.getClass(), "metaCacheMisses", scope));<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    this.metaCacheNumClearServer = registry.counter(name(this.getClass(),<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      "metaCacheNumClearServer", scope));<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    this.metaCacheNumClearRegion = registry.counter(name(this.getClass(),<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      "metaCacheNumClearRegion", scope));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    this.getTracker = new CallTracker(this.registry, "Get", scope);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    this.scanTracker = new CallTracker(this.registry, "Scan", scope);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    this.appendTracker = new CallTracker(this.registry, "Mutate", "Append", scope);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    this.deleteTracker = new CallTracker(this.registry, "Mutate", "Delete", scope);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    this.incrementTracker = new CallTracker(this.registry, "Mutate", "Increment", scope);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    this.putTracker = new CallTracker(this.registry, "Mutate", "Put", scope);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    this.multiTracker = new CallTracker(this.registry, "Multi", scope);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    this.runnerStats = new RunnerStats(this.registry);<a name="line.335"></a>
+<span class="sourceLineNo">336</span><a name="line.336"></a>
+<span class="sourceLineNo">337</span>    this.reporter = JmxReporter.forRegistry(this.registry).build();<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    this.reporter.start();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  public void shutdown() {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    this.reporter.stop();<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  /** Produce an instance of {@link CallStats} for clients to attach to RPCs. */<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  public static CallStats newCallStats() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    // TODO: instance pool to reduce GC?<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    return new CallStats();<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>  /** Increment the number of meta cache hits. */<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  public void incrMetaCacheHit() {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    metaCacheHits.inc();<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>  /** Increment the number of meta cache misses. */<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  public void incrMetaCacheMiss() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    metaCacheMisses.inc();<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  }<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span>  /** Increment the number of meta cache drops requested for entire RegionServer. */<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  public void incrMetaCacheNumClearServer() {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    metaCacheNumClearServer.inc();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>  }<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span>  /** Increment the number of meta cache drops requested for individual region. */<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  public void incrMetaCacheNumClearRegion() {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    metaCacheNumClearRegion.inc();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  }<a name="line.369"></a>
+<span class="sourceLineNo">370</span><a name="line.370"></a>
+<span class="sourceLineNo">371</span>  /** Increment the number of normal runner counts. */<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  public void incrNormalRunners() {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    this.runnerStats.incrNormalRunners();<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>  /** Increment the number of delay runner counts. */<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void incrDelayRunners() {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    this.runnerStats.incrDelayRunners();<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>  /** Update delay interval of delay runner. */<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public void updateDelayInterval(long interval) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    this.runnerStats.updateDelayInterval(interval);<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>  /**<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   * Get a metric for {@code key} from {@code map}, or create it with {@code factory}.<a name="line.387"></a>
+<span class="sourceLineNo">388</span>   */<a name="line.388"></a>
+<span class="sourceLineNo">389</span>  private &lt;T&gt; T getMetric(String key, ConcurrentMap&lt;String, T&gt; map, NewMetric&lt;T&gt; factory) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    T t = map.get(key);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    if (t == null) {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      t = factory.newMetric(this.getClass(), key, scope);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      T tmp = map.putIfAbsent(key, t);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      t = (tmp == null) ? t : tmp;<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    return t;<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>  /** Update call stats for non-critical-path methods */<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  private void updateRpcGeneric(MethodDescriptor method, CallStats stats) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    final String methodName = method.getService().getName() + "_" + method.getName();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    getMetric(DRTN_BASE + methodName, rpcTimers, timerFactory)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        .update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    getMetric(REQ_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        .update(stats.getRequestSizeBytes());<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    getMetric(RESP_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        .update(stats.getResponseSizeBytes());<a name="line.407"></a>
+<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
+<span class="sourceLineNo">410</span>  /** Report RPC context to metrics system. */<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public void updateRpc(MethodDescriptor method, Message param, CallStats stats) {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    // this implementation is tied directly to protobuf implementation details. would be better<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    // if we could dispatch based on something static, ie, request Message type.<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (method.getService() == ClientService.getDescriptor()) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      switch(method.getIndex()) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      case 0:<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        assert "Get".equals(method.getName());<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        getTracker.updateRpc(stats);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        return;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      case 1:<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        assert "Mutate".equals(method.getName());<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        final MutationType mutationType = ((MutateRequest) param).getMutation().getMutateType();<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        switch(mutationType) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        case APPEND:<a name="line.424"></a>
+<span class="sourceLineNo">425</span>          appendTracker.updateRpc(stats);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          return;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        case DELETE:<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          deleteTracker.updateRpc(stats);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          return;<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        case INCREMENT:<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          incrementTracker.updateRpc(stats);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          return;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>        case PUT:<a name="line.433"></a>
+<span class="sourceLineNo">434</span>          putTracker.updateRpc(stats);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>          return;<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        default:<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          throw new RuntimeException("Unrecognized mutation type " + mutationType);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        }<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      case 2:<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        assert "Scan".equals(method.getName());<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        scanTracker.updateRpc(stats);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        return;<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      case 3:<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        assert "BulkLoadHFile".equals(method.getName());<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        // use generic implementation<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        break;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      case 4:<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        assert "ExecService".equals(method.getName());<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        // use generic implementation<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        break;<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      case 5:<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        assert "ExecRegionServerService".equals(method.getName());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        // use generic implementation<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        break;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      case 6:<a name="line.455"></a>
+<span class="sourceLineNo">456</span>        assert "Multi".equals(method.getName());<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        multiTracker.updateRpc(stats);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        return;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      default:<a name="line.459"></a>
+<span class="sourceLineNo">460</span>        throw new RuntimeException("Unrecognized ClientService RPC type " + method.getFullName());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      }<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    // Fallback to dynamic registry lookup for DDL methods.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    updateRpcGeneric(method, stats);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  public void incrCacheDroppingExceptions(Object exception) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    getMetric(CACHE_BASE +<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      (exception == null? UNKNOWN_EXCEPTION : exception.getClass().getSimpleName()),<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      cacheDroppingExceptions, counterFactory).inc();<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>}<a name="line.472"></a>
 
 
 


[48/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index a373cba..387773f 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: 1712,
-             Errors: 12614,
+             Errors: 12615,
              Warnings: 0,
              Infos: 0
       </title>
@@ -4339,7 +4339,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  27
+                  21
                 </td>
               </tr>
                           <tr>
@@ -20817,7 +20817,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  152
+                  159
                 </td>
               </tr>
                           <tr>
@@ -23281,7 +23281,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  3
+                  4
                 </td>
               </tr>
                           <tr>
@@ -23631,7 +23631,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  8
+                  7
                 </td>
               </tr>
                           <tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index 662b3b2..691526c 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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <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-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/cygwin.html
----------------------------------------------------------------------
diff --git a/cygwin.html b/cygwin.html
index fe11768..31d999f 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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <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-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index c006613..2f6cac2 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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <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-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 5abb5f1..01a1510 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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <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" />
@@ -1343,7 +1343,7 @@
 <td>
 <table border="0" class="table table-striped">
 <tr class="b">
-<td width="25%">3.4.6</td>
+<td width="25%">3.4.8</td>
 <td>
 <ol style="list-style-type: lower-alpha">
 <li><a class="externalLink" href="http://hbase.apache.org/hbase-client">org.apache.hbase:hbase-client</a></li>
@@ -1702,7 +1702,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index 1112309..70eca25 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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <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-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index 7ec6833..8007585 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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <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" />
@@ -559,7 +559,7 @@
 <tr class="b">
 <td>org.apache.zookeeper</td>
 <td>zookeeper</td>
-<td>3.4.6</td>
+<td>3.4.8</td>
 <td>jar</td>
 <td>-</td></tr>
 <tr class="a">
@@ -798,7 +798,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 57ba046..9fd4fa4 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3972,6 +3972,13 @@
 <td><code><a href="org/apache/hadoop/hbase/client/MetricsConnection.html#RESP_BASE">RESP_BASE</a></code></td>
 <td class="colLast"><code>"rpcCallResponseSizeBytes_"</code></td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.client.MetricsConnection.UNKNOWN_EXCEPTION">
+<!--   -->
+</a><code>private&nbsp;static&nbsp;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></code></td>
+<td><code><a href="org/apache/hadoop/hbase/client/MetricsConnection.html#UNKNOWN_EXCEPTION">UNKNOWN_EXCEPTION</a></code></td>
+<td class="colLast"><code>"UnknownException"</code></td>
+</tr>
 </tbody>
 </table>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 1ceb94b..143be17 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -6921,6 +6921,8 @@
 </dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.BitSetNode.html#canGrow(long)">canGrow(long)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.<a href="./org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.BitSetNode</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/filter/TimestampsFilter.html#canHint">canHint</a></span> - Variable in class org.apache.hadoop.hbase.filter.<a href="./org/apache/hadoop/hbase/filter/TimestampsFilter.html" title="class in org.apache.hadoop.hbase.filter">TimestampsFilter</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.BitSetNode.html#canMerge(org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker.BitSetNode)">canMerge(ProcedureStoreTracker.BitSetNode)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.<a href="./org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.BitSetNode</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html#canPlaceFavoredNodes()">canPlaceFavoredNodes()</a></span> - Method in class org.apache.hadoop.hbase.master.balancer.<a href="./org/apache/hadoop/hbase/master/balancer/FavoredNodeAssignmentHelper.html" title="class in org.apache.hadoop.hbase.master.balancer">FavoredNodeAssignmentHelper</a></dt>
@@ -7484,6 +7486,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html#channel">channel</a></span> - Variable in class org.apache.hadoop.hbase.master.<a href="./org/apache/hadoop/hbase/master/ClusterStatusPublisher.MulticastPublisher.html" title="class in org.apache.hadoop.hbase.master">ClusterStatusPublisher.MulticastPublisher</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html#channelInactive(io.netty.channel.ChannelHandlerContext)">channelInactive(ChannelHandlerContext)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html" title="class in org.apache.hadoop.hbase.ipc">AsyncServerResponseHandler</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/RpcServer.html#channelIO(java.nio.channels.ReadableByteChannel,%20java.nio.channels.WritableByteChannel,%20java.nio.ByteBuffer)">channelIO(ReadableByteChannel, WritableByteChannel, ByteBuffer)</a></span> - Static method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/RpcServer.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer</a></dt>
 <dd>
 <div class="block">Helper for <a href="./org/apache/hadoop/hbase/ipc/RpcServer.html#channelRead(java.nio.channels.ReadableByteChannel,%20java.nio.ByteBuffer)"><code>RpcServer.channelRead(java.nio.channels.ReadableByteChannel, java.nio.ByteBuffer)</code></a>
@@ -7493,8 +7497,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/AsyncRpcClient.RpcChannelImplementation.html#channelOperationTimeout">channelOperationTimeout</a></span> - Variable in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/AsyncRpcClient.RpcChannelImplementation.html" title="class in org.apache.hadoop.hbase.ipc">AsyncRpcClient.RpcChannelImplementation</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html#channelRead(io.netty.channel.ChannelHandlerContext,%20java.lang.Object)">channelRead(ChannelHandlerContext, Object)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html" title="class in org.apache.hadoop.hbase.ipc">AsyncServerResponseHandler</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/RpcServer.html#channelRead(java.nio.channels.ReadableByteChannel,%20java.nio.ByteBuffer)">channelRead(ReadableByteChannel, ByteBuffer)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/RpcServer.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer</a></dt>
 <dd>
 <div class="block">This is a wrapper around <a href="http://docs.oracle.com/javase/7/docs/api/java/nio/channels/ReadableByteChannel.html?is-external=true#read(java.nio.ByteBuffer)" title="class or interface in java.nio.channels"><code>ReadableByteChannel.read(java.nio.ByteBuffer)</code></a>.</div>
@@ -7503,6 +7505,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/client/ClusterStatusListener.MulticastListener.ClusterStatusHandler.html#channelRead0(io.netty.channel.ChannelHandlerContext,%20io.netty.channel.socket.DatagramPacket)">channelRead0(ChannelHandlerContext, DatagramPacket)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="./org/apache/hadoop/hbase/client/ClusterStatusListener.MulticastListener.ClusterStatusHandler.html" title="class in org.apache.hadoop.hbase.client">ClusterStatusListener.MulticastListener.ClusterStatusHandler</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html#channelRead0(io.netty.channel.ChannelHandlerContext,%20io.netty.buffer.ByteBuf)">channelRead0(ChannelHandlerContext, ByteBuf)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html" title="class in org.apache.hadoop.hbase.ipc">AsyncServerResponseHandler</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/SaslClientHandler.html#channelUnregistered(io.netty.channel.ChannelHandlerContext)">channelUnregistered(ChannelHandlerContext)</a></span> - Method in class org.apache.hadoop.hbase.security.<a href="./org/apache/hadoop/hbase/security/SaslClientHandler.html" title="class in org.apache.hadoop.hbase.security">SaslClientHandler</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/RpcServer.html#channelWrite(java.nio.channels.GatheringByteChannel,%20org.apache.hadoop.hbase.ipc.BufferChain)">channelWrite(GatheringByteChannel, BufferChain)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/RpcServer.html" title="class in org.apache.hadoop.hbase.ipc">RpcServer</a></dt>
@@ -9776,6 +9780,8 @@
 <dd>
 <div class="block">Close the connection to ZooKeeper.</div>
 </dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#close0(java.lang.Throwable)">close0(Throwable)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html" title="class in org.apache.hadoop.hbase.ipc">AsyncRpcChannel</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/visibility/ExpressionParser.html#CLOSE_PARAN">CLOSE_PARAN</a></span> - Static variable in class org.apache.hadoop.hbase.security.visibility.<a href="./org/apache/hadoop/hbase/security/visibility/ExpressionParser.html" title="class in org.apache.hadoop.hbase.security.visibility">ExpressionParser</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/visibility/expression/LeafExpressionNode.html#CLOSE_PARAN_NODE">CLOSE_PARAN_NODE</a></span> - Static variable in class org.apache.hadoop.hbase.security.visibility.expression.<a href="./org/apache/hadoop/hbase/security/visibility/expression/LeafExpressionNode.html" title="class in org.apache.hadoop.hbase.security.visibility.expression">LeafExpressionNode</a></dt>
@@ -10378,8 +10384,7 @@
 <dd>&nbsp;</dd>
 <dt><a href="./org/apache/hadoop/hbase/util/CollectionBackedScanner.html" title="class in org.apache.hadoop.hbase.util"><span class="strong">CollectionBackedScanner</span></a> - Class in <a href="./org/apache/hadoop/hbase/util/package-summary.html">org.apache.hadoop.hbase.util</a></dt>
 <dd>
-<div class="block">Utility scanner that wraps a sortable collection and serves
- as a KeyValueScanner.</div>
+<div class="block">Utility scanner that wraps a sortable collection and serves as a KeyValueScanner.</div>
 </dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/util/CollectionBackedScanner.html#CollectionBackedScanner(java.util.SortedSet)">CollectionBackedScanner(SortedSet&lt;Cell&gt;)</a></span> - Constructor for class org.apache.hadoop.hbase.util.<a href="./org/apache/hadoop/hbase/util/CollectionBackedScanner.html" title="class in org.apache.hadoop.hbase.util">CollectionBackedScanner</a></dt>
 <dd>&nbsp;</dd>
@@ -21780,6 +21785,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/client/ClusterStatusListener.MulticastListener.ClusterStatusHandler.html#exceptionCaught(io.netty.channel.ChannelHandlerContext,%20java.lang.Throwable)">exceptionCaught(ChannelHandlerContext, Throwable)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="./org/apache/hadoop/hbase/client/ClusterStatusListener.MulticastListener.ClusterStatusHandler.html" title="class in org.apache.hadoop.hbase.client">ClusterStatusListener.MulticastListener.ClusterStatusHandler</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html#exceptionCaught(io.netty.channel.ChannelHandlerContext,%20java.lang.Throwable)">exceptionCaught(ChannelHandlerContext, Throwable)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html" title="class in org.apache.hadoop.hbase.ipc">AsyncServerResponseHandler</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/SaslClientHandler.html#exceptionCaught(io.netty.channel.ChannelHandlerContext,%20java.lang.Throwable)">exceptionCaught(ChannelHandlerContext, Throwable)</a></span> - Method in class org.apache.hadoop.hbase.security.<a href="./org/apache/hadoop/hbase/security/SaslClientHandler.html" title="class in org.apache.hadoop.hbase.security">SaslClientHandler</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/SaslClientHandler.html#exceptionHandler">exceptionHandler</a></span> - Variable in class org.apache.hadoop.hbase.security.<a href="./org/apache/hadoop/hbase/security/SaslClientHandler.html" title="class in org.apache.hadoop.hbase.security">SaslClientHandler</a></dt>
@@ -25634,6 +25641,10 @@
 </dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/RSRpcServices.html#get(org.apache.hadoop.hbase.client.Get,%20org.apache.hadoop.hbase.regionserver.HRegion,%20org.apache.hadoop.hbase.regionserver.RSRpcServices.RegionScannersCloseCallBack,%20org.apache.hadoop.hbase.ipc.RpcCallContext)">get(Get, HRegion, RSRpcServices.RegionScannersCloseCallBack, RpcCallContext)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/RSRpcServices.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html#get">get</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html" title="class in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher</a></dt>
+<dd>
+<div class="block">True if we are doing a 'Get' Scan.</div>
+</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/StoreScanner.html#get">get</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/StoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreScanner</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#get()">get()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="./org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a></dt>
@@ -32703,6 +32714,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint(Cell)</a></span> - Method in class org.apache.hadoop.hbase.filter.<a href="./org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html" title="class in org.apache.hadoop.hbase.filter">MultiRowRangeFilter</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/filter/TimestampsFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint(Cell)</a></span> - Method in class org.apache.hadoop.hbase.filter.<a href="./org/apache/hadoop/hbase/filter/TimestampsFilter.html" title="class in org.apache.hadoop.hbase.filter">TimestampsFilter</a></dt>
+<dd>
+<div class="block">Pick the next cell that the scanner should seek to.</div>
+</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/access/HbaseObjectWritableFor96Migration.html#getNextClassCode()">getNextClassCode()</a></span> - Static method in class org.apache.hadoop.hbase.security.access.<a href="./org/apache/hadoop/hbase/security/access/HbaseObjectWritableFor96Migration.html" title="class in org.apache.hadoop.hbase.security.access">HbaseObjectWritableFor96Migration</a></dt>
 <dd>
 <div class="block"><span class="strong">Deprecated.</span></div>
@@ -40466,9 +40481,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#handleSaslConnectionFailure(int,%20java.lang.Throwable,%20org.apache.hadoop.security.UserGroupInformation)">handleSaslConnectionFailure(int, Throwable, UserGroupInformation)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html" title="class in org.apache.hadoop.hbase.ipc">AsyncRpcChannel</a></dt>
 <dd>
-<div class="block">If multiple clients with the same principal try to connect
- to the same server at the same time, the server assumes a
- replay attack is in progress.</div>
+<div class="block">If multiple clients with the same principal try to connect to the same server at the same time,
+ the server assumes a replay attack is in progress.</div>
 </dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html#handleSaslConnectionFailure(int,%20int,%20java.lang.Exception,%20java.util.Random,%20org.apache.hadoop.security.UserGroupInformation)">handleSaslConnectionFailure(int, int, Exception, Random, UserGroupInformation)</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcClientImpl.Connection</a></dt>
 <dd>
@@ -60541,7 +60555,9 @@
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/util/BloomFilterUtil.html#optimalFunctionCount(int,%20long)">optimalFunctionCount(int, long)</a></span> - Static method in class org.apache.hadoop.hbase.util.<a href="./org/apache/hadoop/hbase/util/BloomFilterUtil.html" title="class in org.apache.hadoop.hbase.util">BloomFilterUtil</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/StoreScanner.html#optimize(org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode,%20org.apache.hadoop.hbase.Cell)">optimize(ScanQueryMatcher.MatchCode, Cell)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/StoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">StoreScanner</a></dt>
-<dd>&nbsp;</dd>
+<dd>
+<div class="block">See if we should actually SEEK or rather just SKIP to the next Cell (see HBASE-13109).</div>
+</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/thrift/ThriftServerRunner.ImplType.html#option">option</a></span> - Variable in enum org.apache.hadoop.hbase.thrift.<a href="./org/apache/hadoop/hbase/thrift/ThriftServerRunner.ImplType.html" title="enum in org.apache.hadoop.hbase.thrift">ThriftServerRunner.ImplType</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/classification/tools/ExcludePrivateAnnotationsStandardDoclet.html#optionLength(java.lang.String)">optionLength(String)</a></span> - Static method in class org.apache.hadoop.hbase.classification.tools.<a href="./org/apache/hadoop/hbase/classification/tools/ExcludePrivateAnnotationsStandardDoclet.html" title="class in org.apache.hadoop.hbase.classification.tools">ExcludePrivateAnnotationsStandardDoclet</a></dt>
@@ -88535,6 +88551,10 @@ service.</div>
 </dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/filter/TimestampsFilter.html#TimestampsFilter(java.util.List)">TimestampsFilter(List&lt;Long&gt;)</a></span> - Constructor for class org.apache.hadoop.hbase.filter.<a href="./org/apache/hadoop/hbase/filter/TimestampsFilter.html" title="class in org.apache.hadoop.hbase.filter">TimestampsFilter</a></dt>
 <dd>
+<div class="block">Constructor for filter that retains only the specified timestamps in the list.</div>
+</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/filter/TimestampsFilter.html#TimestampsFilter(java.util.List,%20boolean)">TimestampsFilter(List&lt;Long&gt;, boolean)</a></span> - Constructor for class org.apache.hadoop.hbase.filter.<a href="./org/apache/hadoop/hbase/filter/TimestampsFilter.html" title="class in org.apache.hadoop.hbase.filter">TimestampsFilter</a></dt>
+<dd>
 <div class="block">Constructor for filter that retains only those
  cells whose timestamp (version) is in the specified
  list of timestamps.</div>
@@ -88997,14 +89017,14 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html#token">token</a></span> - Variable in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/RpcClientImpl.Connection.html" title="class in org.apache.hadoop.hbase.ipc">RpcClientImpl.Connection</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#TOKEN_HANDDLERS">TOKEN_HANDDLERS</a></span> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html" title="class in org.apache.hadoop.hbase.ipc">AsyncRpcChannel</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="./org/apache/hadoop/hbase/codec/prefixtree/encode/tokenize/TokenDepthComparator.html" title="class in org.apache.hadoop.hbase.codec.prefixtree.encode.tokenize"><span class="strong">TokenDepthComparator</span></a> - Class in <a href="./org/apache/hadoop/hbase/codec/prefixtree/encode/tokenize/package-summary.html">org.apache.hadoop.hbase.codec.prefixtree.encode.tokenize</a></dt>
 <dd>
 <div class="block">Determines order of nodes in the output array.</div>
 </dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/codec/prefixtree/encode/tokenize/TokenDepthComparator.html#TokenDepthComparator()">TokenDepthComparator()</a></span> - Constructor for class org.apache.hadoop.hbase.codec.prefixtree.encode.tokenize.<a href="./org/apache/hadoop/hbase/codec/prefixtree/encode/tokenize/TokenDepthComparator.html" title="class in org.apache.hadoop.hbase.codec.prefixtree.encode.tokenize">TokenDepthComparator</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html#tokenHandlers">tokenHandlers</a></span> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/AsyncRpcChannel.html" title="class in org.apache.hadoop.hbase.ipc">AsyncRpcChannel</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/RpcClientImpl.html#tokenHandlers">tokenHandlers</a></span> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/RpcClientImpl.html" title="class in org.apache.hadoop.hbase.ipc">RpcClientImpl</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/codec/prefixtree/encode/column/ColumnSectionWriter.html#tokenizer">tokenizer</a></span> - Variable in class org.apache.hadoop.hbase.codec.prefixtree.encode.column.<a href="./org/apache/hadoop/hbase/codec/prefixtree/encode/column/ColumnSectionWriter.html" title="class in org.apache.hadoop.hbase.codec.prefixtree.encode.column">ColumnSectionWriter</a></dt>
@@ -90935,6 +90955,8 @@ service.</div>
 </dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.html#UNKNOWN">UNKNOWN</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.html" title="class in org.apache.hadoop.hbase.regionserver">MetricsRegionWrapperImpl</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/client/MetricsConnection.html#UNKNOWN_EXCEPTION">UNKNOWN_EXCEPTION</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="./org/apache/hadoop/hbase/client/MetricsConnection.html" title="class in org.apache.hadoop.hbase.client">MetricsConnection</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/master/RackManager.html#UNKNOWN_RACK">UNKNOWN_RACK</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="./org/apache/hadoop/hbase/master/RackManager.html" title="class in org.apache.hadoop.hbase.master">RackManager</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/ServerName.html#UNKNOWN_SERVERNAME">UNKNOWN_SERVERNAME</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="./org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/CellComparator.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/CellComparator.html b/devapidocs/org/apache/hadoop/hbase/CellComparator.html
index a648de8..9b5eb70 100644
--- a/devapidocs/org/apache/hadoop/hbase/CellComparator.html
+++ b/devapidocs/org/apache/hadoop/hbase/CellComparator.html
@@ -716,7 +716,7 @@ implements <a href="http://docs.oracle.com/javase/7/docs/api/java/util/Comparato
                            byte&nbsp;type)</pre>
 <div class="block">Used to compare two cells based on the column hint provided. This is specifically
  used when we need to optimize the seeks based on the next indexed key. This is an
- advance usage API specifically needed for some optimizations.</div>
+ advanced usage API specifically needed for some optimizations.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>nextIndexedCell</code> - the next indexed cell</dd><dd><code>currentCell</code> - the cell to be compared</dd><dd><code>foff</code> - the family offset of the currentCell</dd><dd><code>flen</code> - the family length of the currentCell</dd><dd><code>colHint</code> - the column hint provided - could be null</dd><dd><code>coff</code> - the offset of the column hint if provided, if not offset of the currentCell's
  qualifier</dd><dd><code>clen</code> - the length of the column hint if provided, if not length of the currentCell's
  qualifier</dd><dd><code>ts</code> - the timestamp to be seeked</dd><dd><code>type</code> - the type to be seeked</dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/class-use/Cell.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/class-use/Cell.html b/devapidocs/org/apache/hadoop/hbase/class-use/Cell.html
index 1ceb31b..5ac1416 100644
--- a/devapidocs/org/apache/hadoop/hbase/class-use/Cell.html
+++ b/devapidocs/org/apache/hadoop/hbase/class-use/Cell.html
@@ -2512,42 +2512,48 @@ service.</div>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
-<td class="colLast"><span class="strong">FilterWrapper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code>&nbsp;</td>
+<td class="colLast"><span class="strong">TimestampsFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code>
+<div class="block">Pick the next cell that the scanner should seek to.</div>
+</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
+<td class="colLast"><span class="strong">FilterWrapper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">FilterBase.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code>
 <div class="block">Filters that are not sure which key must be next seeked to, can inherit
  this implementation that, by default, returns a null Cell.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">SkipFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/SkipFilter.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>abstract <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">Filter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code>
 <div class="block">Give the filter a chance to transform the passed KeyValue.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">KeyOnlyFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/KeyOnlyFilter.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">FilterList.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">WhileMatchFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/WhileMatchFilter.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">FilterWrapper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">FilterBase.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code>
 <div class="block">By default no transformation takes place
@@ -2845,53 +2851,59 @@ service.</div>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
-<td class="colLast"><span class="strong">FilterWrapper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code>&nbsp;</td>
+<td class="colLast"><span class="strong">TimestampsFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code>
+<div class="block">Pick the next cell that the scanner should seek to.</div>
+</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
+<td class="colLast"><span class="strong">FilterWrapper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">FilterBase.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code>
 <div class="block">Filters that are not sure which key must be next seeked to, can inherit
  this implementation that, by default, returns a null Cell.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><span class="strong">FirstKeyValueMatchingQualifiersFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FirstKeyValueMatchingQualifiersFilter.html#hasOneMatchingQualifier(org.apache.hadoop.hbase.Cell)">hasOneMatchingQualifier</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code>
 <div class="block"><strong>Deprecated.</strong>&nbsp;</div>
 &nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><span class="strong">FuzzyRowFilter.RowTracker.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.RowTracker.html#lessThan(org.apache.hadoop.hbase.Cell,%20byte[])">lessThan</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell,
                 byte[]&nbsp;nextRowKey)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">SkipFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/SkipFilter.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>abstract <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">Filter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code>
 <div class="block">Give the filter a chance to transform the passed KeyValue.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">KeyOnlyFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/KeyOnlyFilter.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">FilterList.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">WhileMatchFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/WhileMatchFilter.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">FilterWrapper.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">FilterBase.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FilterBase.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code>
 <div class="block">By default no transformation takes place
@@ -2899,11 +2911,11 @@ service.</div>
  Give the filter a chance to transform the passed KeyValue.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><span class="strong">FuzzyRowFilter.RowTracker.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.RowTracker.html#updateTracker(org.apache.hadoop.hbase.Cell)">updateTracker</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</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">FuzzyRowFilter.RowTracker.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.RowTracker.html#updateWith(org.apache.hadoop.hbase.Cell,%20org.apache.hadoop.hbase.util.Pair)">updateWith</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell,
                     <a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;byte[],byte[]&gt;&nbsp;fuzzyData)</code>&nbsp;</td>
@@ -4972,9 +4984,11 @@ service.</div>
                                   byte[]&nbsp;k2)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a></code></td>
+<td class="colFirst"><code>protected <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a></code></td>
 <td class="colLast"><span class="strong">StoreScanner.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#optimize(org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode,%20org.apache.hadoop.hbase.Cell)">optimize</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a>&nbsp;qcode,
-                <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>&nbsp;</td>
+                <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>
+<div class="block">See if we should actually SEEK or rather just SKIP to the next Cell (see HBASE-13109).</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/classification/class-use/InterfaceAudience.Private.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/classification/class-use/InterfaceAudience.Private.html b/devapidocs/org/apache/hadoop/hbase/classification/class-use/InterfaceAudience.Private.html
index 7477b6c..4c9c5f5 100644
--- a/devapidocs/org/apache/hadoop/hbase/classification/class-use/InterfaceAudience.Private.html
+++ b/devapidocs/org/apache/hadoop/hbase/classification/class-use/InterfaceAudience.Private.html
@@ -7515,8 +7515,7 @@ service.</div>
 <tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/util/CollectionBackedScanner.html" title="class in org.apache.hadoop.hbase.util">CollectionBackedScanner</a></strong></code>
-<div class="block">Utility scanner that wraps a sortable collection and serves
- as a KeyValueScanner.</div>
+<div class="block">Utility scanner that wraps a sortable collection and serves as a KeyValueScanner.</div>
 </td>
 </tr>
 <tr class="rowColor">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/classification/class-use/InterfaceStability.Unstable.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/classification/class-use/InterfaceStability.Unstable.html b/devapidocs/org/apache/hadoop/hbase/classification/class-use/InterfaceStability.Unstable.html
index 1a288a4..20f2daa 100644
--- a/devapidocs/org/apache/hadoop/hbase/classification/class-use/InterfaceStability.Unstable.html
+++ b/devapidocs/org/apache/hadoop/hbase/classification/class-use/InterfaceStability.Unstable.html
@@ -136,19 +136,19 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/http/lib/package-summary.html">org.apache.hadoop.hbase.http.lib</a></td>
+<td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/http/package-summary.html">org.apache.hadoop.hbase.http</a></td>
 <td class="colLast">
 <div class="block">
- This package provides user-selectable (via configuration) classes that add
- functionality to the web UI.</div>
+ Copied from hadoop source code.<br>
+ See https://issues.apache.org/jira/browse/HADOOP-10232 to know why.</div>
 </td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/http/package-summary.html">org.apache.hadoop.hbase.http</a></td>
+<td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/http/lib/package-summary.html">org.apache.hadoop.hbase.http.lib</a></td>
 <td class="colLast">
 <div class="block">
- Copied from hadoop source code.<br>
- See https://issues.apache.org/jira/browse/HADOOP-10232 to know why.</div>
+ This package provides user-selectable (via configuration) classes that add
+ functionality to the web UI.</div>
 </td>
 </tr>
 </tbody>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 ac6e30d..ec4c381 100644
--- a/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/classification/package-tree.html
@@ -81,11 +81,11 @@
 <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.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/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.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/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/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/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.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/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.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>
 </ul>
 </div>
 <!-- ======= START OF BOTTOM NAVBAR ====== -->

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html b/devapidocs/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html
index 9cb3779..970d03b 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html
@@ -772,7 +772,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.A
 <ul class="blockList">
 <li class="blockList">
 <h4>resubmit</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1221">resubmit</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;oldServer,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1227">resubmit</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;oldServer,
             <a href="http://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Action.html" title="class in org.apache.hadoop.hbase.client">Action</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;&gt;&nbsp;toReplay,
             int&nbsp;numAttempt,
             int&nbsp;failureCount,
@@ -787,7 +787,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.A
 <ul class="blockList">
 <li class="blockList">
 <h4>logNoResubmit</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1255">logNoResubmit</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;oldServer,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1261">logNoResubmit</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;oldServer,
                  int&nbsp;numAttempt,
                  int&nbsp;failureCount,
                  <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;throwable,
@@ -801,7 +801,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.A
 <ul class="blockList">
 <li class="blockList">
 <h4>receiveMultiAction</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1278">receiveMultiAction</a>(<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/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;&nbsp;multiAction,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1284">receiveMultiAction</a>(<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/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;&nbsp;multiAction,
                       <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/client/MultiResponse.html" title="class in org.apache.hadoop.hbase.client">MultiResponse</a>&nbsp;responses,
                       int&nbsp;numAttempt)</pre>
@@ -815,7 +815,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.A
 <ul class="blockList">
 <li class="blockList">
 <h4>createLog</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/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1400">createLog</a>(int&nbsp;numAttempt,
+<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/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1418">createLog</a>(int&nbsp;numAttempt,
                int&nbsp;failureCount,
                int&nbsp;replaySize,
                <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sn,
@@ -833,7 +833,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.A
 <ul class="blockList">
 <li class="blockList">
 <h4>setResult</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1438">setResult</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Action.html" title="class in org.apache.hadoop.hbase.client">Action</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;&nbsp;action,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1456">setResult</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Action.html" title="class in org.apache.hadoop.hbase.client">Action</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;&nbsp;action,
              <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;result)</pre>
 <div class="block">Sets the non-error result from a particular action.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>action</code> - Action (request) that the server responded to.</dd><dd><code>result</code> - The result.</dd></dl>
@@ -845,7 +845,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.A
 <ul class="blockList">
 <li class="blockList">
 <h4>setError</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1481">setError</a>(int&nbsp;index,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1499">setError</a>(int&nbsp;index,
             <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&nbsp;row,
             <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;throwable,
             <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;server)</pre>
@@ -859,7 +859,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.A
 <ul class="blockList">
 <li class="blockList">
 <h4>isActionComplete</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1539">isActionComplete</a>(int&nbsp;index,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1557">isActionComplete</a>(int&nbsp;index,
                        <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&nbsp;row)</pre>
 <div class="block">Checks if the action is complete; used on error to prevent needless retries.
  Does not synchronize, assuming element index/field accesses are atomic.
@@ -873,7 +873,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.A
 <ul class="blockList">
 <li class="blockList">
 <h4>trySetResultSimple</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.ReplicaResultState.html" title="class in org.apache.hadoop.hbase.client">AsyncProcess.ReplicaResultState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1550">trySetResultSimple</a>(int&nbsp;index,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.ReplicaResultState.html" title="class in org.apache.hadoop.hbase.client">AsyncProcess.ReplicaResultState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1568">trySetResultSimple</a>(int&nbsp;index,
                                                  <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&nbsp;row,
                                                  boolean&nbsp;isError,
                                                  <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;result,
@@ -889,7 +889,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.A
 <ul class="blockList">
 <li class="blockList">
 <h4>decActionCounter</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1585">decActionCounter</a>(int&nbsp;index)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1603">decActionCounter</a>(int&nbsp;index)</pre>
 </li>
 </ul>
 <a name="buildDetailedErrorMsg(java.lang.String, int)">
@@ -898,7 +898,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.A
 <ul class="blockList">
 <li class="blockList">
 <h4>buildDetailedErrorMsg</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/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1597">buildDetailedErrorMsg</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;string,
+<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/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1615">buildDetailedErrorMsg</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;string,
                            int&nbsp;index)</pre>
 </li>
 </ul>
@@ -908,7 +908,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.A
 <ul class="blockList">
 <li class="blockList">
 <h4>waitUntilDone</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1619">waitUntilDone</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1637">waitUntilDone</a>()
                    throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/InterruptedIOException.html?is-external=true" title="class or interface in java.io">InterruptedIOException</a></pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFuture.html#waitUntilDone()">AsyncProcess.AsyncRequestFuture</a></code></strong></div>
 <div class="block">Wait until all tasks are executed, successfully or not.</div>
@@ -925,7 +925,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.A
 <ul class="blockList">
 <li class="blockList">
 <h4>waitUntilDone</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1633">waitUntilDone</a>(long&nbsp;cutoff)
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1651">waitUntilDone</a>(long&nbsp;cutoff)
                        throws <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl><dt><span class="strong">Throws:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></code></dd></dl>
@@ -937,7 +937,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.A
 <ul class="blockList">
 <li class="blockList">
 <h4>hasError</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1662">hasError</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1680">hasError</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFuture.html#hasError()">hasError</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFuture.html" title="interface in org.apache.hadoop.hbase.client">AsyncProcess.AsyncRequestFuture</a></code></dd>
@@ -950,7 +950,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.A
 <ul class="blockList">
 <li class="blockList">
 <h4>getFailedOperations</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;? extends <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1667">getFailedOperations</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;? extends <a href="../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1685">getFailedOperations</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFuture.html#getFailedOperations()">getFailedOperations</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFuture.html" title="interface in org.apache.hadoop.hbase.client">AsyncProcess.AsyncRequestFuture</a></code></dd>
@@ -963,7 +963,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.A
 <ul class="blockList">
 <li class="blockList">
 <h4>getErrors</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RetriesExhaustedWithDetailsException.html" title="class in org.apache.hadoop.hbase.client">RetriesExhaustedWithDetailsException</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1672">getErrors</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RetriesExhaustedWithDetailsException.html" title="class in org.apache.hadoop.hbase.client">RetriesExhaustedWithDetailsException</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1690">getErrors</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFuture.html#getErrors()">getErrors</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFuture.html" title="interface in org.apache.hadoop.hbase.client">AsyncProcess.AsyncRequestFuture</a></code></dd>
@@ -976,7 +976,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.A
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getResults</h4>
-<pre>public&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>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1677">getResults</a>()
+<pre>public&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>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html#line.1695">getResults</a>()
                     throws <a href="http://docs.oracle.com/javase/7/docs/api/java/io/InterruptedIOException.html?is-external=true" title="class or interface in java.io">InterruptedIOException</a></pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html b/devapidocs/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html
index 75acd68..f59b26c 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html
@@ -108,7 +108,7 @@
 </dl>
 <hr>
 <br>
-<pre>private static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1860">AsyncProcess.Retry</a>
+<pre>private static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.html#line.1878">AsyncProcess.Retry</a>
 extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.Retry.html" title="enum in org.apache.hadoop.hbase.client">AsyncProcess.Retry</a>&gt;</pre>
 <div class="block">For <code>AsyncRequestFutureImpl#manageError(int, Row, Retry, Throwable, ServerName)</code>. Only
  used to make logging more clear, we don't actually care why we don't retry.</div>
@@ -207,7 +207,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>YES</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.Retry.html" title="enum in org.apache.hadoop.hbase.client">AsyncProcess.Retry</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html#line.1861">YES</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.Retry.html" title="enum in org.apache.hadoop.hbase.client">AsyncProcess.Retry</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html#line.1879">YES</a></pre>
 </li>
 </ul>
 <a name="NO_LOCATION_PROBLEM">
@@ -216,7 +216,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>NO_LOCATION_PROBLEM</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.Retry.html" title="enum in org.apache.hadoop.hbase.client">AsyncProcess.Retry</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html#line.1862">NO_LOCATION_PROBLEM</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.Retry.html" title="enum in org.apache.hadoop.hbase.client">AsyncProcess.Retry</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html#line.1880">NO_LOCATION_PROBLEM</a></pre>
 </li>
 </ul>
 <a name="NO_NOT_RETRIABLE">
@@ -225,7 +225,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>NO_NOT_RETRIABLE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.Retry.html" title="enum in org.apache.hadoop.hbase.client">AsyncProcess.Retry</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html#line.1863">NO_NOT_RETRIABLE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.Retry.html" title="enum in org.apache.hadoop.hbase.client">AsyncProcess.Retry</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html#line.1881">NO_NOT_RETRIABLE</a></pre>
 </li>
 </ul>
 <a name="NO_RETRIES_EXHAUSTED">
@@ -234,7 +234,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>NO_RETRIES_EXHAUSTED</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.Retry.html" title="enum in org.apache.hadoop.hbase.client">AsyncProcess.Retry</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html#line.1864">NO_RETRIES_EXHAUSTED</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.Retry.html" title="enum in org.apache.hadoop.hbase.client">AsyncProcess.Retry</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html#line.1882">NO_RETRIES_EXHAUSTED</a></pre>
 </li>
 </ul>
 <a name="NO_OTHER_SUCCEEDED">
@@ -243,7 +243,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>NO_OTHER_SUCCEEDED</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.Retry.html" title="enum in org.apache.hadoop.hbase.client">AsyncProcess.Retry</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html#line.1865">NO_OTHER_SUCCEEDED</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcess.Retry.html" title="enum in org.apache.hadoop.hbase.client">AsyncProcess.Retry</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html#line.1883">NO_OTHER_SUCCEEDED</a></pre>
 </li>
 </ul>
 </li>


[35/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html
index ed7bc7f..e65df71 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.Retry.html
@@ -1198,681 +1198,699 @@
 <span class="sourceLineNo">1190</span>        byte[] row = e.getValue().iterator().next().getAction().getRow();<a name="line.1190"></a>
 <span class="sourceLineNo">1191</span>        // Do not use the exception for updating cache because it might be coming from<a name="line.1191"></a>
 <span class="sourceLineNo">1192</span>        // any of the regions in the MultiAction.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        if (tableName != null) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>          connection.updateCachedLocations(tableName, regionName, row,<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>              ClientExceptionsUtil.isMetaClearingException(t) ? null : t, server);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>        for (Action&lt;Row&gt; action : e.getValue()) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          Retry retry = manageError(<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>              action.getOriginalIndex(), action.getAction(), canRetry, t, server);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (retry == Retry.YES) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            toReplay.add(action);<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            ++stopped;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>          } else {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            ++failed;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>          }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>        }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>      }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      if (toReplay.isEmpty()) {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>        logNoResubmit(server, numAttempt, rsActions.size(), t, failed, stopped);<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>      } else {<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        resubmit(server, toReplay, numAttempt, rsActions.size(), t);<a name="line.1213"></a>
+<span class="sourceLineNo">1193</span>        try {<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          if (tableName != null) {<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>            connection.updateCachedLocations(tableName, regionName, row,<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>              ClientExceptionsUtil.isMetaClearingException(t) ? null : t, server);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>          }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        } catch (Throwable ex) {<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>          // That should never happen, but if it did, we want to make sure<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          // we still process errors<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>          LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        for (Action&lt;Row&gt; action : e.getValue()) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          Retry retry = manageError(<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              action.getOriginalIndex(), action.getAction(), canRetry, t, server);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>          if (retry == Retry.YES) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>            toReplay.add(action);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>            ++stopped;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>            ++failed;<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
 <span class="sourceLineNo">1214</span>      }<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>     * Log as much info as possible, and, if there is something to replay,<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     * submit it again after a back off sleep.<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>     */<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    private void resubmit(ServerName oldServer, List&lt;Action&lt;Row&gt;&gt; toReplay,<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        int numAttempt, int failureCount, Throwable throwable) {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      // We have something to replay. We're going to sleep a little before.<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // We have two contradicting needs here:<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      //  1) We want to get the new location after having slept, as it may change.<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      //  2) We want to take into account the location when calculating the sleep time.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      //  3) If all this is just because the response needed to be chunked try again FAST.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      // It should be possible to have some heuristics to take the right decision. Short term,<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>      //  we go for one.<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      boolean retryImmediately = throwable instanceof RetryImmediatelyException;<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      int nextAttemptNumber = retryImmediately ? numAttempt : numAttempt + 1;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      long backOffTime = retryImmediately ? 0 :<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          errorsByServer.calculateBackoffTime(oldServer, pause);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>      if (numAttempt &gt; startLogErrorsCnt) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        // We use this value to have some logs when we have multiple failures, but not too many<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        //  logs, as errors are to be expected when a region moves, splits and so on<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        LOG.info(createLog(numAttempt, failureCount, toReplay.size(),<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>            oldServer, throwable, backOffTime, true, null, -1, -1));<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      try {<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>        if (backOffTime &gt; 0) {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>          Thread.sleep(backOffTime);<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>        }<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      } catch (InterruptedException e) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>        LOG.warn("#" + id + ", not sent: " + toReplay.size() + " operations, " + oldServer, e);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>        Thread.currentThread().interrupt();<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        return;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>      groupAndSendMultiAction(toReplay, nextAttemptNumber);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    private void logNoResubmit(ServerName oldServer, int numAttempt,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        int failureCount, Throwable throwable, int failed, int stopped) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      if (failureCount != 0 || numAttempt &gt; startLogErrorsCnt + 1) {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>        String timeStr = new Date(errorsByServer.getStartTrackingTime()).toString();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>        String logMessage = createLog(numAttempt, failureCount, 0, oldServer,<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>            throwable, -1, false, timeStr, failed, stopped);<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>        if (failed != 0) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>          // Only log final failures as warning<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>          LOG.warn(logMessage);<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        } else {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>          LOG.info(logMessage);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>        }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    }<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    /**<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>     * Called when we receive the result of a server query.<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>     *<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>     * @param multiAction    - the multiAction we sent<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>     * @param server       - the location. It's used as a server name.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>     * @param responses      - the response, if any<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>     * @param numAttempt     - the attempt<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>     */<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    private void receiveMultiAction(MultiAction&lt;Row&gt; multiAction,<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>        ServerName server, MultiResponse responses, int numAttempt) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>       assert responses != null;<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span><a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      // Success or partial success<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      // Analyze detailed results. We can still have individual failures to be redo.<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      // two specific throwables are managed:<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      //  - DoNotRetryIOException: we continue to retry for other actions<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      //  - RegionMovedException: we update the cache with the new region location<a name="line.1286"></a>
+<span class="sourceLineNo">1215</span><a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      if (toReplay.isEmpty()) {<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>        logNoResubmit(server, numAttempt, rsActions.size(), t, failed, stopped);<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>        resubmit(server, toReplay, numAttempt, rsActions.size(), t);<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    }<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>     * Log as much info as possible, and, if there is something to replay,<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>     * submit it again after a back off sleep.<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    private void resubmit(ServerName oldServer, List&lt;Action&lt;Row&gt;&gt; toReplay,<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        int numAttempt, int failureCount, Throwable throwable) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>      // We have something to replay. We're going to sleep a little before.<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      // We have two contradicting needs here:<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>      //  1) We want to get the new location after having slept, as it may change.<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>      //  2) We want to take into account the location when calculating the sleep time.<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      //  3) If all this is just because the response needed to be chunked try again FAST.<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      // It should be possible to have some heuristics to take the right decision. Short term,<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      //  we go for one.<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      boolean retryImmediately = throwable instanceof RetryImmediatelyException;<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>      int nextAttemptNumber = retryImmediately ? numAttempt : numAttempt + 1;<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      long backOffTime = retryImmediately ? 0 :<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          errorsByServer.calculateBackoffTime(oldServer, pause);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      if (numAttempt &gt; startLogErrorsCnt) {<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>        // We use this value to have some logs when we have multiple failures, but not too many<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>        //  logs, as errors are to be expected when a region moves, splits and so on<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>        LOG.info(createLog(numAttempt, failureCount, toReplay.size(),<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>            oldServer, throwable, backOffTime, true, null, -1, -1));<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      }<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span><a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      try {<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>        if (backOffTime &gt; 0) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>          Thread.sleep(backOffTime);<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>        }<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      } catch (InterruptedException e) {<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>        LOG.warn("#" + id + ", not sent: " + toReplay.size() + " operations, " + oldServer, e);<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>        Thread.currentThread().interrupt();<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>        return;<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span><a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      groupAndSendMultiAction(toReplay, nextAttemptNumber);<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    private void logNoResubmit(ServerName oldServer, int numAttempt,<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        int failureCount, Throwable throwable, int failed, int stopped) {<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>      if (failureCount != 0 || numAttempt &gt; startLogErrorsCnt + 1) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>        String timeStr = new Date(errorsByServer.getStartTrackingTime()).toString();<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>        String logMessage = createLog(numAttempt, failureCount, 0, oldServer,<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>            throwable, -1, false, timeStr, failed, stopped);<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>        if (failed != 0) {<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          // Only log final failures as warning<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          LOG.warn(logMessage);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>        } else {<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>          LOG.info(logMessage);<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>        }<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    }<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span><a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>    /**<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>     * Called when we receive the result of a server query.<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>     *<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>     * @param multiAction    - the multiAction we sent<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>     * @param server       - the location. It's used as a server name.<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>     * @param responses      - the response, if any<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>     * @param numAttempt     - the attempt<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>     */<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    private void receiveMultiAction(MultiAction&lt;Row&gt; multiAction,<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        ServerName server, MultiResponse responses, int numAttempt) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>       assert responses != null;<a name="line.1286"></a>
 <span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      List&lt;Action&lt;Row&gt;&gt; toReplay = new ArrayList&lt;Action&lt;Row&gt;&gt;();<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      Throwable throwable = null;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      int failureCount = 0;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      boolean canRetry = true;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span><a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      Map&lt;byte[], MultiResponse.RegionResult&gt; results = responses.getResults();<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      updateStats(server, results);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      int failed = 0, stopped = 0;<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      // Go by original action.<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      for (Map.Entry&lt;byte[], List&lt;Action&lt;Row&gt;&gt;&gt; regionEntry : multiAction.actions.entrySet()) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        byte[] regionName = regionEntry.getKey();<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>        Map&lt;Integer, Object&gt; regionResults = results.get(regionName) == null<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>            ?  null : results.get(regionName).result;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        if (regionResults == null) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>          if (!responses.getExceptions().containsKey(regionName)) {<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>            LOG.error("Server sent us neither results nor exceptions for "<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>                + Bytes.toStringBinary(regionName));<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>            responses.getExceptions().put(regionName, new RuntimeException("Invalid response"));<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>          }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>          continue;<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>        }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>        boolean regionFailureRegistered = false;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>        for (Action&lt;Row&gt; sentAction : regionEntry.getValue()) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>          Object result = regionResults.get(sentAction.getOriginalIndex());<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>          // Failure: retry if it's make sense else update the errors lists<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>          if (result == null || result instanceof Throwable) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>            Row row = sentAction.getAction();<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>            throwable = ClientExceptionsUtil.findException(result);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>            // Register corresponding failures once per server/once per region.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>            if (!regionFailureRegistered) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>              regionFailureRegistered = true;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>              connection.updateCachedLocations(<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>                  tableName, regionName, row.getRow(), result, server);<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>            }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>            if (failureCount == 0) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>              errorsByServer.reportServerError(server);<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>              // We determine canRetry only once for all calls, after reporting server failure.<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>              canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            }<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            ++failureCount;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>            Retry retry = manageError(sentAction.getOriginalIndex(), row,<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>                canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, (Throwable) result, server);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>            if (retry == Retry.YES) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>              toReplay.add(sentAction);<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>            } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>              ++stopped;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>            } else {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>              ++failed;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>            }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>          } else {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>            if (callback != null) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>              try {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>                //noinspection unchecked<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>                // TODO: would callback expect a replica region name if it gets one?<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>                this.callback.update(regionName, sentAction.getAction().getRow(), (CResult) result);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>              } catch (Throwable t) {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>                LOG.error("User callback threw an exception for "<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>                    + Bytes.toStringBinary(regionName) + ", ignoring", t);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>              }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>            }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>            setResult(sentAction, result);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>          }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>        }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      }<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span><a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      // The failures global to a region. We will use for multiAction we sent previously to find the<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      //   actions to replay.<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      for (Map.Entry&lt;byte[], Throwable&gt; throwableEntry : responses.getExceptions().entrySet()) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>        throwable = throwableEntry.getValue();<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>        byte[] region = throwableEntry.getKey();<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        List&lt;Action&lt;Row&gt;&gt; actions = multiAction.actions.get(region);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>        if (actions == null || actions.isEmpty()) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          throw new IllegalStateException("Wrong response for the region: " +<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>              HRegionInfo.encodeRegionName(region));<a name="line.1362"></a>
+<span class="sourceLineNo">1288</span>      // Success or partial success<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>      // Analyze detailed results. We can still have individual failures to be redo.<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      // two specific throwables are managed:<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      //  - DoNotRetryIOException: we continue to retry for other actions<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      //  - RegionMovedException: we update the cache with the new region location<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span><a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      List&lt;Action&lt;Row&gt;&gt; toReplay = new ArrayList&lt;Action&lt;Row&gt;&gt;();<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      Throwable throwable = null;<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      int failureCount = 0;<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      boolean canRetry = true;<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span><a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      Map&lt;byte[], MultiResponse.RegionResult&gt; results = responses.getResults();<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      updateStats(server, results);<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span><a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      int failed = 0, stopped = 0;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>      // Go by original action.<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>      for (Map.Entry&lt;byte[], List&lt;Action&lt;Row&gt;&gt;&gt; regionEntry : multiAction.actions.entrySet()) {<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>        byte[] regionName = regionEntry.getKey();<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>        Map&lt;Integer, Object&gt; regionResults = results.get(regionName) == null<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>            ?  null : results.get(regionName).result;<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>        if (regionResults == null) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>          if (!responses.getExceptions().containsKey(regionName)) {<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>            LOG.error("Server sent us neither results nor exceptions for "<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>                + Bytes.toStringBinary(regionName));<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>            responses.getExceptions().put(regionName, new RuntimeException("Invalid response"));<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>          }<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>          continue;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>        }<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        boolean regionFailureRegistered = false;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        for (Action&lt;Row&gt; sentAction : regionEntry.getValue()) {<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>          Object result = regionResults.get(sentAction.getOriginalIndex());<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>          // Failure: retry if it's make sense else update the errors lists<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>          if (result == null || result instanceof Throwable) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>            Row row = sentAction.getAction();<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>            throwable = ClientExceptionsUtil.findException(result);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>            // Register corresponding failures once per server/once per region.<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>            if (!regionFailureRegistered) {<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>              regionFailureRegistered = true;<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>              try {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>                connection.updateCachedLocations(<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>                  tableName, regionName, row.getRow(), result, server);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>              } catch (Throwable ex) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>                // That should never happen, but if it did, we want to make sure<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>                // we still process errors<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>                LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>              }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>            }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>            if (failureCount == 0) {<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>              errorsByServer.reportServerError(server);<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>              // We determine canRetry only once for all calls, after reporting server failure.<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>              canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>            }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>            ++failureCount;<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>            Retry retry = manageError(sentAction.getOriginalIndex(), row,<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>                canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, (Throwable) result, server);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>            if (retry == Retry.YES) {<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>              toReplay.add(sentAction);<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>            } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>              ++stopped;<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>            } else {<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>              ++failed;<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>            }<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>          } else {<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>            if (callback != null) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>              try {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>                //noinspection unchecked<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>                // TODO: would callback expect a replica region name if it gets one?<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>                this.callback.update(regionName, sentAction.getAction().getRow(), (CResult) result);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>              } catch (Throwable t) {<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>                LOG.error("User callback threw an exception for "<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>                    + Bytes.toStringBinary(regionName) + ", ignoring", t);<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>            setResult(sentAction, result);<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>          }<a name="line.1362"></a>
 <span class="sourceLineNo">1363</span>        }<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        if (failureCount == 0) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>          errorsByServer.reportServerError(server);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>          canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>        }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        if (null == tableName &amp;&amp; ClientExceptionsUtil.isMetaClearingException(throwable)) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>          // For multi-actions, we don't have a table name, but we want to make sure to clear the<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>          // cache in case there were location-related exceptions. We don't to clear the cache<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>          // for every possible exception that comes through, however.<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>          connection.clearCaches(server);<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        } else {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>          connection.updateCachedLocations(<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>              tableName, region, actions.get(0).getAction().getRow(), throwable, server);<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>        }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        failureCount += actions.size();<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span><a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>        for (Action&lt;Row&gt; action : actions) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>          Row row = action.getAction();<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          Retry retry = manageError(action.getOriginalIndex(), row,<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>              canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, throwable, server);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>          if (retry == Retry.YES) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>            toReplay.add(action);<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>            ++stopped;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>          } else {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>            ++failed;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>          }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        }<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (toReplay.isEmpty()) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        logNoResubmit(server, numAttempt, failureCount, throwable, failed, stopped);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      } else {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>        resubmit(server, toReplay, numAttempt, failureCount, throwable);<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    private String createLog(int numAttempt, int failureCount, int replaySize, ServerName sn,<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        Throwable error, long backOffTime, boolean willRetry, String startTime,<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>        int failed, int stopped) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      StringBuilder sb = new StringBuilder();<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      sb.append("#").append(id).append(", table=").append(tableName).append(", ")<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>        .append("attempt=").append(numAttempt)<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>        .append("/").append(numTries).append(" ");<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span><a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      if (failureCount &gt; 0 || error != null){<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>        sb.append("failed=").append(failureCount).append("ops").append(", last exception: ").<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>            append(error == null ? "null" : error);<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>      } else {<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        sb.append("succeeded");<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      }<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span><a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      sb.append(" on ").append(sn).append(", tracking started ").append(startTime);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span><a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      if (willRetry) {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        sb.append(", retrying after=").append(backOffTime).append("ms").<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>            append(", replay=").append(replaySize).append("ops");<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      } else if (failureCount &gt; 0) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        if (stopped &gt; 0) {<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          sb.append("; not retrying ").append(stopped).append(" due to success from other replica");<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>        }<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        if (failed &gt; 0) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          sb.append("; not retrying ").append(failed).append(" - final failure");<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>        }<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span><a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span><a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      return sb.toString();<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
+<span class="sourceLineNo">1364</span>      }<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span><a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      // The failures global to a region. We will use for multiAction we sent previously to find the<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>      //   actions to replay.<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      for (Map.Entry&lt;byte[], Throwable&gt; throwableEntry : responses.getExceptions().entrySet()) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        throwable = throwableEntry.getValue();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>        byte[] region = throwableEntry.getKey();<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>        List&lt;Action&lt;Row&gt;&gt; actions = multiAction.actions.get(region);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>        if (actions == null || actions.isEmpty()) {<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>          throw new IllegalStateException("Wrong response for the region: " +<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>              HRegionInfo.encodeRegionName(region));<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        }<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span><a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        if (failureCount == 0) {<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>          errorsByServer.reportServerError(server);<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>          canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>        }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>        if (null == tableName &amp;&amp; ClientExceptionsUtil.isMetaClearingException(throwable)) {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>          // For multi-actions, we don't have a table name, but we want to make sure to clear the<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>          // cache in case there were location-related exceptions. We don't to clear the cache<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>          // for every possible exception that comes through, however.<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>          connection.clearCaches(server);<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>        } else {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>          try {<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>            connection.updateCachedLocations(<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>              tableName, region, actions.get(0).getAction().getRow(), throwable, server);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          } catch (Throwable ex) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>            // That should never happen, but if it did, we want to make sure<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            // we still process errors<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>            LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          }<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        failureCount += actions.size();<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span><a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>        for (Action&lt;Row&gt; action : actions) {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>          Row row = action.getAction();<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>          Retry retry = manageError(action.getOriginalIndex(), row,<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>              canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, throwable, server);<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>          if (retry == Retry.YES) {<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>            toReplay.add(action);<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>            ++stopped;<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>          } else {<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>            ++failed;<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>          }<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        }<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      }<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>      if (toReplay.isEmpty()) {<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>        logNoResubmit(server, numAttempt, failureCount, throwable, failed, stopped);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>      } else {<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>        resubmit(server, toReplay, numAttempt, failureCount, throwable);<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>      }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span><a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    private String createLog(int numAttempt, int failureCount, int replaySize, ServerName sn,<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>        Throwable error, long backOffTime, boolean willRetry, String startTime,<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>        int failed, int stopped) {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      StringBuilder sb = new StringBuilder();<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>      sb.append("#").append(id).append(", table=").append(tableName).append(", ")<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>        .append("attempt=").append(numAttempt)<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>        .append("/").append(numTries).append(" ");<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span><a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      if (failureCount &gt; 0 || error != null){<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>        sb.append("failed=").append(failureCount).append("ops").append(", last exception: ").<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>            append(error == null ? "null" : error);<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      } else {<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>        sb.append("succeeded");<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>      }<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>     * Sets the non-error result from a particular action.<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>     * @param action Action (request) that the server responded to.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>     * @param result The result.<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>     */<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    private void setResult(Action&lt;Row&gt; action, Object result) {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      if (result == null) {<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        throw new RuntimeException("Result cannot be null");<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      }<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      ReplicaResultState state = null;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      boolean isStale = !RegionReplicaUtil.isDefaultReplica(action.getReplicaId());<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      int index = action.getOriginalIndex();<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      if (results == null) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        decActionCounter(index);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        return; // Simple case, no replica requests.<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      }<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      state = trySetResultSimple(index, action.getAction(), false, result, null, isStale);<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      if (state == null) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        return; // Simple case, no replica requests.<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      // At this point we know that state is set to replica tracking class.<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>      // It could be that someone else is also looking at it; however, we know there can<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      // only be one state object, and only one thread can set callCount to 0. Other threads<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>      // will either see state with callCount 0 after locking it; or will not see state at all<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      // we will replace it with the result.<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      synchronized (state) {<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>        if (state.callCount == 0) {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>          return; // someone already set the result<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>        }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        state.callCount = 0;<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>      }<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>      synchronized (replicaResultLock) {<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>        if (results[index] != state) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>          throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>        }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        results[index] = result;<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>      }<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span><a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      decActionCounter(index);<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    }<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span><a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>    /**<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>     * Sets the error from a particular action.<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>     * @param index Original action index.<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>     * @param row Original request.<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>     * @param throwable The resulting error.<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>     * @param server The source server.<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>     */<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>    private void setError(int index, Row row, Throwable throwable, ServerName server) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      ReplicaResultState state = null;<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>      if (results == null) {<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>        // Note that we currently cannot have replica requests with null results. So it shouldn't<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>        // happen that multiple replica calls will call dAC for same actions with results == null.<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        // Only one call per action should be present in this case.<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        errors.add(throwable, row, server);<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>        decActionCounter(index);<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>        return; // Simple case, no replica requests.<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>      }<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>      state = trySetResultSimple(index, row, true, throwable, server, false);<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>      if (state == null) {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>        return; // Simple case, no replica requests.<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>      }<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>      BatchErrors target = null; // Error will be added to final errors, or temp replica errors.<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      boolean isActionDone = false;<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>      synchronized (state) {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>        switch (state.callCount) {<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>          case 0: return; // someone already set the result<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>          case 1: { // All calls failed, we are the last error.<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>            target = errors;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>            isActionDone = true;<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>            break;<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>          }<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>          default: {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>            assert state.callCount &gt; 1;<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>            if (state.replicaErrors == null) {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>              state.replicaErrors = new BatchErrors();<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>            }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>            target = state.replicaErrors;<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>            break;<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>        --state.callCount;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      target.add(throwable, row, server);<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>      if (isActionDone) {<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        if (state.replicaErrors != null) { // last call, no need to lock<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>          errors.merge(state.replicaErrors);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>        }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>        // See setResult for explanations.<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>        synchronized (replicaResultLock) {<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>          if (results[index] != state) {<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>            throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>          }<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>          results[index] = throwable;<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>        }<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>        decActionCounter(index);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      }<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    }<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span><a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    /**<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>     * Checks if the action is complete; used on error to prevent needless retries.<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>     * Does not synchronize, assuming element index/field accesses are atomic.<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>     * This is an opportunistic optimization check, doesn't have to be strict.<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>     * @param index Original action index.<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>     * @param row Original request.<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>     */<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    private boolean isActionComplete(int index, Row row) {<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      if (!isReplicaGet(row)) return false;<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      Object resObj = results[index];<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      return (resObj != null) &amp;&amp; (!(resObj instanceof ReplicaResultState)<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>          || ((ReplicaResultState)resObj).callCount == 0);<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>     * Tries to set the result or error for a particular action as if there were no replica calls.<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>     * @return null if successful; replica state if there were in fact replica calls.<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>     */<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    private ReplicaResultState trySetResultSimple(int index, Row row, boolean isError,<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>        Object result, ServerName server, boolean isFromReplica) {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      Object resObj = null;<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      if (!isReplicaGet(row)) {<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>        if (isFromReplica) {<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>          throw new AssertionError("Unexpected stale result for " + row);<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        }<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        results[index] = result;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>      } else {<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>        synchronized (replicaResultLock) {<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          resObj = results[index];<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>          if (resObj == null) {<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>            if (isFromReplica) {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>              throw new AssertionError("Unexpected stale result for " + row);<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>            }<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>            results[index] = result;<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>          }<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>        }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>      }<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span><a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>      ReplicaResultState rrs =<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>          (resObj instanceof ReplicaResultState) ? (ReplicaResultState)resObj : null;<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      if (rrs == null &amp;&amp; isError) {<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>        // The resObj is not replica state (null or already set).<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>        errors.add((Throwable)result, row, server);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>      }<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span><a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>      if (resObj == null) {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>        // resObj is null - no replica calls were made.<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>        decActionCounter(index);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>        return null;<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      }<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      return rrs;<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    }<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span><a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    private void decActionCounter(int index) {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>      long actionsRemaining = actionsInProgress.decrementAndGet();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      if (actionsRemaining &lt; 0) {<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>        String error = buildDetailedErrorMsg("Incorrect actions in progress", index);<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>        throw new AssertionError(error);<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      } else if (actionsRemaining == 0) {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>        synchronized (actionsInProgress) {<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>          actionsInProgress.notifyAll();<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>        }<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>      }<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span><a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>    private String buildDetailedErrorMsg(String string, int index) {<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>      StringBuilder error = new StringBuilder(128);<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>      error.append(string).append("; called for ").append(index).append(", actionsInProgress ")<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>          .append(actionsInProgress.get()).append("; replica gets: ");<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>      if (replicaGetIndices != null) {<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>        for (int i = 0; i &lt; replicaGetIndices.length; ++i) {<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>          error.append(replicaGetIndices[i]).append(", ");<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>        }<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>      } else {<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>        error.append(hasAnyReplicaGets ? "all" : "none");<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>      }<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      error.append("; results ");<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      if (results != null) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>        for (int i = 0; i &lt; results.length; ++i) {<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>          Object o = results[i];<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          error.append(((o == null) ? "null" : o.toString())).append(", ");<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>        }<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>      }<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      return error.toString();<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    }<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span><a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    @Override<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    public void waitUntilDone() throws InterruptedIOException {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      try {<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>        waitUntilDone(Long.MAX_VALUE);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>      } catch (InterruptedException iex) {<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        throw new InterruptedIOException(iex.getMessage());<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>      } finally {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>        if (callsInProgress != null) {<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>          for (PayloadCarryingServerCallable clb : callsInProgress) {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>            clb.cancel();<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>          }<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>      }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>    }<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span><a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    private boolean waitUntilDone(long cutoff) throws InterruptedException {<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>      boolean hasWait = cutoff != Long.MAX_VALUE;<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>      long lastLog = EnvironmentEdgeManager.currentTime();<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>      long currentInProgress;<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>      while (0 != (currentInProgress = actionsInProgress.get())) {<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>        long now = EnvironmentEdgeManager.currentTime();<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>        if (hasWait &amp;&amp; (now * 1000L) &gt; cutoff) {<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>          return false;<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>        }<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>        if (!hasWait) { // Only log if wait is infinite.<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>          if (now &gt; lastLog + 10000) {<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>            lastLog = now;<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>            LOG.info("#" + id + ", waiting for " + currentInProgress + "  actions to finish");<a name="line.1645"></a>
+<span class="sourceLineNo">1433</span>      sb.append(" on ").append(sn).append(", tracking started ").append(startTime);<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span><a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      if (willRetry) {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>        sb.append(", retrying after=").append(backOffTime).append("ms").<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>            append(", replay=").append(replaySize).append("ops");<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>      } else if (failureCount &gt; 0) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>        if (stopped &gt; 0) {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>          sb.append("; not retrying ").append(stopped).append(" due to success from other replica");<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        if (failed &gt; 0) {<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>          sb.append("; not retrying ").append(failed).append(" - final failure");<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>        }<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><a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      return sb.toString();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>    }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span><a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>    /**<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>     * Sets the non-error result from a particular action.<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>     * @param action Action (request) that the server responded to.<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>     * @param result The result.<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>     */<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    private void setResult(Action&lt;Row&gt; action, Object result) {<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      if (result == null) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>        throw new RuntimeException("Result cannot be null");<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>      ReplicaResultState state = null;<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>      boolean isStale = !RegionReplicaUtil.isDefaultReplica(action.getReplicaId());<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      int index = action.getOriginalIndex();<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>      if (results == null) {<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>        decActionCounter(index);<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>        return; // Simple case, no replica requests.<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>      }<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>      state = trySetResultSimple(index, action.getAction(), false, result, null, isStale);<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      if (state == null) {<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>        return; // Simple case, no replica requests.<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>      }<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>      // At this point we know that state is set to replica tracking class.<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>      // It could be that someone else is also looking at it; however, we know there can<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      // only be one state object, and only one thread can set callCount to 0. Other threads<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      // will either see state with callCount 0 after locking it; or will not see state at all<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>      // we will replace it with the result.<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>      synchronized (state) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>        if (state.callCount == 0) {<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>          return; // someone already set the result<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>        state.callCount = 0;<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      }<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      synchronized (replicaResultLock) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>        if (results[index] != state) {<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>          throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>        }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>        results[index] = result;<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>      decActionCounter(index);<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    }<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span><a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    /**<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>     * Sets the error from a particular action.<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>     * @param index Original action index.<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>     * @param row Original request.<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>     * @param throwable The resulting error.<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>     * @param server The source server.<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>     */<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    private void setError(int index, Row row, Throwable throwable, ServerName server) {<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      ReplicaResultState state = null;<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>      if (results == null) {<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>        // Note that we currently cannot have replica requests with null results. So it shouldn't<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>        // happen that multiple replica calls will call dAC for same actions with results == null.<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>        // Only one call per action should be present in this case.<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>        errors.add(throwable, row, server);<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>        decActionCounter(index);<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>        return; // Simple case, no replica requests.<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>      }<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>      state = trySetResultSimple(index, row, true, throwable, server, false);<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      if (state == null) {<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>        return; // Simple case, no replica requests.<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>      }<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      BatchErrors target = null; // Error will be added to final errors, or temp replica errors.<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>      boolean isActionDone = false;<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>      synchronized (state) {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>        switch (state.callCount) {<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>          case 0: return; // someone already set the result<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>          case 1: { // All calls failed, we are the last error.<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>            target = errors;<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>            isActionDone = true;<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>            break;<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>          }<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          default: {<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>            assert state.callCount &gt; 1;<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>            if (state.replicaErrors == null) {<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>              state.replicaErrors = new BatchErrors();<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>            }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>            target = state.replicaErrors;<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>            break;<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>          }<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>        }<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>        --state.callCount;<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>      }<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span>      target.add(throwable, row, server);<a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>      if (isActionDone) {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>        if (state.replicaErrors != null) { // last call, no need to lock<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>          errors.merge(state.replicaErrors);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>        }<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>        // See setResult for explanations.<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>        synchronized (replicaResultLock) {<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>          if (results[index] != state) {<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>            throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>          }<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>          results[index] = throwable;<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>        }<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>        decActionCounter(index);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>      }<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>    }<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span><a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>    /**<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>     * Checks if the action is complete; used on error to prevent needless retries.<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>     * Does not synchronize, assuming element index/field accesses are atomic.<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>     * This is an opportunistic optimization check, doesn't have to be strict.<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>     * @param index Original action index.<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>     * @param row Original request.<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>     */<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    private boolean isActionComplete(int index, Row row) {<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>      if (!isReplicaGet(row)) return false;<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>      Object resObj = results[index];<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>      return (resObj != null) &amp;&amp; (!(resObj instanceof ReplicaResultState)<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>          || ((ReplicaResultState)resObj).callCount == 0);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    }<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span><a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>    /**<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>     * Tries to set the result or error for a particular action as if there were no replica calls.<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>     * @return null if successful; replica state if there were in fact replica calls.<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>     */<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>    private ReplicaResultState trySetResultSimple(int index, Row row, boolean isError,<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>        Object result, ServerName server, boolean isFromReplica) {<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>      Object resObj = null;<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      if (!isReplicaGet(row)) {<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>        if (isFromReplica) {<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>          throw new AssertionError("Unexpected stale result for " + row);<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>        }<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>        results[index] = result;<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>      } else {<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>        synchronized (replicaResultLock) {<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>          resObj = results[index];<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>          if (resObj == null) {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>            if (isFromReplica) {<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>              throw new AssertionError("Unexpected stale result for " + row);<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>            }<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>            results[index] = result;<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>          }<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>        }<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>      }<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span><a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>      ReplicaResultState rrs =<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>          (resObj instanceof ReplicaResultState) ? (ReplicaRes

<TRUNCATED>

[50/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/apidocs/src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html b/apidocs/src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html
index 37f1302..a5616d0 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html
@@ -31,163 +31,214 @@
 <span class="sourceLineNo">023</span>import java.util.TreeSet;<a name="line.23"></a>
 <span class="sourceLineNo">024</span><a name="line.24"></a>
 <span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.Cell;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.classification.InterfaceStability;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.exceptions.DeserializationException;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.protobuf.generated.FilterProtos;<a name="line.29"></a>
-<span class="sourceLineNo">030</span><a name="line.30"></a>
-<span class="sourceLineNo">031</span>import com.google.common.base.Preconditions;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import com.google.protobuf.InvalidProtocolBufferException;<a name="line.32"></a>
-<span class="sourceLineNo">033</span><a name="line.33"></a>
-<span class="sourceLineNo">034</span>/**<a name="line.34"></a>
-<span class="sourceLineNo">035</span> * Filter that returns only cells whose timestamp (version) is<a name="line.35"></a>
-<span class="sourceLineNo">036</span> * in the specified list of timestamps (versions).<a name="line.36"></a>
-<span class="sourceLineNo">037</span> * &lt;p&gt;<a name="line.37"></a>
-<span class="sourceLineNo">038</span> * Note: Use of this filter overrides any time range/time stamp<a name="line.38"></a>
-<span class="sourceLineNo">039</span> * options specified using {@link org.apache.hadoop.hbase.client.Get#setTimeRange(long, long)},<a name="line.39"></a>
-<span class="sourceLineNo">040</span> * {@link org.apache.hadoop.hbase.client.Scan#setTimeRange(long, long)}, {@link org.apache.hadoop.hbase.client.Get#setTimeStamp(long)},<a name="line.40"></a>
-<span class="sourceLineNo">041</span> * or {@link org.apache.hadoop.hbase.client.Scan#setTimeStamp(long)}.<a name="line.41"></a>
-<span class="sourceLineNo">042</span> */<a name="line.42"></a>
-<span class="sourceLineNo">043</span>@InterfaceAudience.Public<a name="line.43"></a>
-<span class="sourceLineNo">044</span>@InterfaceStability.Stable<a name="line.44"></a>
-<span class="sourceLineNo">045</span>public class TimestampsFilter extends FilterBase {<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>  TreeSet&lt;Long&gt; timestamps;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>  private static final int MAX_LOG_TIMESTAMPS = 5;<a name="line.48"></a>
-<span class="sourceLineNo">049</span><a name="line.49"></a>
-<span class="sourceLineNo">050</span>  // Used during scans to hint the scan to stop early<a name="line.50"></a>
-<span class="sourceLineNo">051</span>  // once the timestamps fall below the minTimeStamp.<a name="line.51"></a>
-<span class="sourceLineNo">052</span>  long minTimeStamp = Long.MAX_VALUE;<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  /**<a name="line.54"></a>
-<span class="sourceLineNo">055</span>   * Constructor for filter that retains only those<a name="line.55"></a>
-<span class="sourceLineNo">056</span>   * cells whose timestamp (version) is in the specified<a name="line.56"></a>
-<span class="sourceLineNo">057</span>   * list of timestamps.<a name="line.57"></a>
-<span class="sourceLineNo">058</span>   *<a name="line.58"></a>
-<span class="sourceLineNo">059</span>   * @param timestamps<a name="line.59"></a>
-<span class="sourceLineNo">060</span>   */<a name="line.60"></a>
-<span class="sourceLineNo">061</span>  public TimestampsFilter(List&lt;Long&gt; timestamps) {<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    for (Long timestamp : timestamps) {<a name="line.62"></a>
-<span class="sourceLineNo">063</span>      Preconditions.checkArgument(timestamp &gt;= 0, "must be positive %s", timestamp);<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    }<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    this.timestamps = new TreeSet&lt;Long&gt;(timestamps);<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    init();<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>  /**<a name="line.69"></a>
-<span class="sourceLineNo">070</span>   * @return the list of timestamps<a name="line.70"></a>
-<span class="sourceLineNo">071</span>   */<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  public List&lt;Long&gt; getTimestamps() {<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    List&lt;Long&gt; list = new ArrayList&lt;Long&gt;(timestamps.size());<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    list.addAll(timestamps);<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    return list;<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>  private void init() {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    if (this.timestamps.size() &gt; 0) {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      minTimeStamp = this.timestamps.first();<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    }<a name="line.81"></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.classification.InterfaceAudience;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.classification.InterfaceStability;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.exceptions.DeserializationException;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.protobuf.generated.FilterProtos;<a name="line.30"></a>
+<span class="sourceLineNo">031</span><a name="line.31"></a>
+<span class="sourceLineNo">032</span>import com.google.common.base.Preconditions;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import com.google.protobuf.InvalidProtocolBufferException;<a name="line.33"></a>
+<span class="sourceLineNo">034</span><a name="line.34"></a>
+<span class="sourceLineNo">035</span>/**<a name="line.35"></a>
+<span class="sourceLineNo">036</span> * Filter that returns only cells whose timestamp (version) is<a name="line.36"></a>
+<span class="sourceLineNo">037</span> * in the specified list of timestamps (versions).<a name="line.37"></a>
+<span class="sourceLineNo">038</span> * &lt;p&gt;<a name="line.38"></a>
+<span class="sourceLineNo">039</span> * Note: Use of this filter overrides any time range/time stamp<a name="line.39"></a>
+<span class="sourceLineNo">040</span> * options specified using {@link org.apache.hadoop.hbase.client.Get#setTimeRange(long, long)},<a name="line.40"></a>
+<span class="sourceLineNo">041</span> * {@link org.apache.hadoop.hbase.client.Scan#setTimeRange(long, long)}, {@link org.apache.hadoop.hbase.client.Get#setTimeStamp(long)},<a name="line.41"></a>
+<span class="sourceLineNo">042</span> * or {@link org.apache.hadoop.hbase.client.Scan#setTimeStamp(long)}.<a name="line.42"></a>
+<span class="sourceLineNo">043</span> */<a name="line.43"></a>
+<span class="sourceLineNo">044</span>@InterfaceAudience.Public<a name="line.44"></a>
+<span class="sourceLineNo">045</span>@InterfaceStability.Stable<a name="line.45"></a>
+<span class="sourceLineNo">046</span>public class TimestampsFilter extends FilterBase {<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span>  private final boolean canHint;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>  TreeSet&lt;Long&gt; timestamps;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>  private static final int MAX_LOG_TIMESTAMPS = 5;<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span>  // Used during scans to hint the scan to stop early<a name="line.52"></a>
+<span class="sourceLineNo">053</span>  // once the timestamps fall below the minTimeStamp.<a name="line.53"></a>
+<span class="sourceLineNo">054</span>  long minTimeStamp = Long.MAX_VALUE;<a name="line.54"></a>
+<span class="sourceLineNo">055</span><a name="line.55"></a>
+<span class="sourceLineNo">056</span>  /**<a name="line.56"></a>
+<span class="sourceLineNo">057</span>   * Constructor for filter that retains only the specified timestamps in the list.<a name="line.57"></a>
+<span class="sourceLineNo">058</span>   * @param timestamps<a name="line.58"></a>
+<span class="sourceLineNo">059</span>   */<a name="line.59"></a>
+<span class="sourceLineNo">060</span>  public TimestampsFilter(List&lt;Long&gt; timestamps) {<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    this(timestamps, false);<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>  /**<a name="line.64"></a>
+<span class="sourceLineNo">065</span>   * Constructor for filter that retains only those<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * cells whose timestamp (version) is in the specified<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   * list of timestamps.<a name="line.67"></a>
+<span class="sourceLineNo">068</span>   *<a name="line.68"></a>
+<span class="sourceLineNo">069</span>   * @param timestamps list of timestamps that are wanted.<a name="line.69"></a>
+<span class="sourceLineNo">070</span>   * @param canHint should the filter provide a seek hint? This can skip<a name="line.70"></a>
+<span class="sourceLineNo">071</span>   *                past delete tombstones, so it should only be used when that<a name="line.71"></a>
+<span class="sourceLineNo">072</span>   *                is not an issue ( no deletes, or don't care if data<a name="line.72"></a>
+<span class="sourceLineNo">073</span>   *                becomes visible)<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  public TimestampsFilter(List&lt;Long&gt; timestamps, boolean canHint) {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    for (Long timestamp : timestamps) {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      Preconditions.checkArgument(timestamp &gt;= 0, "must be positive %s", timestamp);<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    }<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    this.canHint = canHint;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    this.timestamps = new TreeSet&lt;Long&gt;(timestamps);<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    init();<a name="line.81"></a>
 <span class="sourceLineNo">082</span>  }<a name="line.82"></a>
 <span class="sourceLineNo">083</span><a name="line.83"></a>
 <span class="sourceLineNo">084</span>  /**<a name="line.84"></a>
-<span class="sourceLineNo">085</span>   * Gets the minimum timestamp requested by filter.<a name="line.85"></a>
-<span class="sourceLineNo">086</span>   * @return  minimum timestamp requested by filter.<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   */<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  public long getMin() {<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    return minTimeStamp;<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">092</span>  @Override<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  public boolean filterRowKey(Cell cell) throws IOException {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    // Impl in FilterBase might do unnecessary copy for Off heap backed Cells.<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    return false;<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>  @Override<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  public ReturnCode filterKeyValue(Cell v) {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    if (this.timestamps.contains(v.getTimestamp())) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>      return ReturnCode.INCLUDE;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    } else if (v.getTimestamp() &lt; minTimeStamp) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      // The remaining versions of this column are guaranteed<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      // to be lesser than all of the other values.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>      return ReturnCode.NEXT_COL;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    }<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    return ReturnCode.SKIP;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  public static Filter createFilterFromArguments(ArrayList&lt;byte []&gt; filterArguments) {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    ArrayList&lt;Long&gt; timestamps = new ArrayList&lt;Long&gt;();<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    for (int i = 0; i&lt;filterArguments.size(); i++) {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      long timestamp = ParseFilter.convertByteArrayToLong(filterArguments.get(i));<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      timestamps.add(timestamp);<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    }<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    return new TimestampsFilter(timestamps);<a name="line.116"></a>
-<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>  /**<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * @return The filter serialized using pb<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   */<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public byte [] toByteArray() {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    FilterProtos.TimestampsFilter.Builder builder =<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      FilterProtos.TimestampsFilter.newBuilder();<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    builder.addAllTimestamps(this.timestamps);<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    return builder.build().toByteArray();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  }<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>   * @param pbBytes A pb serialized {@link TimestampsFilter} instance<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * @return An instance of {@link TimestampsFilter} made from &lt;code&gt;bytes&lt;/code&gt;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @throws DeserializationException<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * @see #toByteArray<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  public static TimestampsFilter parseFrom(final byte [] pbBytes)<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  throws DeserializationException {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    FilterProtos.TimestampsFilter proto;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    try {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      proto = FilterProtos.TimestampsFilter.parseFrom(pbBytes);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    } catch (InvalidProtocolBufferException e) {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      throw new DeserializationException(e);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    return new TimestampsFilter(proto.getTimestampsList());<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>   * @param other<a name="line.147"></a>
-<span class="sourceLineNo">148</span>   * @return true if and only if the fields of the filter that are serialized<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   * are equal to the corresponding fields in other.  Used for testing.<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   */<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  boolean areSerializedFieldsEqual(Filter o) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    if (o == this) return true;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    if (!(o instanceof TimestampsFilter)) return false;<a name="line.153"></a>
-<span class="sourceLineNo">154</span><a name="line.154"></a>
-<span class="sourceLineNo">155</span>    TimestampsFilter other = (TimestampsFilter)o;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    return this.getTimestamps().equals(other.getTimestamps());<a name="line.156"></a>
+<span class="sourceLineNo">085</span>   * @return the list of timestamps<a name="line.85"></a>
+<span class="sourceLineNo">086</span>   */<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  public List&lt;Long&gt; getTimestamps() {<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    List&lt;Long&gt; list = new ArrayList&lt;Long&gt;(timestamps.size());<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    list.addAll(timestamps);<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    return list;<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>  private void init() {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    if (this.timestamps.size() &gt; 0) {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      minTimeStamp = this.timestamps.first();<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>   * Gets the minimum timestamp requested by filter.<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   * @return  minimum timestamp requested by filter.<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   */<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  public long getMin() {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    return minTimeStamp;<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>  @Override<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public boolean filterRowKey(Cell cell) throws IOException {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    // Impl in FilterBase might do unnecessary copy for Off heap backed Cells.<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    return false;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  }<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>  @Override<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  public ReturnCode filterKeyValue(Cell v) {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    if (this.timestamps.contains(v.getTimestamp())) {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      return ReturnCode.INCLUDE;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    } else if (v.getTimestamp() &lt; minTimeStamp) {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      // The remaining versions of this column are guaranteed<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      // to be lesser than all of the other values.<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      return ReturnCode.NEXT_COL;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    }<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    return canHint ? ReturnCode.SEEK_NEXT_USING_HINT : ReturnCode.SKIP;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
+<span class="sourceLineNo">124</span><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>   * Pick the next cell that the scanner should seek to. Since this can skip any number of cells<a name="line.127"></a>
+<span class="sourceLineNo">128</span>   * any of which can be a delete this can resurect old data.<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   *<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   * The method will only be used if canHint was set to true while creating the filter.<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   *<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * @throws IOException This will never happen.<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   */<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  public Cell getNextCellHint(Cell currentCell) throws IOException {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    if (!canHint) {<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      return null;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    }<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>    Long nextTimestampObject = timestamps.lower(currentCell.getTimestamp());<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>    if (nextTimestampObject == null) {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      // This should only happen if the current column's<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      // timestamp is below the last one in the list.<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      //<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      // It should never happen as the filterKeyValue should return NEXT_COL<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      // but it's always better to be extra safe and protect against future<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      // behavioral changes.<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>      return CellUtil.createLastOnRowCol(currentCell);<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>    // Since we know the nextTimestampObject isn't null here there must still be<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    // timestamps that can be included. Cast the Long to a long and return the<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    // a cell with the current row/cf/col and the next found timestamp.<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    long nextTimestamp = nextTimestampObject;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    return CellUtil.createFirstOnRowColTS(currentCell, nextTimestamp);<a name="line.156"></a>
 <span class="sourceLineNo">157</span>  }<a name="line.157"></a>
 <span class="sourceLineNo">158</span><a name="line.158"></a>
-<span class="sourceLineNo">159</span>  @Override<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  public String toString() {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    return toString(MAX_LOG_TIMESTAMPS);<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>  protected String toString(int maxTimestamps) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    StringBuilder tsList = new StringBuilder();<a name="line.165"></a>
-<span class="sourceLineNo">166</span><a name="line.166"></a>
-<span class="sourceLineNo">167</span>    int count = 0;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    for (Long ts : this.timestamps) {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      if (count &gt;= maxTimestamps) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        break;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      }<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      ++count;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      tsList.append(ts.toString());<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      if (count &lt; this.timestamps.size() &amp;&amp; count &lt; maxTimestamps) {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>        tsList.append(", ");<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">159</span>  public static Filter createFilterFromArguments(ArrayList&lt;byte []&gt; filterArguments) {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    ArrayList&lt;Long&gt; timestamps = new ArrayList&lt;Long&gt;();<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    for (int i = 0; i&lt;filterArguments.size(); i++) {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      long timestamp = ParseFilter.convertByteArrayToLong(filterArguments.get(i));<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      timestamps.add(timestamp);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    return new TimestampsFilter(timestamps);<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>  /**<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * @return The filter serialized using pb<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  public byte[] toByteArray() {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    FilterProtos.TimestampsFilter.Builder builder =<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        FilterProtos.TimestampsFilter.newBuilder();<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    builder.addAllTimestamps(this.timestamps);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    builder.setCanHint(canHint);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    return builder.build().toByteArray();<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
 <span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    return String.format("%s (%d/%d): [%s]", this.getClass().getSimpleName(),<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        count, this.timestamps.size(), tsList.toString());<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">179</span>  /**<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param pbBytes A pb serialized {@link TimestampsFilter} instance<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   *<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @return An instance of {@link TimestampsFilter} made from &lt;code&gt;bytes&lt;/code&gt;<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @see #toByteArray<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   */<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  public static TimestampsFilter parseFrom(final byte[] pbBytes)<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      throws DeserializationException {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    FilterProtos.TimestampsFilter proto;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    try {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      proto = FilterProtos.TimestampsFilter.parseFrom(pbBytes);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    } catch (InvalidProtocolBufferException e) {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      throw new DeserializationException(e);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    }<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    return new TimestampsFilter(proto.getTimestampsList(),<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        proto.hasCanHint() &amp;&amp; proto.getCanHint());<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>  /**<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * @param other<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * @return true if and only if the fields of the filter that are serialized<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * are equal to the corresponding fields in other.  Used for testing.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   */<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  boolean areSerializedFieldsEqual(Filter o) {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    if (o == this) return true;<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    if (!(o instanceof TimestampsFilter)) return false;<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
+<span class="sourceLineNo">206</span>    TimestampsFilter other = (TimestampsFilter)o;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    return this.getTimestamps().equals(other.getTimestamps());<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  @Override<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public String toString() {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    return toString(MAX_LOG_TIMESTAMPS);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  }<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>  protected String toString(int maxTimestamps) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    StringBuilder tsList = new StringBuilder();<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>    int count = 0;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    for (Long ts : this.timestamps) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      if (count &gt;= maxTimestamps) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        break;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      ++count;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      tsList.append(ts.toString());<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      if (count &lt; this.timestamps.size() &amp;&amp; count &lt; maxTimestamps) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        tsList.append(", ");<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><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    return String.format("%s (%d/%d): [%s] canHint: [%b]", this.getClass().getSimpleName(),<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        count, this.timestamps.size(), tsList.toString(), canHint);<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>}<a name="line.233"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/apidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html b/apidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
index 14327de..0a8e897 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
@@ -1065,11 +1065,11 @@
 <span class="sourceLineNo">1057</span>    System.err.println("  -bandwidth              Limit bandwidth to this value in MB/second.");<a name="line.1057"></a>
 <span class="sourceLineNo">1058</span>    System.err.println();<a name="line.1058"></a>
 <span class="sourceLineNo">1059</span>    System.err.println("Examples:");<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    System.err.println("  hbase " + getClass().getName() + " \\");<a name="line.1060"></a>
+<span class="sourceLineNo">1060</span>    System.err.println("  hbase snapshot export \\");<a name="line.1060"></a>
 <span class="sourceLineNo">1061</span>    System.err.println("    -snapshot MySnapshot -copy-to hdfs://srv2:8082/hbase \\");<a name="line.1061"></a>
 <span class="sourceLineNo">1062</span>    System.err.println("    -chuser MyUser -chgroup MyGroup -chmod 700 -mappers 16");<a name="line.1062"></a>
 <span class="sourceLineNo">1063</span>    System.err.println();<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    System.err.println("  hbase " + getClass().getName() + " \\");<a name="line.1064"></a>
+<span class="sourceLineNo">1064</span>    System.err.println("  hbase snapshot export \\");<a name="line.1064"></a>
 <span class="sourceLineNo">1065</span>    System.err.println("    -snapshot MySnapshot -copy-from hdfs://srv2:8082/hbase \\");<a name="line.1065"></a>
 <span class="sourceLineNo">1066</span>    System.err.println("    -copy-to hdfs://srv1:50070/hbase \\");<a name="line.1066"></a>
 <span class="sourceLineNo">1067</span>    System.exit(1);<a name="line.1067"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/apidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html b/apidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html
index dc0de15..2662234 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html
@@ -475,7 +475,7 @@
 <span class="sourceLineNo">467</span>  }<a name="line.467"></a>
 <span class="sourceLineNo">468</span><a name="line.468"></a>
 <span class="sourceLineNo">469</span>  private void printUsageAndExit() {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    System.err.printf("Usage: bin/hbase %s [options]%n", getClass().getName());<a name="line.470"></a>
+<span class="sourceLineNo">470</span>    System.err.printf("Usage: bin/hbase snapshot info [options]%n");<a name="line.470"></a>
 <span class="sourceLineNo">471</span>    System.err.println(" where [options] are:");<a name="line.471"></a>
 <span class="sourceLineNo">472</span>    System.err.println("  -h|-help                Show this help and exit.");<a name="line.472"></a>
 <span class="sourceLineNo">473</span>    System.err.println("  -remote-dir             Root directory that contains the snapshots.");<a name="line.473"></a>
@@ -487,7 +487,7 @@
 <span class="sourceLineNo">479</span>    System.err.println("  -schema                 Describe the snapshotted table.");<a name="line.479"></a>
 <span class="sourceLineNo">480</span>    System.err.println();<a name="line.480"></a>
 <span class="sourceLineNo">481</span>    System.err.println("Examples:");<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    System.err.println("  hbase " + getClass() + " \\");<a name="line.482"></a>
+<span class="sourceLineNo">482</span>    System.err.println("  hbase snapshot info \\");<a name="line.482"></a>
 <span class="sourceLineNo">483</span>    System.err.println("    -snapshot MySnapshot -files");<a name="line.483"></a>
 <span class="sourceLineNo">484</span>    System.exit(1);<a name="line.484"></a>
 <span class="sourceLineNo">485</span>  }<a name="line.485"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index bcc451c..9893165 100644
--- a/book.html
+++ b/book.html
@@ -33282,7 +33282,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-03-23 14:32:09 UTC
+Last updated 2016-03-24 14:43:42 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index 08f910a..b7e5c24 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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <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-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 


[41/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFuture.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFuture.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFuture.html
index ed7bc7f..e65df71 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFuture.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFuture.html
@@ -1198,681 +1198,699 @@
 <span class="sourceLineNo">1190</span>        byte[] row = e.getValue().iterator().next().getAction().getRow();<a name="line.1190"></a>
 <span class="sourceLineNo">1191</span>        // Do not use the exception for updating cache because it might be coming from<a name="line.1191"></a>
 <span class="sourceLineNo">1192</span>        // any of the regions in the MultiAction.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        if (tableName != null) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>          connection.updateCachedLocations(tableName, regionName, row,<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>              ClientExceptionsUtil.isMetaClearingException(t) ? null : t, server);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>        for (Action&lt;Row&gt; action : e.getValue()) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          Retry retry = manageError(<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>              action.getOriginalIndex(), action.getAction(), canRetry, t, server);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (retry == Retry.YES) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            toReplay.add(action);<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            ++stopped;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>          } else {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            ++failed;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>          }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>        }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>      }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      if (toReplay.isEmpty()) {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>        logNoResubmit(server, numAttempt, rsActions.size(), t, failed, stopped);<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>      } else {<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        resubmit(server, toReplay, numAttempt, rsActions.size(), t);<a name="line.1213"></a>
+<span class="sourceLineNo">1193</span>        try {<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          if (tableName != null) {<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>            connection.updateCachedLocations(tableName, regionName, row,<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>              ClientExceptionsUtil.isMetaClearingException(t) ? null : t, server);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>          }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        } catch (Throwable ex) {<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>          // That should never happen, but if it did, we want to make sure<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          // we still process errors<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>          LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        for (Action&lt;Row&gt; action : e.getValue()) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          Retry retry = manageError(<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              action.getOriginalIndex(), action.getAction(), canRetry, t, server);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>          if (retry == Retry.YES) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>            toReplay.add(action);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>            ++stopped;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>            ++failed;<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
 <span class="sourceLineNo">1214</span>      }<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>     * Log as much info as possible, and, if there is something to replay,<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     * submit it again after a back off sleep.<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>     */<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    private void resubmit(ServerName oldServer, List&lt;Action&lt;Row&gt;&gt; toReplay,<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        int numAttempt, int failureCount, Throwable throwable) {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      // We have something to replay. We're going to sleep a little before.<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // We have two contradicting needs here:<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      //  1) We want to get the new location after having slept, as it may change.<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      //  2) We want to take into account the location when calculating the sleep time.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      //  3) If all this is just because the response needed to be chunked try again FAST.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      // It should be possible to have some heuristics to take the right decision. Short term,<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>      //  we go for one.<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      boolean retryImmediately = throwable instanceof RetryImmediatelyException;<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      int nextAttemptNumber = retryImmediately ? numAttempt : numAttempt + 1;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      long backOffTime = retryImmediately ? 0 :<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          errorsByServer.calculateBackoffTime(oldServer, pause);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>      if (numAttempt &gt; startLogErrorsCnt) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        // We use this value to have some logs when we have multiple failures, but not too many<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        //  logs, as errors are to be expected when a region moves, splits and so on<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        LOG.info(createLog(numAttempt, failureCount, toReplay.size(),<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>            oldServer, throwable, backOffTime, true, null, -1, -1));<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      try {<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>        if (backOffTime &gt; 0) {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>          Thread.sleep(backOffTime);<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>        }<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      } catch (InterruptedException e) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>        LOG.warn("#" + id + ", not sent: " + toReplay.size() + " operations, " + oldServer, e);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>        Thread.currentThread().interrupt();<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        return;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>      groupAndSendMultiAction(toReplay, nextAttemptNumber);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    private void logNoResubmit(ServerName oldServer, int numAttempt,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        int failureCount, Throwable throwable, int failed, int stopped) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      if (failureCount != 0 || numAttempt &gt; startLogErrorsCnt + 1) {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>        String timeStr = new Date(errorsByServer.getStartTrackingTime()).toString();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>        String logMessage = createLog(numAttempt, failureCount, 0, oldServer,<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>            throwable, -1, false, timeStr, failed, stopped);<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>        if (failed != 0) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>          // Only log final failures as warning<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>          LOG.warn(logMessage);<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        } else {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>          LOG.info(logMessage);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>        }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    }<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    /**<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>     * Called when we receive the result of a server query.<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>     *<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>     * @param multiAction    - the multiAction we sent<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>     * @param server       - the location. It's used as a server name.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>     * @param responses      - the response, if any<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>     * @param numAttempt     - the attempt<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>     */<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    private void receiveMultiAction(MultiAction&lt;Row&gt; multiAction,<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>        ServerName server, MultiResponse responses, int numAttempt) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>       assert responses != null;<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span><a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      // Success or partial success<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      // Analyze detailed results. We can still have individual failures to be redo.<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      // two specific throwables are managed:<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      //  - DoNotRetryIOException: we continue to retry for other actions<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      //  - RegionMovedException: we update the cache with the new region location<a name="line.1286"></a>
+<span class="sourceLineNo">1215</span><a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      if (toReplay.isEmpty()) {<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>        logNoResubmit(server, numAttempt, rsActions.size(), t, failed, stopped);<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>        resubmit(server, toReplay, numAttempt, rsActions.size(), t);<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    }<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>     * Log as much info as possible, and, if there is something to replay,<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>     * submit it again after a back off sleep.<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    private void resubmit(ServerName oldServer, List&lt;Action&lt;Row&gt;&gt; toReplay,<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        int numAttempt, int failureCount, Throwable throwable) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>      // We have something to replay. We're going to sleep a little before.<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      // We have two contradicting needs here:<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>      //  1) We want to get the new location after having slept, as it may change.<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>      //  2) We want to take into account the location when calculating the sleep time.<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      //  3) If all this is just because the response needed to be chunked try again FAST.<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      // It should be possible to have some heuristics to take the right decision. Short term,<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      //  we go for one.<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      boolean retryImmediately = throwable instanceof RetryImmediatelyException;<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>      int nextAttemptNumber = retryImmediately ? numAttempt : numAttempt + 1;<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      long backOffTime = retryImmediately ? 0 :<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          errorsByServer.calculateBackoffTime(oldServer, pause);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      if (numAttempt &gt; startLogErrorsCnt) {<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>        // We use this value to have some logs when we have multiple failures, but not too many<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>        //  logs, as errors are to be expected when a region moves, splits and so on<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>        LOG.info(createLog(numAttempt, failureCount, toReplay.size(),<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>            oldServer, throwable, backOffTime, true, null, -1, -1));<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      }<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span><a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      try {<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>        if (backOffTime &gt; 0) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>          Thread.sleep(backOffTime);<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>        }<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      } catch (InterruptedException e) {<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>        LOG.warn("#" + id + ", not sent: " + toReplay.size() + " operations, " + oldServer, e);<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>        Thread.currentThread().interrupt();<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>        return;<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span><a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      groupAndSendMultiAction(toReplay, nextAttemptNumber);<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    private void logNoResubmit(ServerName oldServer, int numAttempt,<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        int failureCount, Throwable throwable, int failed, int stopped) {<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>      if (failureCount != 0 || numAttempt &gt; startLogErrorsCnt + 1) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>        String timeStr = new Date(errorsByServer.getStartTrackingTime()).toString();<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>        String logMessage = createLog(numAttempt, failureCount, 0, oldServer,<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>            throwable, -1, false, timeStr, failed, stopped);<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>        if (failed != 0) {<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          // Only log final failures as warning<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          LOG.warn(logMessage);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>        } else {<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>          LOG.info(logMessage);<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>        }<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    }<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span><a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>    /**<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>     * Called when we receive the result of a server query.<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>     *<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>     * @param multiAction    - the multiAction we sent<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>     * @param server       - the location. It's used as a server name.<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>     * @param responses      - the response, if any<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>     * @param numAttempt     - the attempt<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>     */<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    private void receiveMultiAction(MultiAction&lt;Row&gt; multiAction,<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        ServerName server, MultiResponse responses, int numAttempt) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>       assert responses != null;<a name="line.1286"></a>
 <span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      List&lt;Action&lt;Row&gt;&gt; toReplay = new ArrayList&lt;Action&lt;Row&gt;&gt;();<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      Throwable throwable = null;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      int failureCount = 0;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      boolean canRetry = true;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span><a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      Map&lt;byte[], MultiResponse.RegionResult&gt; results = responses.getResults();<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      updateStats(server, results);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      int failed = 0, stopped = 0;<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      // Go by original action.<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      for (Map.Entry&lt;byte[], List&lt;Action&lt;Row&gt;&gt;&gt; regionEntry : multiAction.actions.entrySet()) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        byte[] regionName = regionEntry.getKey();<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>        Map&lt;Integer, Object&gt; regionResults = results.get(regionName) == null<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>            ?  null : results.get(regionName).result;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        if (regionResults == null) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>          if (!responses.getExceptions().containsKey(regionName)) {<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>            LOG.error("Server sent us neither results nor exceptions for "<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>                + Bytes.toStringBinary(regionName));<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>            responses.getExceptions().put(regionName, new RuntimeException("Invalid response"));<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>          }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>          continue;<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>        }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>        boolean regionFailureRegistered = false;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>        for (Action&lt;Row&gt; sentAction : regionEntry.getValue()) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>          Object result = regionResults.get(sentAction.getOriginalIndex());<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>          // Failure: retry if it's make sense else update the errors lists<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>          if (result == null || result instanceof Throwable) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>            Row row = sentAction.getAction();<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>            throwable = ClientExceptionsUtil.findException(result);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>            // Register corresponding failures once per server/once per region.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>            if (!regionFailureRegistered) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>              regionFailureRegistered = true;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>              connection.updateCachedLocations(<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>                  tableName, regionName, row.getRow(), result, server);<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>            }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>            if (failureCount == 0) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>              errorsByServer.reportServerError(server);<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>              // We determine canRetry only once for all calls, after reporting server failure.<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>              canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            }<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            ++failureCount;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>            Retry retry = manageError(sentAction.getOriginalIndex(), row,<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>                canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, (Throwable) result, server);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>            if (retry == Retry.YES) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>              toReplay.add(sentAction);<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>            } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>              ++stopped;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>            } else {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>              ++failed;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>            }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>          } else {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>            if (callback != null) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>              try {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>                //noinspection unchecked<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>                // TODO: would callback expect a replica region name if it gets one?<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>                this.callback.update(regionName, sentAction.getAction().getRow(), (CResult) result);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>              } catch (Throwable t) {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>                LOG.error("User callback threw an exception for "<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>                    + Bytes.toStringBinary(regionName) + ", ignoring", t);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>              }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>            }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>            setResult(sentAction, result);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>          }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>        }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      }<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span><a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      // The failures global to a region. We will use for multiAction we sent previously to find the<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      //   actions to replay.<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      for (Map.Entry&lt;byte[], Throwable&gt; throwableEntry : responses.getExceptions().entrySet()) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>        throwable = throwableEntry.getValue();<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>        byte[] region = throwableEntry.getKey();<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        List&lt;Action&lt;Row&gt;&gt; actions = multiAction.actions.get(region);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>        if (actions == null || actions.isEmpty()) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          throw new IllegalStateException("Wrong response for the region: " +<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>              HRegionInfo.encodeRegionName(region));<a name="line.1362"></a>
+<span class="sourceLineNo">1288</span>      // Success or partial success<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>      // Analyze detailed results. We can still have individual failures to be redo.<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      // two specific throwables are managed:<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      //  - DoNotRetryIOException: we continue to retry for other actions<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      //  - RegionMovedException: we update the cache with the new region location<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span><a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      List&lt;Action&lt;Row&gt;&gt; toReplay = new ArrayList&lt;Action&lt;Row&gt;&gt;();<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      Throwable throwable = null;<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      int failureCount = 0;<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      boolean canRetry = true;<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span><a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      Map&lt;byte[], MultiResponse.RegionResult&gt; results = responses.getResults();<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      updateStats(server, results);<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span><a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      int failed = 0, stopped = 0;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>      // Go by original action.<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>      for (Map.Entry&lt;byte[], List&lt;Action&lt;Row&gt;&gt;&gt; regionEntry : multiAction.actions.entrySet()) {<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>        byte[] regionName = regionEntry.getKey();<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>        Map&lt;Integer, Object&gt; regionResults = results.get(regionName) == null<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>            ?  null : results.get(regionName).result;<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>        if (regionResults == null) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>          if (!responses.getExceptions().containsKey(regionName)) {<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>            LOG.error("Server sent us neither results nor exceptions for "<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>                + Bytes.toStringBinary(regionName));<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>            responses.getExceptions().put(regionName, new RuntimeException("Invalid response"));<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>          }<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>          continue;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>        }<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        boolean regionFailureRegistered = false;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        for (Action&lt;Row&gt; sentAction : regionEntry.getValue()) {<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>          Object result = regionResults.get(sentAction.getOriginalIndex());<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>          // Failure: retry if it's make sense else update the errors lists<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>          if (result == null || result instanceof Throwable) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>            Row row = sentAction.getAction();<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>            throwable = ClientExceptionsUtil.findException(result);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>            // Register corresponding failures once per server/once per region.<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>            if (!regionFailureRegistered) {<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>              regionFailureRegistered = true;<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>              try {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>                connection.updateCachedLocations(<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>                  tableName, regionName, row.getRow(), result, server);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>              } catch (Throwable ex) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>                // That should never happen, but if it did, we want to make sure<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>                // we still process errors<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>                LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>              }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>            }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>            if (failureCount == 0) {<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>              errorsByServer.reportServerError(server);<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>              // We determine canRetry only once for all calls, after reporting server failure.<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>              canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>            }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>            ++failureCount;<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>            Retry retry = manageError(sentAction.getOriginalIndex(), row,<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>                canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, (Throwable) result, server);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>            if (retry == Retry.YES) {<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>              toReplay.add(sentAction);<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>            } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>              ++stopped;<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>            } else {<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>              ++failed;<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>            }<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>          } else {<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>            if (callback != null) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>              try {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>                //noinspection unchecked<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>                // TODO: would callback expect a replica region name if it gets one?<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>                this.callback.update(regionName, sentAction.getAction().getRow(), (CResult) result);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>              } catch (Throwable t) {<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>                LOG.error("User callback threw an exception for "<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>                    + Bytes.toStringBinary(regionName) + ", ignoring", t);<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>            setResult(sentAction, result);<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>          }<a name="line.1362"></a>
 <span class="sourceLineNo">1363</span>        }<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        if (failureCount == 0) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>          errorsByServer.reportServerError(server);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>          canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>        }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        if (null == tableName &amp;&amp; ClientExceptionsUtil.isMetaClearingException(throwable)) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>          // For multi-actions, we don't have a table name, but we want to make sure to clear the<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>          // cache in case there were location-related exceptions. We don't to clear the cache<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>          // for every possible exception that comes through, however.<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>          connection.clearCaches(server);<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        } else {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>          connection.updateCachedLocations(<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>              tableName, region, actions.get(0).getAction().getRow(), throwable, server);<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>        }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        failureCount += actions.size();<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span><a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>        for (Action&lt;Row&gt; action : actions) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>          Row row = action.getAction();<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          Retry retry = manageError(action.getOriginalIndex(), row,<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>              canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, throwable, server);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>          if (retry == Retry.YES) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>            toReplay.add(action);<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>            ++stopped;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>          } else {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>            ++failed;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>          }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        }<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (toReplay.isEmpty()) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        logNoResubmit(server, numAttempt, failureCount, throwable, failed, stopped);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      } else {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>        resubmit(server, toReplay, numAttempt, failureCount, throwable);<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    private String createLog(int numAttempt, int failureCount, int replaySize, ServerName sn,<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        Throwable error, long backOffTime, boolean willRetry, String startTime,<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>        int failed, int stopped) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      StringBuilder sb = new StringBuilder();<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      sb.append("#").append(id).append(", table=").append(tableName).append(", ")<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>        .append("attempt=").append(numAttempt)<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>        .append("/").append(numTries).append(" ");<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span><a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      if (failureCount &gt; 0 || error != null){<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>        sb.append("failed=").append(failureCount).append("ops").append(", last exception: ").<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>            append(error == null ? "null" : error);<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>      } else {<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        sb.append("succeeded");<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      }<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span><a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      sb.append(" on ").append(sn).append(", tracking started ").append(startTime);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span><a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      if (willRetry) {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        sb.append(", retrying after=").append(backOffTime).append("ms").<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>            append(", replay=").append(replaySize).append("ops");<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      } else if (failureCount &gt; 0) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        if (stopped &gt; 0) {<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          sb.append("; not retrying ").append(stopped).append(" due to success from other replica");<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>        }<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        if (failed &gt; 0) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          sb.append("; not retrying ").append(failed).append(" - final failure");<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>        }<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span><a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span><a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      return sb.toString();<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
+<span class="sourceLineNo">1364</span>      }<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span><a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      // The failures global to a region. We will use for multiAction we sent previously to find the<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>      //   actions to replay.<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      for (Map.Entry&lt;byte[], Throwable&gt; throwableEntry : responses.getExceptions().entrySet()) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        throwable = throwableEntry.getValue();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>        byte[] region = throwableEntry.getKey();<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>        List&lt;Action&lt;Row&gt;&gt; actions = multiAction.actions.get(region);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>        if (actions == null || actions.isEmpty()) {<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>          throw new IllegalStateException("Wrong response for the region: " +<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>              HRegionInfo.encodeRegionName(region));<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        }<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span><a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        if (failureCount == 0) {<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>          errorsByServer.reportServerError(server);<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>          canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>        }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>        if (null == tableName &amp;&amp; ClientExceptionsUtil.isMetaClearingException(throwable)) {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>          // For multi-actions, we don't have a table name, but we want to make sure to clear the<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>          // cache in case there were location-related exceptions. We don't to clear the cache<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>          // for every possible exception that comes through, however.<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>          connection.clearCaches(server);<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>        } else {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>          try {<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>            connection.updateCachedLocations(<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>              tableName, region, actions.get(0).getAction().getRow(), throwable, server);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          } catch (Throwable ex) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>            // That should never happen, but if it did, we want to make sure<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            // we still process errors<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>            LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          }<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        failureCount += actions.size();<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span><a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>        for (Action&lt;Row&gt; action : actions) {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>          Row row = action.getAction();<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>          Retry retry = manageError(action.getOriginalIndex(), row,<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>              canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, throwable, server);<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>          if (retry == Retry.YES) {<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>            toReplay.add(action);<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>            ++stopped;<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>          } else {<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>            ++failed;<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>          }<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        }<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      }<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>      if (toReplay.isEmpty()) {<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>        logNoResubmit(server, numAttempt, failureCount, throwable, failed, stopped);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>      } else {<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>        resubmit(server, toReplay, numAttempt, failureCount, throwable);<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>      }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span><a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    private String createLog(int numAttempt, int failureCount, int replaySize, ServerName sn,<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>        Throwable error, long backOffTime, boolean willRetry, String startTime,<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>        int failed, int stopped) {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      StringBuilder sb = new StringBuilder();<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>      sb.append("#").append(id).append(", table=").append(tableName).append(", ")<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>        .append("attempt=").append(numAttempt)<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>        .append("/").append(numTries).append(" ");<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span><a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      if (failureCount &gt; 0 || error != null){<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>        sb.append("failed=").append(failureCount).append("ops").append(", last exception: ").<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>            append(error == null ? "null" : error);<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      } else {<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>        sb.append("succeeded");<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>      }<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>     * Sets the non-error result from a particular action.<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>     * @param action Action (request) that the server responded to.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>     * @param result The result.<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>     */<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    private void setResult(Action&lt;Row&gt; action, Object result) {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      if (result == null) {<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        throw new RuntimeException("Result cannot be null");<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      }<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      ReplicaResultState state = null;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      boolean isStale = !RegionReplicaUtil.isDefaultReplica(action.getReplicaId());<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      int index = action.getOriginalIndex();<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      if (results == null) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        decActionCounter(index);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        return; // Simple case, no replica requests.<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      }<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      state = trySetResultSimple(index, action.getAction(), false, result, null, isStale);<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      if (state == null) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        return; // Simple case, no replica requests.<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      // At this point we know that state is set to replica tracking class.<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>      // It could be that someone else is also looking at it; however, we know there can<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      // only be one state object, and only one thread can set callCount to 0. Other threads<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>      // will either see state with callCount 0 after locking it; or will not see state at all<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      // we will replace it with the result.<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      synchronized (state) {<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>        if (state.callCount == 0) {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>          return; // someone already set the result<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>        }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        state.callCount = 0;<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>      }<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>      synchronized (replicaResultLock) {<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>        if (results[index] != state) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>          throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>        }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        results[index] = result;<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>      }<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span><a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      decActionCounter(index);<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    }<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span><a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>    /**<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>     * Sets the error from a particular action.<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>     * @param index Original action index.<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>     * @param row Original request.<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>     * @param throwable The resulting error.<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>     * @param server The source server.<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>     */<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>    private void setError(int index, Row row, Throwable throwable, ServerName server) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      ReplicaResultState state = null;<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>      if (results == null) {<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>        // Note that we currently cannot have replica requests with null results. So it shouldn't<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>        // happen that multiple replica calls will call dAC for same actions with results == null.<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        // Only one call per action should be present in this case.<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        errors.add(throwable, row, server);<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>        decActionCounter(index);<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>        return; // Simple case, no replica requests.<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>      }<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>      state = trySetResultSimple(index, row, true, throwable, server, false);<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>      if (state == null) {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>        return; // Simple case, no replica requests.<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>      }<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>      BatchErrors target = null; // Error will be added to final errors, or temp replica errors.<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      boolean isActionDone = false;<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>      synchronized (state) {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>        switch (state.callCount) {<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>          case 0: return; // someone already set the result<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>          case 1: { // All calls failed, we are the last error.<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>            target = errors;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>            isActionDone = true;<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>            break;<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>          }<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>          default: {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>            assert state.callCount &gt; 1;<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>            if (state.replicaErrors == null) {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>              state.replicaErrors = new BatchErrors();<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>            }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>            target = state.replicaErrors;<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>            break;<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>        --state.callCount;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      target.add(throwable, row, server);<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>      if (isActionDone) {<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        if (state.replicaErrors != null) { // last call, no need to lock<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>          errors.merge(state.replicaErrors);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>        }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>        // See setResult for explanations.<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>        synchronized (replicaResultLock) {<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>          if (results[index] != state) {<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>            throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>          }<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>          results[index] = throwable;<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>        }<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>        decActionCounter(index);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      }<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    }<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span><a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    /**<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>     * Checks if the action is complete; used on error to prevent needless retries.<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>     * Does not synchronize, assuming element index/field accesses are atomic.<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>     * This is an opportunistic optimization check, doesn't have to be strict.<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>     * @param index Original action index.<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>     * @param row Original request.<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>     */<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    private boolean isActionComplete(int index, Row row) {<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      if (!isReplicaGet(row)) return false;<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      Object resObj = results[index];<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      return (resObj != null) &amp;&amp; (!(resObj instanceof ReplicaResultState)<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>          || ((ReplicaResultState)resObj).callCount == 0);<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>     * Tries to set the result or error for a particular action as if there were no replica calls.<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>     * @return null if successful; replica state if there were in fact replica calls.<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>     */<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    private ReplicaResultState trySetResultSimple(int index, Row row, boolean isError,<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>        Object result, ServerName server, boolean isFromReplica) {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      Object resObj = null;<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      if (!isReplicaGet(row)) {<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>        if (isFromReplica) {<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>          throw new AssertionError("Unexpected stale result for " + row);<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        }<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        results[index] = result;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>      } else {<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>        synchronized (replicaResultLock) {<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          resObj = results[index];<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>          if (resObj == null) {<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>            if (isFromReplica) {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>              throw new AssertionError("Unexpected stale result for " + row);<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>            }<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>            results[index] = result;<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>          }<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>        }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>      }<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span><a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>      ReplicaResultState rrs =<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>          (resObj instanceof ReplicaResultState) ? (ReplicaResultState)resObj : null;<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      if (rrs == null &amp;&amp; isError) {<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>        // The resObj is not replica state (null or already set).<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>        errors.add((Throwable)result, row, server);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>      }<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span><a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>      if (resObj == null) {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>        // resObj is null - no replica calls were made.<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>        decActionCounter(index);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>        return null;<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      }<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      return rrs;<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    }<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span><a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    private void decActionCounter(int index) {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>      long actionsRemaining = actionsInProgress.decrementAndGet();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      if (actionsRemaining &lt; 0) {<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>        String error = buildDetailedErrorMsg("Incorrect actions in progress", index);<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>        throw new AssertionError(error);<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      } else if (actionsRemaining == 0) {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>        synchronized (actionsInProgress) {<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>          actionsInProgress.notifyAll();<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>        }<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>      }<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span><a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>    private String buildDetailedErrorMsg(String string, int index) {<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>      StringBuilder error = new StringBuilder(128);<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>      error.append(string).append("; called for ").append(index).append(", actionsInProgress ")<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>          .append(actionsInProgress.get()).append("; replica gets: ");<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>      if (replicaGetIndices != null) {<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>        for (int i = 0; i &lt; replicaGetIndices.length; ++i) {<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>          error.append(replicaGetIndices[i]).append(", ");<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>        }<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>      } else {<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>        error.append(hasAnyReplicaGets ? "all" : "none");<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>      }<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      error.append("; results ");<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      if (results != null) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>        for (int i = 0; i &lt; results.length; ++i) {<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>          Object o = results[i];<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          error.append(((o == null) ? "null" : o.toString())).append(", ");<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>        }<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>      }<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      return error.toString();<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    }<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span><a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    @Override<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    public void waitUntilDone() throws InterruptedIOException {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      try {<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>        waitUntilDone(Long.MAX_VALUE);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>      } catch (InterruptedException iex) {<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        throw new InterruptedIOException(iex.getMessage());<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>      } finally {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>        if (callsInProgress != null) {<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>          for (PayloadCarryingServerCallable clb : callsInProgress) {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>            clb.cancel();<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>          }<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>      }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>    }<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span><a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    private boolean waitUntilDone(long cutoff) throws InterruptedException {<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>      boolean hasWait = cutoff != Long.MAX_VALUE;<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>      long lastLog = EnvironmentEdgeManager.currentTime();<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>      long currentInProgress;<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>      while (0 != (currentInProgress = actionsInProgress.get())) {<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>        long now = EnvironmentEdgeManager.currentTime();<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>        if (hasWait &amp;&amp; (now * 1000L) &gt; cutoff) {<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>          return false;<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>        }<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>        if (!hasWait) { // Only log if wait is infinite.<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>          if (now &gt; lastLog + 10000) {<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>            lastLog = now;<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>            LOG.info("#" + id + ", waiting for " + currentInProgress + "  actions to finish");<a name="line.1645"></a>
+<span class="sourceLineNo">1433</span>      sb.append(" on ").append(sn).append(", tracking started ").append(startTime);<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span><a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      if (willRetry) {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>        sb.append(", retrying after=").append(backOffTime).append("ms").<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>            append(", replay=").append(replaySize).append("ops");<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>      } else if (failureCount &gt; 0) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>        if (stopped &gt; 0) {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>          sb.append("; not retrying ").append(stopped).append(" due to success from other replica");<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        if (failed &gt; 0) {<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>          sb.append("; not retrying ").append(failed).append(" - final failure");<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>        }<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><a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      return sb.toString();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>    }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span><a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>    /**<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>     * Sets the non-error result from a particular action.<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>     * @param action Action (request) that the server responded to.<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>     * @param result The result.<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>     */<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    private void setResult(Action&lt;Row&gt; action, Object result) {<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      if (result == null) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>        throw new RuntimeException("Result cannot be null");<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>      ReplicaResultState state = null;<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>      boolean isStale = !RegionReplicaUtil.isDefaultReplica(action.getReplicaId());<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      int index = action.getOriginalIndex();<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>      if (results == null) {<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>        decActionCounter(index);<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>        return; // Simple case, no replica requests.<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>      }<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>      state = trySetResultSimple(index, action.getAction(), false, result, null, isStale);<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      if (state == null) {<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>        return; // Simple case, no replica requests.<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>      }<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>      // At this point we know that state is set to replica tracking class.<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>      // It could be that someone else is also looking at it; however, we know there can<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      // only be one state object, and only one thread can set callCount to 0. Other threads<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      // will either see state with callCount 0 after locking it; or will not see state at all<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>      // we will replace it with the result.<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>      synchronized (state) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>        if (state.callCount == 0) {<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>          return; // someone already set the result<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>        state.callCount = 0;<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      }<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      synchronized (replicaResultLock) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>        if (results[index] != state) {<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>          throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>        }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>        results[index] = result;<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>      decActionCounter(index);<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    }<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span><a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    /**<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>     * Sets the error from a particular action.<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>     * @param index Original action index.<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>     * @param row Original request.<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>     * @param throwable The resulting error.<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>     * @param server The source server.<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>     */<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    private void setError(int index, Row row, Throwable throwable, ServerName server) {<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      ReplicaResultState state = null;<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>      if (results == null) {<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>        // Note that we currently cannot have replica requests with null results. So it shouldn't<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>        // happen that multiple replica calls will call dAC for same actions with results == null.<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>        // Only one call per action should be present in this case.<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>        errors.add(throwable, row, server);<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>        decActionCounter(index);<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>        return; // Simple case, no replica requests.<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>      }<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>      state = trySetResultSimple(index, row, true, throwable, server, false);<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      if (state == null) {<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>        return; // Simple case, no replica requests.<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>      }<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      BatchErrors target = null; // Error will be added to final errors, or temp replica errors.<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>      boolean isActionDone = false;<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>      synchronized (state) {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>        switch (state.callCount) {<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>          case 0: return; // someone already set the result<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>          case 1: { // All calls failed, we are the last error.<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>            target = errors;<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>            isActionDone = true;<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>            break;<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>          }<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          default: {<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>            assert state.callCount &gt; 1;<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>            if (state.replicaErrors == null) {<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>              state.replicaErrors = new BatchErrors();<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>            }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>            target = state.replicaErrors;<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>            break;<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>          }<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>        }<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>        --state.callCount;<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>      }<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span>      target.add(throwable, row, server);<a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>      if (isActionDone) {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>        if (state.replicaErrors != null) { // last call, no need to lock<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>          errors.merge(state.replicaErrors);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>        }<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>        // See setResult for explanations.<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>        synchronized (replicaResultLock) {<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>          if (results[index] != state) {<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>            throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>          }<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>          results[index] = throwable;<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>        }<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>        decActionCounter(index);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>      }<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>    }<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span><a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>    /**<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>     * Checks if the action is complete; used on error to prevent needless retries.<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>     * Does not synchronize, assuming element index/field accesses are atomic.<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>     * This is an opportunistic optimization check, doesn't have to be strict.<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>     * @param index Original action index.<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>     * @param row Original request.<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>     */<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    private boolean isActionComplete(int index, Row row) {<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>      if (!isReplicaGet(row)) return false;<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>      Object resObj = results[index];<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>      return (resObj != null) &amp;&amp; (!(resObj instanceof ReplicaResultState)<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>          || ((ReplicaResultState)resObj).callCount == 0);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    }<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span><a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>    /**<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>     * Tries to set the result or error for a particular action as if there were no replica calls.<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>     * @return null if successful; replica state if there were in fact replica calls.<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>     */<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>    private ReplicaResultState trySetResultSimple(int index, Row row, boolean isError,<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>        Object result, ServerName server, boolean isFromReplica) {<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>      Object resObj = null;<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      if (!isReplicaGet(row)) {<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>        if (isFromReplica) {<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>          throw new AssertionError("Unexpected stale result for " + row);<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>        }<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>        results[index] = result;<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>      } else {<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>        synchronized (replicaResultLock) {<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>          resObj = results[index];<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>          if (resObj == null) {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>            if (isFromReplica) {<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>              throw new AssertionError("Unexpected stale result for " + row);<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>            }<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>            results[index] = result;<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>          }<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>        }<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>      }<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span><a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>      ReplicaResultState rrs =<a name="line.1588"></a>
+<span class="sourceLineNo">1589</sp

<TRUNCATED>

[34/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.html
index ed7bc7f..e65df71 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.html
@@ -1198,681 +1198,699 @@
 <span class="sourceLineNo">1190</span>        byte[] row = e.getValue().iterator().next().getAction().getRow();<a name="line.1190"></a>
 <span class="sourceLineNo">1191</span>        // Do not use the exception for updating cache because it might be coming from<a name="line.1191"></a>
 <span class="sourceLineNo">1192</span>        // any of the regions in the MultiAction.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        if (tableName != null) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>          connection.updateCachedLocations(tableName, regionName, row,<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>              ClientExceptionsUtil.isMetaClearingException(t) ? null : t, server);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>        for (Action&lt;Row&gt; action : e.getValue()) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          Retry retry = manageError(<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>              action.getOriginalIndex(), action.getAction(), canRetry, t, server);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (retry == Retry.YES) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            toReplay.add(action);<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            ++stopped;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>          } else {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            ++failed;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>          }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>        }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>      }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      if (toReplay.isEmpty()) {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>        logNoResubmit(server, numAttempt, rsActions.size(), t, failed, stopped);<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>      } else {<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        resubmit(server, toReplay, numAttempt, rsActions.size(), t);<a name="line.1213"></a>
+<span class="sourceLineNo">1193</span>        try {<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          if (tableName != null) {<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>            connection.updateCachedLocations(tableName, regionName, row,<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>              ClientExceptionsUtil.isMetaClearingException(t) ? null : t, server);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>          }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        } catch (Throwable ex) {<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>          // That should never happen, but if it did, we want to make sure<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          // we still process errors<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>          LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        for (Action&lt;Row&gt; action : e.getValue()) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          Retry retry = manageError(<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              action.getOriginalIndex(), action.getAction(), canRetry, t, server);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>          if (retry == Retry.YES) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>            toReplay.add(action);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>            ++stopped;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>            ++failed;<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
 <span class="sourceLineNo">1214</span>      }<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>     * Log as much info as possible, and, if there is something to replay,<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     * submit it again after a back off sleep.<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>     */<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    private void resubmit(ServerName oldServer, List&lt;Action&lt;Row&gt;&gt; toReplay,<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        int numAttempt, int failureCount, Throwable throwable) {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      // We have something to replay. We're going to sleep a little before.<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // We have two contradicting needs here:<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      //  1) We want to get the new location after having slept, as it may change.<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      //  2) We want to take into account the location when calculating the sleep time.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      //  3) If all this is just because the response needed to be chunked try again FAST.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      // It should be possible to have some heuristics to take the right decision. Short term,<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>      //  we go for one.<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      boolean retryImmediately = throwable instanceof RetryImmediatelyException;<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      int nextAttemptNumber = retryImmediately ? numAttempt : numAttempt + 1;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      long backOffTime = retryImmediately ? 0 :<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          errorsByServer.calculateBackoffTime(oldServer, pause);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>      if (numAttempt &gt; startLogErrorsCnt) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        // We use this value to have some logs when we have multiple failures, but not too many<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        //  logs, as errors are to be expected when a region moves, splits and so on<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        LOG.info(createLog(numAttempt, failureCount, toReplay.size(),<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>            oldServer, throwable, backOffTime, true, null, -1, -1));<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      try {<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>        if (backOffTime &gt; 0) {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>          Thread.sleep(backOffTime);<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>        }<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      } catch (InterruptedException e) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>        LOG.warn("#" + id + ", not sent: " + toReplay.size() + " operations, " + oldServer, e);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>        Thread.currentThread().interrupt();<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        return;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>      groupAndSendMultiAction(toReplay, nextAttemptNumber);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    private void logNoResubmit(ServerName oldServer, int numAttempt,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        int failureCount, Throwable throwable, int failed, int stopped) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      if (failureCount != 0 || numAttempt &gt; startLogErrorsCnt + 1) {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>        String timeStr = new Date(errorsByServer.getStartTrackingTime()).toString();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>        String logMessage = createLog(numAttempt, failureCount, 0, oldServer,<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>            throwable, -1, false, timeStr, failed, stopped);<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>        if (failed != 0) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>          // Only log final failures as warning<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>          LOG.warn(logMessage);<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        } else {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>          LOG.info(logMessage);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>        }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    }<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    /**<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>     * Called when we receive the result of a server query.<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>     *<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>     * @param multiAction    - the multiAction we sent<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>     * @param server       - the location. It's used as a server name.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>     * @param responses      - the response, if any<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>     * @param numAttempt     - the attempt<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>     */<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    private void receiveMultiAction(MultiAction&lt;Row&gt; multiAction,<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>        ServerName server, MultiResponse responses, int numAttempt) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>       assert responses != null;<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span><a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      // Success or partial success<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      // Analyze detailed results. We can still have individual failures to be redo.<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      // two specific throwables are managed:<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      //  - DoNotRetryIOException: we continue to retry for other actions<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      //  - RegionMovedException: we update the cache with the new region location<a name="line.1286"></a>
+<span class="sourceLineNo">1215</span><a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      if (toReplay.isEmpty()) {<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>        logNoResubmit(server, numAttempt, rsActions.size(), t, failed, stopped);<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>        resubmit(server, toReplay, numAttempt, rsActions.size(), t);<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    }<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>     * Log as much info as possible, and, if there is something to replay,<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>     * submit it again after a back off sleep.<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    private void resubmit(ServerName oldServer, List&lt;Action&lt;Row&gt;&gt; toReplay,<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        int numAttempt, int failureCount, Throwable throwable) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>      // We have something to replay. We're going to sleep a little before.<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      // We have two contradicting needs here:<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>      //  1) We want to get the new location after having slept, as it may change.<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>      //  2) We want to take into account the location when calculating the sleep time.<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      //  3) If all this is just because the response needed to be chunked try again FAST.<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      // It should be possible to have some heuristics to take the right decision. Short term,<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      //  we go for one.<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      boolean retryImmediately = throwable instanceof RetryImmediatelyException;<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>      int nextAttemptNumber = retryImmediately ? numAttempt : numAttempt + 1;<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      long backOffTime = retryImmediately ? 0 :<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          errorsByServer.calculateBackoffTime(oldServer, pause);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      if (numAttempt &gt; startLogErrorsCnt) {<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>        // We use this value to have some logs when we have multiple failures, but not too many<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>        //  logs, as errors are to be expected when a region moves, splits and so on<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>        LOG.info(createLog(numAttempt, failureCount, toReplay.size(),<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>            oldServer, throwable, backOffTime, true, null, -1, -1));<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      }<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span><a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      try {<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>        if (backOffTime &gt; 0) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>          Thread.sleep(backOffTime);<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>        }<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      } catch (InterruptedException e) {<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>        LOG.warn("#" + id + ", not sent: " + toReplay.size() + " operations, " + oldServer, e);<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>        Thread.currentThread().interrupt();<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>        return;<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span><a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      groupAndSendMultiAction(toReplay, nextAttemptNumber);<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    private void logNoResubmit(ServerName oldServer, int numAttempt,<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        int failureCount, Throwable throwable, int failed, int stopped) {<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>      if (failureCount != 0 || numAttempt &gt; startLogErrorsCnt + 1) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>        String timeStr = new Date(errorsByServer.getStartTrackingTime()).toString();<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>        String logMessage = createLog(numAttempt, failureCount, 0, oldServer,<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>            throwable, -1, false, timeStr, failed, stopped);<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>        if (failed != 0) {<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          // Only log final failures as warning<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          LOG.warn(logMessage);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>        } else {<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>          LOG.info(logMessage);<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>        }<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    }<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span><a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>    /**<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>     * Called when we receive the result of a server query.<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>     *<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>     * @param multiAction    - the multiAction we sent<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>     * @param server       - the location. It's used as a server name.<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>     * @param responses      - the response, if any<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>     * @param numAttempt     - the attempt<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>     */<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    private void receiveMultiAction(MultiAction&lt;Row&gt; multiAction,<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        ServerName server, MultiResponse responses, int numAttempt) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>       assert responses != null;<a name="line.1286"></a>
 <span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      List&lt;Action&lt;Row&gt;&gt; toReplay = new ArrayList&lt;Action&lt;Row&gt;&gt;();<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      Throwable throwable = null;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      int failureCount = 0;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      boolean canRetry = true;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span><a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      Map&lt;byte[], MultiResponse.RegionResult&gt; results = responses.getResults();<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      updateStats(server, results);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      int failed = 0, stopped = 0;<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      // Go by original action.<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      for (Map.Entry&lt;byte[], List&lt;Action&lt;Row&gt;&gt;&gt; regionEntry : multiAction.actions.entrySet()) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        byte[] regionName = regionEntry.getKey();<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>        Map&lt;Integer, Object&gt; regionResults = results.get(regionName) == null<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>            ?  null : results.get(regionName).result;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        if (regionResults == null) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>          if (!responses.getExceptions().containsKey(regionName)) {<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>            LOG.error("Server sent us neither results nor exceptions for "<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>                + Bytes.toStringBinary(regionName));<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>            responses.getExceptions().put(regionName, new RuntimeException("Invalid response"));<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>          }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>          continue;<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>        }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>        boolean regionFailureRegistered = false;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>        for (Action&lt;Row&gt; sentAction : regionEntry.getValue()) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>          Object result = regionResults.get(sentAction.getOriginalIndex());<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>          // Failure: retry if it's make sense else update the errors lists<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>          if (result == null || result instanceof Throwable) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>            Row row = sentAction.getAction();<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>            throwable = ClientExceptionsUtil.findException(result);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>            // Register corresponding failures once per server/once per region.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>            if (!regionFailureRegistered) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>              regionFailureRegistered = true;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>              connection.updateCachedLocations(<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>                  tableName, regionName, row.getRow(), result, server);<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>            }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>            if (failureCount == 0) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>              errorsByServer.reportServerError(server);<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>              // We determine canRetry only once for all calls, after reporting server failure.<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>              canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            }<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            ++failureCount;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>            Retry retry = manageError(sentAction.getOriginalIndex(), row,<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>                canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, (Throwable) result, server);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>            if (retry == Retry.YES) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>              toReplay.add(sentAction);<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>            } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>              ++stopped;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>            } else {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>              ++failed;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>            }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>          } else {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>            if (callback != null) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>              try {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>                //noinspection unchecked<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>                // TODO: would callback expect a replica region name if it gets one?<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>                this.callback.update(regionName, sentAction.getAction().getRow(), (CResult) result);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>              } catch (Throwable t) {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>                LOG.error("User callback threw an exception for "<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>                    + Bytes.toStringBinary(regionName) + ", ignoring", t);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>              }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>            }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>            setResult(sentAction, result);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>          }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>        }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      }<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span><a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      // The failures global to a region. We will use for multiAction we sent previously to find the<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      //   actions to replay.<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      for (Map.Entry&lt;byte[], Throwable&gt; throwableEntry : responses.getExceptions().entrySet()) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>        throwable = throwableEntry.getValue();<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>        byte[] region = throwableEntry.getKey();<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        List&lt;Action&lt;Row&gt;&gt; actions = multiAction.actions.get(region);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>        if (actions == null || actions.isEmpty()) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          throw new IllegalStateException("Wrong response for the region: " +<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>              HRegionInfo.encodeRegionName(region));<a name="line.1362"></a>
+<span class="sourceLineNo">1288</span>      // Success or partial success<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>      // Analyze detailed results. We can still have individual failures to be redo.<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      // two specific throwables are managed:<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      //  - DoNotRetryIOException: we continue to retry for other actions<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      //  - RegionMovedException: we update the cache with the new region location<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span><a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      List&lt;Action&lt;Row&gt;&gt; toReplay = new ArrayList&lt;Action&lt;Row&gt;&gt;();<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      Throwable throwable = null;<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      int failureCount = 0;<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      boolean canRetry = true;<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span><a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      Map&lt;byte[], MultiResponse.RegionResult&gt; results = responses.getResults();<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      updateStats(server, results);<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span><a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      int failed = 0, stopped = 0;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>      // Go by original action.<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>      for (Map.Entry&lt;byte[], List&lt;Action&lt;Row&gt;&gt;&gt; regionEntry : multiAction.actions.entrySet()) {<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>        byte[] regionName = regionEntry.getKey();<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>        Map&lt;Integer, Object&gt; regionResults = results.get(regionName) == null<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>            ?  null : results.get(regionName).result;<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>        if (regionResults == null) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>          if (!responses.getExceptions().containsKey(regionName)) {<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>            LOG.error("Server sent us neither results nor exceptions for "<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>                + Bytes.toStringBinary(regionName));<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>            responses.getExceptions().put(regionName, new RuntimeException("Invalid response"));<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>          }<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>          continue;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>        }<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        boolean regionFailureRegistered = false;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        for (Action&lt;Row&gt; sentAction : regionEntry.getValue()) {<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>          Object result = regionResults.get(sentAction.getOriginalIndex());<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>          // Failure: retry if it's make sense else update the errors lists<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>          if (result == null || result instanceof Throwable) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>            Row row = sentAction.getAction();<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>            throwable = ClientExceptionsUtil.findException(result);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>            // Register corresponding failures once per server/once per region.<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>            if (!regionFailureRegistered) {<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>              regionFailureRegistered = true;<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>              try {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>                connection.updateCachedLocations(<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>                  tableName, regionName, row.getRow(), result, server);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>              } catch (Throwable ex) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>                // That should never happen, but if it did, we want to make sure<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>                // we still process errors<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>                LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>              }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>            }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>            if (failureCount == 0) {<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>              errorsByServer.reportServerError(server);<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>              // We determine canRetry only once for all calls, after reporting server failure.<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>              canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>            }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>            ++failureCount;<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>            Retry retry = manageError(sentAction.getOriginalIndex(), row,<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>                canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, (Throwable) result, server);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>            if (retry == Retry.YES) {<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>              toReplay.add(sentAction);<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>            } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>              ++stopped;<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>            } else {<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>              ++failed;<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>            }<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>          } else {<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>            if (callback != null) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>              try {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>                //noinspection unchecked<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>                // TODO: would callback expect a replica region name if it gets one?<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>                this.callback.update(regionName, sentAction.getAction().getRow(), (CResult) result);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>              } catch (Throwable t) {<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>                LOG.error("User callback threw an exception for "<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>                    + Bytes.toStringBinary(regionName) + ", ignoring", t);<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>            setResult(sentAction, result);<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>          }<a name="line.1362"></a>
 <span class="sourceLineNo">1363</span>        }<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        if (failureCount == 0) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>          errorsByServer.reportServerError(server);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>          canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>        }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        if (null == tableName &amp;&amp; ClientExceptionsUtil.isMetaClearingException(throwable)) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>          // For multi-actions, we don't have a table name, but we want to make sure to clear the<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>          // cache in case there were location-related exceptions. We don't to clear the cache<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>          // for every possible exception that comes through, however.<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>          connection.clearCaches(server);<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        } else {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>          connection.updateCachedLocations(<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>              tableName, region, actions.get(0).getAction().getRow(), throwable, server);<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>        }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        failureCount += actions.size();<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span><a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>        for (Action&lt;Row&gt; action : actions) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>          Row row = action.getAction();<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          Retry retry = manageError(action.getOriginalIndex(), row,<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>              canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, throwable, server);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>          if (retry == Retry.YES) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>            toReplay.add(action);<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>            ++stopped;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>          } else {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>            ++failed;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>          }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        }<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (toReplay.isEmpty()) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        logNoResubmit(server, numAttempt, failureCount, throwable, failed, stopped);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      } else {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>        resubmit(server, toReplay, numAttempt, failureCount, throwable);<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    private String createLog(int numAttempt, int failureCount, int replaySize, ServerName sn,<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        Throwable error, long backOffTime, boolean willRetry, String startTime,<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>        int failed, int stopped) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      StringBuilder sb = new StringBuilder();<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      sb.append("#").append(id).append(", table=").append(tableName).append(", ")<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>        .append("attempt=").append(numAttempt)<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>        .append("/").append(numTries).append(" ");<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span><a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      if (failureCount &gt; 0 || error != null){<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>        sb.append("failed=").append(failureCount).append("ops").append(", last exception: ").<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>            append(error == null ? "null" : error);<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>      } else {<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        sb.append("succeeded");<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      }<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span><a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      sb.append(" on ").append(sn).append(", tracking started ").append(startTime);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span><a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      if (willRetry) {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        sb.append(", retrying after=").append(backOffTime).append("ms").<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>            append(", replay=").append(replaySize).append("ops");<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      } else if (failureCount &gt; 0) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        if (stopped &gt; 0) {<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          sb.append("; not retrying ").append(stopped).append(" due to success from other replica");<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>        }<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        if (failed &gt; 0) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          sb.append("; not retrying ").append(failed).append(" - final failure");<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>        }<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span><a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span><a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      return sb.toString();<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
+<span class="sourceLineNo">1364</span>      }<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span><a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      // The failures global to a region. We will use for multiAction we sent previously to find the<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>      //   actions to replay.<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      for (Map.Entry&lt;byte[], Throwable&gt; throwableEntry : responses.getExceptions().entrySet()) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        throwable = throwableEntry.getValue();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>        byte[] region = throwableEntry.getKey();<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>        List&lt;Action&lt;Row&gt;&gt; actions = multiAction.actions.get(region);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>        if (actions == null || actions.isEmpty()) {<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>          throw new IllegalStateException("Wrong response for the region: " +<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>              HRegionInfo.encodeRegionName(region));<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        }<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span><a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        if (failureCount == 0) {<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>          errorsByServer.reportServerError(server);<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>          canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>        }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>        if (null == tableName &amp;&amp; ClientExceptionsUtil.isMetaClearingException(throwable)) {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>          // For multi-actions, we don't have a table name, but we want to make sure to clear the<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>          // cache in case there were location-related exceptions. We don't to clear the cache<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>          // for every possible exception that comes through, however.<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>          connection.clearCaches(server);<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>        } else {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>          try {<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>            connection.updateCachedLocations(<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>              tableName, region, actions.get(0).getAction().getRow(), throwable, server);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          } catch (Throwable ex) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>            // That should never happen, but if it did, we want to make sure<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            // we still process errors<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>            LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          }<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        failureCount += actions.size();<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span><a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>        for (Action&lt;Row&gt; action : actions) {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>          Row row = action.getAction();<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>          Retry retry = manageError(action.getOriginalIndex(), row,<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>              canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, throwable, server);<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>          if (retry == Retry.YES) {<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>            toReplay.add(action);<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>            ++stopped;<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>          } else {<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>            ++failed;<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>          }<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        }<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      }<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>      if (toReplay.isEmpty()) {<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>        logNoResubmit(server, numAttempt, failureCount, throwable, failed, stopped);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>      } else {<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>        resubmit(server, toReplay, numAttempt, failureCount, throwable);<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>      }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span><a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    private String createLog(int numAttempt, int failureCount, int replaySize, ServerName sn,<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>        Throwable error, long backOffTime, boolean willRetry, String startTime,<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>        int failed, int stopped) {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      StringBuilder sb = new StringBuilder();<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>      sb.append("#").append(id).append(", table=").append(tableName).append(", ")<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>        .append("attempt=").append(numAttempt)<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>        .append("/").append(numTries).append(" ");<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span><a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      if (failureCount &gt; 0 || error != null){<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>        sb.append("failed=").append(failureCount).append("ops").append(", last exception: ").<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>            append(error == null ? "null" : error);<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      } else {<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>        sb.append("succeeded");<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>      }<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>     * Sets the non-error result from a particular action.<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>     * @param action Action (request) that the server responded to.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>     * @param result The result.<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>     */<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    private void setResult(Action&lt;Row&gt; action, Object result) {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      if (result == null) {<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        throw new RuntimeException("Result cannot be null");<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      }<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      ReplicaResultState state = null;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      boolean isStale = !RegionReplicaUtil.isDefaultReplica(action.getReplicaId());<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      int index = action.getOriginalIndex();<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      if (results == null) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        decActionCounter(index);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        return; // Simple case, no replica requests.<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      }<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      state = trySetResultSimple(index, action.getAction(), false, result, null, isStale);<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      if (state == null) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        return; // Simple case, no replica requests.<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      // At this point we know that state is set to replica tracking class.<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>      // It could be that someone else is also looking at it; however, we know there can<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      // only be one state object, and only one thread can set callCount to 0. Other threads<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>      // will either see state with callCount 0 after locking it; or will not see state at all<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      // we will replace it with the result.<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      synchronized (state) {<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>        if (state.callCount == 0) {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>          return; // someone already set the result<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>        }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        state.callCount = 0;<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>      }<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>      synchronized (replicaResultLock) {<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>        if (results[index] != state) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>          throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>        }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        results[index] = result;<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>      }<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span><a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      decActionCounter(index);<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    }<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span><a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>    /**<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>     * Sets the error from a particular action.<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>     * @param index Original action index.<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>     * @param row Original request.<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>     * @param throwable The resulting error.<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>     * @param server The source server.<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>     */<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>    private void setError(int index, Row row, Throwable throwable, ServerName server) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      ReplicaResultState state = null;<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>      if (results == null) {<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>        // Note that we currently cannot have replica requests with null results. So it shouldn't<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>        // happen that multiple replica calls will call dAC for same actions with results == null.<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        // Only one call per action should be present in this case.<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        errors.add(throwable, row, server);<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>        decActionCounter(index);<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>        return; // Simple case, no replica requests.<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>      }<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>      state = trySetResultSimple(index, row, true, throwable, server, false);<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>      if (state == null) {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>        return; // Simple case, no replica requests.<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>      }<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>      BatchErrors target = null; // Error will be added to final errors, or temp replica errors.<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      boolean isActionDone = false;<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>      synchronized (state) {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>        switch (state.callCount) {<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>          case 0: return; // someone already set the result<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>          case 1: { // All calls failed, we are the last error.<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>            target = errors;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>            isActionDone = true;<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>            break;<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>          }<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>          default: {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>            assert state.callCount &gt; 1;<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>            if (state.replicaErrors == null) {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>              state.replicaErrors = new BatchErrors();<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>            }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>            target = state.replicaErrors;<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>            break;<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>        --state.callCount;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      target.add(throwable, row, server);<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>      if (isActionDone) {<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        if (state.replicaErrors != null) { // last call, no need to lock<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>          errors.merge(state.replicaErrors);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>        }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>        // See setResult for explanations.<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>        synchronized (replicaResultLock) {<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>          if (results[index] != state) {<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>            throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>          }<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>          results[index] = throwable;<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>        }<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>        decActionCounter(index);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      }<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    }<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span><a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    /**<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>     * Checks if the action is complete; used on error to prevent needless retries.<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>     * Does not synchronize, assuming element index/field accesses are atomic.<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>     * This is an opportunistic optimization check, doesn't have to be strict.<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>     * @param index Original action index.<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>     * @param row Original request.<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>     */<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    private boolean isActionComplete(int index, Row row) {<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      if (!isReplicaGet(row)) return false;<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      Object resObj = results[index];<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      return (resObj != null) &amp;&amp; (!(resObj instanceof ReplicaResultState)<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>          || ((ReplicaResultState)resObj).callCount == 0);<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>     * Tries to set the result or error for a particular action as if there were no replica calls.<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>     * @return null if successful; replica state if there were in fact replica calls.<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>     */<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    private ReplicaResultState trySetResultSimple(int index, Row row, boolean isError,<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>        Object result, ServerName server, boolean isFromReplica) {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      Object resObj = null;<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      if (!isReplicaGet(row)) {<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>        if (isFromReplica) {<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>          throw new AssertionError("Unexpected stale result for " + row);<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        }<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        results[index] = result;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>      } else {<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>        synchronized (replicaResultLock) {<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          resObj = results[index];<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>          if (resObj == null) {<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>            if (isFromReplica) {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>              throw new AssertionError("Unexpected stale result for " + row);<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>            }<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>            results[index] = result;<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>          }<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>        }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>      }<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span><a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>      ReplicaResultState rrs =<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>          (resObj instanceof ReplicaResultState) ? (ReplicaResultState)resObj : null;<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      if (rrs == null &amp;&amp; isError) {<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>        // The resObj is not replica state (null or already set).<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>        errors.add((Throwable)result, row, server);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>      }<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span><a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>      if (resObj == null) {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>        // resObj is null - no replica calls were made.<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>        decActionCounter(index);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>        return null;<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      }<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      return rrs;<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    }<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span><a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    private void decActionCounter(int index) {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>      long actionsRemaining = actionsInProgress.decrementAndGet();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      if (actionsRemaining &lt; 0) {<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>        String error = buildDetailedErrorMsg("Incorrect actions in progress", index);<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>        throw new AssertionError(error);<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      } else if (actionsRemaining == 0) {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>        synchronized (actionsInProgress) {<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>          actionsInProgress.notifyAll();<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>        }<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>      }<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span><a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>    private String buildDetailedErrorMsg(String string, int index) {<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>      StringBuilder error = new StringBuilder(128);<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>      error.append(string).append("; called for ").append(index).append(", actionsInProgress ")<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>          .append(actionsInProgress.get()).append("; replica gets: ");<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>      if (replicaGetIndices != null) {<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>        for (int i = 0; i &lt; replicaGetIndices.length; ++i) {<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>          error.append(replicaGetIndices[i]).append(", ");<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>        }<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>      } else {<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>        error.append(hasAnyReplicaGets ? "all" : "none");<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>      }<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      error.append("; results ");<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      if (results != null) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>        for (int i = 0; i &lt; results.length; ++i) {<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>          Object o = results[i];<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          error.append(((o == null) ? "null" : o.toString())).append(", ");<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>        }<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>      }<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      return error.toString();<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    }<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span><a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    @Override<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    public void waitUntilDone() throws InterruptedIOException {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      try {<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>        waitUntilDone(Long.MAX_VALUE);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>      } catch (InterruptedException iex) {<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        throw new InterruptedIOException(iex.getMessage());<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>      } finally {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>        if (callsInProgress != null) {<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>          for (PayloadCarryingServerCallable clb : callsInProgress) {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>            clb.cancel();<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>          }<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>      }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>    }<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span><a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    private boolean waitUntilDone(long cutoff) throws InterruptedException {<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>      boolean hasWait = cutoff != Long.MAX_VALUE;<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>      long lastLog = EnvironmentEdgeManager.currentTime();<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>      long currentInProgress;<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>      while (0 != (currentInProgress = actionsInProgress.get())) {<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>        long now = EnvironmentEdgeManager.currentTime();<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>        if (hasWait &amp;&amp; (now * 1000L) &gt; cutoff) {<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>          return false;<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>        }<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>        if (!hasWait) { // Only log if wait is infinite.<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>          if (now &gt; lastLog + 10000) {<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>            lastLog = now;<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>            LOG.info("#" + id + ", waiting for " + currentInProgress + "  actions to finish");<a name="line.1645"></a>
+<span class="sourceLineNo">1433</span>      sb.append(" on ").append(sn).append(", tracking started ").append(startTime);<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span><a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      if (willRetry) {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>        sb.append(", retrying after=").append(backOffTime).append("ms").<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>            append(", replay=").append(replaySize).append("ops");<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>      } else if (failureCount &gt; 0) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>        if (stopped &gt; 0) {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>          sb.append("; not retrying ").append(stopped).append(" due to success from other replica");<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        if (failed &gt; 0) {<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>          sb.append("; not retrying ").append(failed).append(" - final failure");<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>        }<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><a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      return sb.toString();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>    }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span><a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>    /**<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>     * Sets the non-error result from a particular action.<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>     * @param action Action (request) that the server responded to.<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>     * @param result The result.<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>     */<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    private void setResult(Action&lt;Row&gt; action, Object result) {<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      if (result == null) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>        throw new RuntimeException("Result cannot be null");<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>      ReplicaResultState state = null;<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>      boolean isStale = !RegionReplicaUtil.isDefaultReplica(action.getReplicaId());<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      int index = action.getOriginalIndex();<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>      if (results == null) {<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>        decActionCounter(index);<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>        return; // Simple case, no replica requests.<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>      }<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>      state = trySetResultSimple(index, action.getAction(), false, result, null, isStale);<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      if (state == null) {<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>        return; // Simple case, no replica requests.<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>      }<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>      // At this point we know that state is set to replica tracking class.<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>      // It could be that someone else is also looking at it; however, we know there can<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      // only be one state object, and only one thread can set callCount to 0. Other threads<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      // will either see state with callCount 0 after locking it; or will not see state at all<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>      // we will replace it with the result.<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>      synchronized (state) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>        if (state.callCount == 0) {<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>          return; // someone already set the result<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>        state.callCount = 0;<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      }<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      synchronized (replicaResultLock) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>        if (results[index] != state) {<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>          throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>        }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>        results[index] = result;<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>      decActionCounter(index);<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    }<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span><a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    /**<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>     * Sets the error from a particular action.<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>     * @param index Original action index.<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>     * @param row Original request.<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>     * @param throwable The resulting error.<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>     * @param server The source server.<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>     */<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    private void setError(int index, Row row, Throwable throwable, ServerName server) {<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      ReplicaResultState state = null;<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>      if (results == null) {<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>        // Note that we currently cannot have replica requests with null results. So it shouldn't<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>        // happen that multiple replica calls will call dAC for same actions with results == null.<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>        // Only one call per action should be present in this case.<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>        errors.add(throwable, row, server);<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>        decActionCounter(index);<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>        return; // Simple case, no replica requests.<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>      }<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>      state = trySetResultSimple(index, row, true, throwable, server, false);<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      if (state == null) {<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>        return; // Simple case, no replica requests.<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>      }<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      BatchErrors target = null; // Error will be added to final errors, or temp replica errors.<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>      boolean isActionDone = false;<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>      synchronized (state) {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>        switch (state.callCount) {<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>          case 0: return; // someone already set the result<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>          case 1: { // All calls failed, we are the last error.<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>            target = errors;<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>            isActionDone = true;<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>            break;<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>          }<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          default: {<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>            assert state.callCount &gt; 1;<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>            if (state.replicaErrors == null) {<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>              state.replicaErrors = new BatchErrors();<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>            }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>            target = state.replicaErrors;<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>            break;<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>          }<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>        }<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>        --state.callCount;<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>      }<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span>      target.add(throwable, row, server);<a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>      if (isActionDone) {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>        if (state.replicaErrors != null) { // last call, no need to lock<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>          errors.merge(state.replicaErrors);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>        }<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>        // See setResult for explanations.<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>        synchronized (replicaResultLock) {<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>          if (results[index] != state) {<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>            throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>          }<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>          results[index] = throwable;<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>        }<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>        decActionCounter(index);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>      }<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>    }<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span><a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>    /**<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>     * Checks if the action is complete; used on error to prevent needless retries.<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>     * Does not synchronize, assuming element index/field accesses are atomic.<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>     * This is an opportunistic optimization check, doesn't have to be strict.<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>     * @param index Original action index.<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>     * @param row Original request.<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>     */<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    private boolean isActionComplete(int index, Row row) {<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>      if (!isReplicaGet(row)) return false;<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>      Object resObj = results[index];<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>      return (resObj != null) &amp;&amp; (!(resObj instanceof ReplicaResultState)<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>          || ((ReplicaResultState)resObj).callCount == 0);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    }<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span><a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>    /**<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>     * Tries to set the result or error for a particular action as if there were no replica calls.<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>     * @return null if successful; replica state if there were in fact replica calls.<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>     */<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>    private ReplicaResultState trySetResultSimple(int index, Row row, boolean isError,<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>        Object result, ServerName server, boolean isFromReplica) {<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>      Object resObj = null;<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      if (!isReplicaGet(row)) {<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>        if (isFromReplica) {<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>          throw new AssertionError("Unexpected stale result for " + row);<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>        }<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>        results[index] = result;<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>      } else {<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>        synchronized (replicaResultLock) {<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>          resObj = results[index];<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>          if (resObj == null) {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>            if (isFromReplica) {<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>              throw new AssertionError("Unexpected stale result for " + row);<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>            }<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>            results[index] = result;<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>          }<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>        }<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>      }<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span><a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>      ReplicaResultState rrs =<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>          (resObj instanceof ReplicaResultState) ? (ReplicaResultState)resObj : null;<a name

<TRUNCATED>

[08/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer1.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer1.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer1.html
index 1f46d03..8d76e1e 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer1.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer1.html
@@ -65,367 +65,366 @@
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.io.compress.GzipCodec;<a name="line.58"></a>
 <span class="sourceLineNo">059</span>import org.apache.hadoop.util.StringUtils;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.http.ConnectionClosedException;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.Assert;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.junit.Test;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>import com.google.common.collect.ImmutableList;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import com.google.common.collect.Lists;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import com.google.protobuf.BlockingRpcChannel;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import com.google.protobuf.BlockingService;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import com.google.protobuf.Message;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import com.google.protobuf.RpcController;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import com.google.protobuf.ServiceException;<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> * Some basic ipc tests.<a name="line.74"></a>
-<span class="sourceLineNo">075</span> */<a name="line.75"></a>
-<span class="sourceLineNo">076</span>public abstract class AbstractTestIPC {<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private static final Log LOG = LogFactory.getLog(AbstractTestIPC.class);<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private static byte[] CELL_BYTES = Bytes.toBytes("xyz");<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  private static KeyValue CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, CELL_BYTES);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  static byte[] BIG_CELL_BYTES = new byte[10 * 1024];<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  static KeyValue BIG_CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, BIG_CELL_BYTES);<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  static final Configuration CONF = HBaseConfiguration.create();<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  // We are using the test TestRpcServiceProtos generated classes and Service because they are<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  // available and basic with methods like 'echo', and ping. Below we make a blocking service<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  // by passing in implementation of blocking interface. We use this service in all tests that<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  // follow.<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  static final BlockingService SERVICE =<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      TestRpcServiceProtos.TestProtobufRpcProto<a name="line.90"></a>
-<span class="sourceLineNo">091</span>          .newReflectiveBlockingService(new TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface() {<a name="line.91"></a>
-<span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>            @Override<a name="line.93"></a>
-<span class="sourceLineNo">094</span>            public EmptyResponseProto ping(RpcController controller, EmptyRequestProto request)<a name="line.94"></a>
-<span class="sourceLineNo">095</span>                throws ServiceException {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>              return null;<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>            @Override<a name="line.99"></a>
-<span class="sourceLineNo">100</span>            public EmptyResponseProto error(RpcController controller, EmptyRequestProto request)<a name="line.100"></a>
-<span class="sourceLineNo">101</span>                throws ServiceException {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>              return null;<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>            @Override<a name="line.105"></a>
-<span class="sourceLineNo">106</span>            public EchoResponseProto echo(RpcController controller, EchoRequestProto request)<a name="line.106"></a>
-<span class="sourceLineNo">107</span>                throws ServiceException {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>              if (controller instanceof PayloadCarryingRpcController) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>                PayloadCarryingRpcController pcrc = (PayloadCarryingRpcController) controller;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>                // If cells, scan them to check we are able to iterate what we were given and since<a name="line.110"></a>
-<span class="sourceLineNo">111</span>                // this is<a name="line.111"></a>
-<span class="sourceLineNo">112</span>                // an echo, just put them back on the controller creating a new block. Tests our<a name="line.112"></a>
-<span class="sourceLineNo">113</span>                // block<a name="line.113"></a>
-<span class="sourceLineNo">114</span>                // building.<a name="line.114"></a>
-<span class="sourceLineNo">115</span>                CellScanner cellScanner = pcrc.cellScanner();<a name="line.115"></a>
-<span class="sourceLineNo">116</span>                List&lt;Cell&gt; list = null;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>                if (cellScanner != null) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>                  list = new ArrayList&lt;Cell&gt;();<a name="line.118"></a>
-<span class="sourceLineNo">119</span>                  try {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>                    while (cellScanner.advance()) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>                      list.add(cellScanner.current());<a name="line.121"></a>
-<span class="sourceLineNo">122</span>                    }<a name="line.122"></a>
-<span class="sourceLineNo">123</span>                  } catch (IOException e) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>                    throw new ServiceException(e);<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>                cellScanner = CellUtil.createCellScanner(list);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>                ((PayloadCarryingRpcController) controller).setCellScanner(cellScanner);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>              }<a name="line.129"></a>
-<span class="sourceLineNo">130</span>              return EchoResponseProto.newBuilder().setMessage(request.getMessage()).build();<a name="line.130"></a>
-<span class="sourceLineNo">131</span>            }<a name="line.131"></a>
-<span class="sourceLineNo">132</span>          });<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  /**<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   * Instance of server. We actually don't do anything speical in here so could just use<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * HBaseRpcServer directly.<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   */<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  static class TestRpcServer extends RpcServer {<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    TestRpcServer() throws IOException {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      this(new FifoRpcScheduler(CONF, 1), CONF);<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>    TestRpcServer(Configuration conf) throws IOException {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      this(new FifoRpcScheduler(conf, 1), conf);<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>    TestRpcServer(RpcScheduler scheduler, Configuration conf) throws IOException {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      super(null, "testRpcServer", Lists<a name="line.149"></a>
-<span class="sourceLineNo">150</span>          .newArrayList(new BlockingServiceAndInterface(SERVICE, null)), new InetSocketAddress(<a name="line.150"></a>
-<span class="sourceLineNo">151</span>          "localhost", 0), conf, scheduler);<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<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    public Pair&lt;Message, CellScanner&gt; call(BlockingService service, MethodDescriptor md,<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        Message param, CellScanner cellScanner, long receiveTime, MonitoredRPCHandler status)<a name="line.156"></a>
-<span class="sourceLineNo">157</span>        throws IOException {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      return super.call(service, md, param, cellScanner, receiveTime, status);<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><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  protected abstract AbstractRpcClient createRpcClientNoCodec(Configuration conf);<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>   * Ensure we do not HAVE TO HAVE a codec.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @throws InterruptedException<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @throws IOException<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  @Test<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public void testNoCodec() throws InterruptedException, IOException {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    Configuration conf = HBaseConfiguration.create();<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    AbstractRpcClient client = createRpcClientNoCodec(conf);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    TestRpcServer rpcServer = new TestRpcServer();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    try {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      rpcServer.start();<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      final String message = "hello";<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(message).build();<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      if (address == null) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        throw new IOException("Listener channel is closed");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      Pair&lt;Message, CellScanner&gt; r =<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          client.call(null, md, param, md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.184"></a>
-<span class="sourceLineNo">185</span>              new MetricsConnection.CallStats());<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      assertTrue(r.getSecond() == null);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      // Silly assertion that the message is in the returned pb.<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      assertTrue(r.getFirst().toString().contains(message));<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    } finally {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      client.close();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      rpcServer.stop();<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>  protected abstract AbstractRpcClient createRpcClient(Configuration conf);<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>  /**<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * It is hard to verify the compression is actually happening under the wraps. Hope that if<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * unsupported, we'll get an exception out of some time (meantime, have to trace it manually to<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * confirm that compression is happening down in the client and server).<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   * @throws IOException<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   * @throws InterruptedException<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   * @throws SecurityException<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   * @throws NoSuchMethodException<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   */<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  @Test<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  public void testCompressCellBlock() throws IOException, InterruptedException, SecurityException,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      NoSuchMethodException, ServiceException {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    Configuration conf = new Configuration(HBaseConfiguration.create());<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    conf.set("hbase.client.rpc.compressor", GzipCodec.class.getCanonicalName());<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    List&lt;Cell&gt; cells = new ArrayList&lt;Cell&gt;();<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    int count = 3;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    for (int i = 0; i &lt; count; i++) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      cells.add(CELL);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    AbstractRpcClient client = createRpcClient(conf);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    TestRpcServer rpcServer = new TestRpcServer();<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    try {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      rpcServer.start();<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      PayloadCarryingRpcController pcrc =<a name="line.222"></a>
-<span class="sourceLineNo">223</span>          new PayloadCarryingRpcController(CellUtil.createCellScanner(cells));<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      if (address == null) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        throw new IOException("Listener channel is closed");<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      }<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      Pair&lt;Message, CellScanner&gt; r =<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          client.call(pcrc, md, param, md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.229"></a>
-<span class="sourceLineNo">230</span>              new MetricsConnection.CallStats());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      int index = 0;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      while (r.getSecond().advance()) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        assertTrue(CELL.equals(r.getSecond().current()));<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        index++;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      }<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      assertEquals(count, index);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    } finally {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      client.close();<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      rpcServer.stop();<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>  protected abstract AbstractRpcClient createRpcClientRTEDuringConnectionSetup(Configuration conf)<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      throws IOException;<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Test<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  public void testRTEDuringConnectionSetup() throws Exception {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    Configuration conf = HBaseConfiguration.create();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    TestRpcServer rpcServer = new TestRpcServer();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    AbstractRpcClient client = createRpcClientRTEDuringConnectionSetup(conf);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    try {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      rpcServer.start();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      if (address == null) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        throw new IOException("Listener channel is closed");<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      client.call(null, md, param, null, User.getCurrent(), address,<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          new MetricsConnection.CallStats());<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      fail("Expected an exception to have been thrown!");<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    } catch (Exception e) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      LOG.info("Caught expected exception: " + e.toString());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      assertTrue(StringUtils.stringifyException(e).contains("Injected fault"));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    } finally {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      client.close();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      rpcServer.stop();<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /** Tests that the rpc scheduler is called when requests arrive. */<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  @Test<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  public void testRpcScheduler() throws IOException, InterruptedException {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    RpcScheduler scheduler = spy(new FifoRpcScheduler(CONF, 1));<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    RpcServer rpcServer = new TestRpcServer(scheduler, CONF);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    verify(scheduler).init((RpcScheduler.Context) anyObject());<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    AbstractRpcClient client = createRpcClient(CONF);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    try {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      rpcServer.start();<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      verify(scheduler).start();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      if (address == null) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IOException("Listener channel is closed");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        client.call(new PayloadCarryingRpcController(<a name="line.288"></a>
-<span class="sourceLineNo">289</span>            CellUtil.createCellScanner(ImmutableList.&lt;Cell&gt; of(CELL))), md, param,<a name="line.289"></a>
-<span class="sourceLineNo">290</span>            md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            new MetricsConnection.CallStats());<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      verify(scheduler, times(10)).dispatch((CallRunner) anyObject());<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    } finally {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      rpcServer.stop();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      verify(scheduler).stop();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /** Tests that the rpc scheduler is called when requests arrive. */<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  @Test<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  public void testRpcMaxRequestSize() throws IOException, InterruptedException {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    Configuration conf = new Configuration(CONF);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    conf.setInt(RpcServer.MAX_REQUEST_SIZE, 100);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    RpcServer rpcServer = new TestRpcServer(conf);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    AbstractRpcClient client = createRpcClient(conf);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    try {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      rpcServer.start();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      // set total RPC size bigger than 100 bytes<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello.hello.hello.hello."<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          + "hello.hello.hello.hello.hello.hello.hello.hello.hello.hello.hello.hello").build();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      if (address == null) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        throw new IOException("Listener channel is closed");<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      }<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      try {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>        client.call(new PayloadCarryingRpcController(<a name="line.318"></a>
-<span class="sourceLineNo">319</span>          CellUtil.createCellScanner(ImmutableList.&lt;Cell&gt; of(CELL))), md, param,<a name="line.319"></a>
-<span class="sourceLineNo">320</span>          md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.320"></a>
-<span class="sourceLineNo">321</span>          new MetricsConnection.CallStats());<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        fail("RPC should have failed because it exceeds max request size");<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      } catch(ConnectionClosingException | ConnectionClosedException ex) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        // pass<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    } finally {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      rpcServer.stop();<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">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /**<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * Instance of RpcServer that echoes client hostAddress back to client<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   */<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  static class TestRpcServer1 extends RpcServer {<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    private static BlockingInterface SERVICE1 =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        new TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface() {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          @Override<a name="line.338"></a>
-<span class="sourceLineNo">339</span>          public EmptyResponseProto ping(RpcController unused, EmptyRequestProto request)<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              throws ServiceException {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>            return EmptyResponseProto.newBuilder().build();<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>          @Override<a name="line.344"></a>
-<span class="sourceLineNo">345</span>          public EchoResponseProto echo(RpcController unused, EchoRequestProto request)<a name="line.345"></a>
-<span class="sourceLineNo">346</span>              throws ServiceException {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>            final InetAddress remoteAddr = TestRpcServer1.getRemoteAddress();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>            final String message = remoteAddr == null ? "NULL" : remoteAddr.getHostAddress();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>            return EchoResponseProto.newBuilder().setMessage(message).build();<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>          @Override<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          public EmptyResponseProto error(RpcController unused, EmptyRequestProto request)<a name="line.353"></a>
-<span class="sourceLineNo">354</span>              throws ServiceException {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>            throw new ServiceException("error", new IOException("error"));<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        };<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>    TestRpcServer1() throws IOException {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      this(new FifoRpcScheduler(CONF, 1));<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    TestRpcServer1(RpcScheduler scheduler) throws IOException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      super(null, "testRemoteAddressInCallObject", Lists<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          .newArrayList(new BlockingServiceAndInterface(TestRpcServiceProtos.TestProtobufRpcProto<a name="line.365"></a>
-<span class="sourceLineNo">366</span>              .newReflectiveBlockingService(SERVICE1), null)),<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          new InetSocketAddress("localhost", 0), CONF, scheduler);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>  }<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>  /**<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * Tests that the RpcServer creates &amp; dispatches CallRunner object to scheduler with non-null<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * remoteAddress set to its Call Object<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @throws ServiceException<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   */<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  public void testRpcServerForNotNullRemoteAddressInCallObject() throws IOException,<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      ServiceException {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final RpcScheduler scheduler = new FifoRpcScheduler(CONF, 1);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final TestRpcServer1 rpcServer = new TestRpcServer1(scheduler);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    final InetSocketAddress localAddr = new InetSocketAddress("localhost", 0);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    final AbstractRpcClient client =<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        new RpcClientImpl(CONF, HConstants.CLUSTER_ID_DEFAULT, localAddr, null);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    try {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      rpcServer.start();<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      final InetSocketAddress isa = rpcServer.getListenerAddress();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      if (isa == null) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        throw new IOException("Listener channel is closed");<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      final BlockingRpcChannel channel =<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          client.createBlockingRpcChannel(<a name="line.391"></a>
-<span class="sourceLineNo">392</span>            ServerName.valueOf(isa.getHostName(), isa.getPort(), System.currentTimeMillis()),<a name="line.392"></a>
-<span class="sourceLineNo">393</span>            User.getCurrent(), 0);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface stub =<a name="line.394"></a>
-<span class="sourceLineNo">395</span>          TestRpcServiceProtos.TestProtobufRpcProto.newBlockingStub(channel);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      final EchoRequestProto echoRequest =<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          EchoRequestProto.newBuilder().setMessage("GetRemoteAddress").build();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      final EchoResponseProto echoResponse = stub.echo(null, echoRequest);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      Assert.assertEquals(localAddr.getAddress().getHostAddress(), echoResponse.getMessage());<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    } finally {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      client.close();<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      rpcServer.stop();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
-<span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  @Test<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  public void testWrapException() throws Exception {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    AbstractRpcClient client =<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        (AbstractRpcClient) RpcClientFactory.createClient(CONF, "AbstractTestIPC");<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    final InetSocketAddress address = InetSocketAddress.createUnresolved("localhost", 0);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    assertTrue(client.wrapException(address, new ConnectException()) instanceof ConnectException);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    assertTrue(client.wrapException(address,<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      new SocketTimeoutException()) instanceof SocketTimeoutException);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    assertTrue(client.wrapException(address, new ConnectionClosingException(<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        "Test AbstractRpcClient#wrapException")) instanceof ConnectionClosingException);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    assertTrue(client<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        .wrapException(address, new CallTimeoutException("Test AbstractRpcClient#wrapException"))<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        .getCause() instanceof CallTimeoutException);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>}<a name="line.420"></a>
+<span class="sourceLineNo">060</span>import org.junit.Assert;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.junit.Test;<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>import com.google.common.collect.ImmutableList;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import com.google.common.collect.Lists;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import com.google.protobuf.BlockingRpcChannel;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import com.google.protobuf.BlockingService;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import com.google.protobuf.Message;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import com.google.protobuf.RpcController;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import com.google.protobuf.ServiceException;<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>/**<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * Some basic ipc tests.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>public abstract class AbstractTestIPC {<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private static final Log LOG = LogFactory.getLog(AbstractTestIPC.class);<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private static byte[] CELL_BYTES = Bytes.toBytes("xyz");<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private static KeyValue CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, CELL_BYTES);<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  static byte[] BIG_CELL_BYTES = new byte[10 * 1024];<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  static KeyValue BIG_CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, BIG_CELL_BYTES);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  static final Configuration CONF = HBaseConfiguration.create();<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  // We are using the test TestRpcServiceProtos generated classes and Service because they are<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  // available and basic with methods like 'echo', and ping. Below we make a blocking service<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  // by passing in implementation of blocking interface. We use this service in all tests that<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  // follow.<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  static final BlockingService SERVICE =<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      TestRpcServiceProtos.TestProtobufRpcProto<a name="line.89"></a>
+<span class="sourceLineNo">090</span>          .newReflectiveBlockingService(new TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface() {<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>            @Override<a name="line.92"></a>
+<span class="sourceLineNo">093</span>            public EmptyResponseProto ping(RpcController controller, EmptyRequestProto request)<a name="line.93"></a>
+<span class="sourceLineNo">094</span>                throws ServiceException {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>              return null;<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>            @Override<a name="line.98"></a>
+<span class="sourceLineNo">099</span>            public EmptyResponseProto error(RpcController controller, EmptyRequestProto request)<a name="line.99"></a>
+<span class="sourceLineNo">100</span>                throws ServiceException {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>              return null;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>            }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>            @Override<a name="line.104"></a>
+<span class="sourceLineNo">105</span>            public EchoResponseProto echo(RpcController controller, EchoRequestProto request)<a name="line.105"></a>
+<span class="sourceLineNo">106</span>                throws ServiceException {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>              if (controller instanceof PayloadCarryingRpcController) {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>                PayloadCarryingRpcController pcrc = (PayloadCarryingRpcController) controller;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>                // If cells, scan them to check we are able to iterate what we were given and since<a name="line.109"></a>
+<span class="sourceLineNo">110</span>                // this is<a name="line.110"></a>
+<span class="sourceLineNo">111</span>                // an echo, just put them back on the controller creating a new block. Tests our<a name="line.111"></a>
+<span class="sourceLineNo">112</span>                // block<a name="line.112"></a>
+<span class="sourceLineNo">113</span>                // building.<a name="line.113"></a>
+<span class="sourceLineNo">114</span>                CellScanner cellScanner = pcrc.cellScanner();<a name="line.114"></a>
+<span class="sourceLineNo">115</span>                List&lt;Cell&gt; list = null;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>                if (cellScanner != null) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>                  list = new ArrayList&lt;Cell&gt;();<a name="line.117"></a>
+<span class="sourceLineNo">118</span>                  try {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>                    while (cellScanner.advance()) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>                      list.add(cellScanner.current());<a name="line.120"></a>
+<span class="sourceLineNo">121</span>                    }<a name="line.121"></a>
+<span class="sourceLineNo">122</span>                  } catch (IOException e) {<a name="line.122"></a>
+<span class="sourceLineNo">123</span>                    throw new ServiceException(e);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>                  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>                }<a name="line.125"></a>
+<span class="sourceLineNo">126</span>                cellScanner = CellUtil.createCellScanner(list);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>                ((PayloadCarryingRpcController) controller).setCellScanner(cellScanner);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>              }<a name="line.128"></a>
+<span class="sourceLineNo">129</span>              return EchoResponseProto.newBuilder().setMessage(request.getMessage()).build();<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>  /**<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * Instance of server. We actually don't do anything speical in here so could just use<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   * HBaseRpcServer directly.<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   */<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static class TestRpcServer extends RpcServer {<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>    TestRpcServer() throws IOException {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      this(new FifoRpcScheduler(CONF, 1), CONF);<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>    TestRpcServer(Configuration conf) throws IOException {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      this(new FifoRpcScheduler(conf, 1), conf);<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>    TestRpcServer(RpcScheduler scheduler, Configuration conf) throws IOException {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      super(null, "testRpcServer", Lists<a name="line.148"></a>
+<span class="sourceLineNo">149</span>          .newArrayList(new BlockingServiceAndInterface(SERVICE, null)), new InetSocketAddress(<a name="line.149"></a>
+<span class="sourceLineNo">150</span>          "localhost", 0), conf, scheduler);<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>    @Override<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    public Pair&lt;Message, CellScanner&gt; call(BlockingService service, MethodDescriptor md,<a name="line.154"></a>
+<span class="sourceLineNo">155</span>        Message param, CellScanner cellScanner, long receiveTime, MonitoredRPCHandler status)<a name="line.155"></a>
+<span class="sourceLineNo">156</span>        throws IOException {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      return super.call(service, md, param, cellScanner, receiveTime, status);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    }<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>  protected abstract AbstractRpcClient createRpcClientNoCodec(Configuration conf);<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>   * Ensure we do not HAVE TO HAVE a codec.<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   * @throws InterruptedException<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * @throws IOException<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   */<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  @Test<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public void testNoCodec() throws InterruptedException, IOException {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    Configuration conf = HBaseConfiguration.create();<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    AbstractRpcClient client = createRpcClientNoCodec(conf);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    TestRpcServer rpcServer = new TestRpcServer();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    try {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      rpcServer.start();<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      final String message = "hello";<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(message).build();<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      if (address == null) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        throw new IOException("Listener channel is closed");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      }<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      Pair&lt;Message, CellScanner&gt; r =<a name="line.182"></a>
+<span class="sourceLineNo">183</span>          client.call(null, md, param, md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.183"></a>
+<span class="sourceLineNo">184</span>              new MetricsConnection.CallStats());<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      assertTrue(r.getSecond() == null);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      // Silly assertion that the message is in the returned pb.<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      assertTrue(r.getFirst().toString().contains(message));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    } finally {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      client.close();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      rpcServer.stop();<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    }<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>  protected abstract AbstractRpcClient createRpcClient(Configuration conf);<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>  /**<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * It is hard to verify the compression is actually happening under the wraps. Hope that if<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * unsupported, we'll get an exception out of some time (meantime, have to trace it manually to<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * confirm that compression is happening down in the client and server).<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * @throws IOException<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * @throws InterruptedException<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * @throws SecurityException<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * @throws NoSuchMethodException<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  @Test<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  public void testCompressCellBlock() throws IOException, InterruptedException, SecurityException,<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      NoSuchMethodException, ServiceException {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    Configuration conf = new Configuration(HBaseConfiguration.create());<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    conf.set("hbase.client.rpc.compressor", GzipCodec.class.getCanonicalName());<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    List&lt;Cell&gt; cells = new ArrayList&lt;Cell&gt;();<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    int count = 3;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    for (int i = 0; i &lt; count; i++) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      cells.add(CELL);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    }<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    AbstractRpcClient client = createRpcClient(conf);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    TestRpcServer rpcServer = new TestRpcServer();<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    try {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      rpcServer.start();<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      PayloadCarryingRpcController pcrc =<a name="line.221"></a>
+<span class="sourceLineNo">222</span>          new PayloadCarryingRpcController(CellUtil.createCellScanner(cells));<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      if (address == null) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        throw new IOException("Listener channel is closed");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      Pair&lt;Message, CellScanner&gt; r =<a name="line.227"></a>
+<span class="sourceLineNo">228</span>          client.call(pcrc, md, param, md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>              new MetricsConnection.CallStats());<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      int index = 0;<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      while (r.getSecond().advance()) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        assertTrue(CELL.equals(r.getSecond().current()));<a name="line.232"></a>
+<span class="sourceLineNo">233</span>        index++;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      assertEquals(count, index);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    } finally {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      client.close();<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      rpcServer.stop();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    }<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>  protected abstract AbstractRpcClient createRpcClientRTEDuringConnectionSetup(Configuration conf)<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      throws IOException;<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  @Test<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  public void testRTEDuringConnectionSetup() throws Exception {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    Configuration conf = HBaseConfiguration.create();<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    TestRpcServer rpcServer = new TestRpcServer();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    AbstractRpcClient client = createRpcClientRTEDuringConnectionSetup(conf);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    try {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      rpcServer.start();<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      if (address == null) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        throw new IOException("Listener channel is closed");<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      client.call(null, md, param, null, User.getCurrent(), address,<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          new MetricsConnection.CallStats());<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      fail("Expected an exception to have been thrown!");<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    } catch (Exception e) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      LOG.info("Caught expected exception: " + e.toString());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      assertTrue(StringUtils.stringifyException(e).contains("Injected fault"));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    } finally {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      client.close();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      rpcServer.stop();<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>  /** Tests that the rpc scheduler is called when requests arrive. */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  @Test<a name="line.271"></a>
+<span class="sourceLineNo">272</span>  public void testRpcScheduler() throws IOException, InterruptedException {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    RpcScheduler scheduler = spy(new FifoRpcScheduler(CONF, 1));<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    RpcServer rpcServer = new TestRpcServer(scheduler, CONF);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    verify(scheduler).init((RpcScheduler.Context) anyObject());<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    AbstractRpcClient client = createRpcClient(CONF);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    try {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      rpcServer.start();<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      verify(scheduler).start();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      if (address == null) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        throw new IOException("Listener channel is closed");<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      }<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        client.call(new PayloadCarryingRpcController(<a name="line.287"></a>
+<span class="sourceLineNo">288</span>            CellUtil.createCellScanner(ImmutableList.&lt;Cell&gt; of(CELL))), md, param,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>            md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.289"></a>
+<span class="sourceLineNo">290</span>            new MetricsConnection.CallStats());<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      }<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      verify(scheduler, times(10)).dispatch((CallRunner) anyObject());<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    } finally {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      rpcServer.stop();<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      verify(scheduler).stop();<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><a name="line.298"></a>
+<span class="sourceLineNo">299</span>  /** Tests that the rpc scheduler is called when requests arrive. */<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  @Test<a name="line.300"></a>
+<span class="sourceLineNo">301</span>  public void testRpcMaxRequestSize() throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    Configuration conf = new Configuration(CONF);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    conf.setInt(RpcServer.MAX_REQUEST_SIZE, 100);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    RpcServer rpcServer = new TestRpcServer(conf);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    AbstractRpcClient client = createRpcClient(conf);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    try {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      rpcServer.start();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      // set total RPC size bigger than 100 bytes<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello.hello.hello.hello."<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          + "hello.hello.hello.hello.hello.hello.hello.hello.hello.hello.hello.hello").build();<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      if (address == null) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>        throw new IOException("Listener channel is closed");<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      try {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>        client.call(new PayloadCarryingRpcController(<a name="line.317"></a>
+<span class="sourceLineNo">318</span>          CellUtil.createCellScanner(ImmutableList.&lt;Cell&gt; of(CELL))), md, param,<a name="line.318"></a>
+<span class="sourceLineNo">319</span>          md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.319"></a>
+<span class="sourceLineNo">320</span>          new MetricsConnection.CallStats());<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        fail("RPC should have failed because it exceeds max request size");<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      } catch(IOException ex) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        // pass<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      }<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    } finally {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      rpcServer.stop();<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">330</span>  /**<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * Instance of RpcServer that echoes client hostAddress back to client<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   */<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  static class TestRpcServer1 extends RpcServer {<a name="line.333"></a>
+<span class="sourceLineNo">334</span><a name="line.334"></a>
+<span class="sourceLineNo">335</span>    private static BlockingInterface SERVICE1 =<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        new TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface() {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          @Override<a name="line.337"></a>
+<span class="sourceLineNo">338</span>          public EmptyResponseProto ping(RpcController unused, EmptyRequestProto request)<a name="line.338"></a>
+<span class="sourceLineNo">339</span>              throws ServiceException {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>            return EmptyResponseProto.newBuilder().build();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>          }<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>          @Override<a name="line.343"></a>
+<span class="sourceLineNo">344</span>          public EchoResponseProto echo(RpcController unused, EchoRequestProto request)<a name="line.344"></a>
+<span class="sourceLineNo">345</span>              throws ServiceException {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>            final InetAddress remoteAddr = TestRpcServer1.getRemoteAddress();<a name="line.346"></a>
+<span class="sourceLineNo">347</span>            final String message = remoteAddr == null ? "NULL" : remoteAddr.getHostAddress();<a name="line.347"></a>
+<span class="sourceLineNo">348</span>            return EchoResponseProto.newBuilder().setMessage(message).build();<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 EmptyResponseProto error(RpcController unused, EmptyRequestProto request)<a name="line.352"></a>
+<span class="sourceLineNo">353</span>              throws ServiceException {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>            throw new ServiceException("error", new IOException("error"));<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><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    TestRpcServer1() throws IOException {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      this(new FifoRpcScheduler(CONF, 1));<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    TestRpcServer1(RpcScheduler scheduler) throws IOException {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      super(null, "testRemoteAddressInCallObject", Lists<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          .newArrayList(new BlockingServiceAndInterface(TestRpcServiceProtos.TestProtobufRpcProto<a name="line.364"></a>
+<span class="sourceLineNo">365</span>              .newReflectiveBlockingService(SERVICE1), null)),<a name="line.365"></a>
+<span class="sourceLineNo">366</span>          new InetSocketAddress("localhost", 0), CONF, scheduler);<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><a name="line.369"></a>
+<span class="sourceLineNo">370</span>  /**<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   * Tests that the RpcServer creates &amp; dispatches CallRunner object to scheduler with non-null<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   * remoteAddress set to its Call Object<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   * @throws ServiceException<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   */<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  @Test<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  public void testRpcServerForNotNullRemoteAddressInCallObject() throws IOException,<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      ServiceException {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    final RpcScheduler scheduler = new FifoRpcScheduler(CONF, 1);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    final TestRpcServer1 rpcServer = new TestRpcServer1(scheduler);<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    final InetSocketAddress localAddr = new InetSocketAddress("localhost", 0);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    final AbstractRpcClient client =<a name="line.381"></a>
+<span class="sourceLineNo">382</span>        new RpcClientImpl(CONF, HConstants.CLUSTER_ID_DEFAULT, localAddr, null);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    try {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      rpcServer.start();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      final InetSocketAddress isa = rpcServer.getListenerAddress();<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      if (isa == null) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        throw new IOException("Listener channel is closed");<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      final BlockingRpcChannel channel =<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          client.createBlockingRpcChannel(<a name="line.390"></a>
+<span class="sourceLineNo">391</span>            ServerName.valueOf(isa.getHostName(), isa.getPort(), System.currentTimeMillis()),<a name="line.391"></a>
+<span class="sourceLineNo">392</span>            User.getCurrent(), 0);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface stub =<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          TestRpcServiceProtos.TestProtobufRpcProto.newBlockingStub(channel);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      final EchoRequestProto echoRequest =<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          EchoRequestProto.newBuilder().setMessage("GetRemoteAddress").build();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      final EchoResponseProto echoResponse = stub.echo(null, echoRequest);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      Assert.assertEquals(localAddr.getAddress().getHostAddress(), echoResponse.getMessage());<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    } finally {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      client.close();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      rpcServer.stop();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
+<span class="sourceLineNo">404</span><a name="line.404"></a>
+<span class="sourceLineNo">405</span>  @Test<a name="line.405"></a>
+<span class="sourceLineNo">406</span>  public void testWrapException() throws Exception {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    AbstractRpcClient client =<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        (AbstractRpcClient) RpcClientFactory.createClient(CONF, "AbstractTestIPC");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    final InetSocketAddress address = InetSocketAddress.createUnresolved("localhost", 0);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    assertTrue(client.wrapException(address, new ConnectException()) instanceof ConnectException);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    assertTrue(client.wrapException(address,<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      new SocketTimeoutException()) instanceof SocketTimeoutException);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    assertTrue(client.wrapException(address, new ConnectionClosingException(<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        "Test AbstractRpcClient#wrapException")) instanceof ConnectionClosingException);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    assertTrue(client<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        .wrapException(address, new CallTimeoutException("Test AbstractRpcClient#wrapException"))<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        .getCause() instanceof CallTimeoutException);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>  }<a name="line.418"></a>
+<span class="sourceLineNo">419</span>}<a name="line.419"></a>
 
 
 


[38/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html
index ed7bc7f..e65df71 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.html
@@ -1198,681 +1198,699 @@
 <span class="sourceLineNo">1190</span>        byte[] row = e.getValue().iterator().next().getAction().getRow();<a name="line.1190"></a>
 <span class="sourceLineNo">1191</span>        // Do not use the exception for updating cache because it might be coming from<a name="line.1191"></a>
 <span class="sourceLineNo">1192</span>        // any of the regions in the MultiAction.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        if (tableName != null) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>          connection.updateCachedLocations(tableName, regionName, row,<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>              ClientExceptionsUtil.isMetaClearingException(t) ? null : t, server);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>        for (Action&lt;Row&gt; action : e.getValue()) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          Retry retry = manageError(<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>              action.getOriginalIndex(), action.getAction(), canRetry, t, server);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (retry == Retry.YES) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            toReplay.add(action);<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            ++stopped;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>          } else {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            ++failed;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>          }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>        }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>      }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      if (toReplay.isEmpty()) {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>        logNoResubmit(server, numAttempt, rsActions.size(), t, failed, stopped);<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>      } else {<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        resubmit(server, toReplay, numAttempt, rsActions.size(), t);<a name="line.1213"></a>
+<span class="sourceLineNo">1193</span>        try {<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          if (tableName != null) {<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>            connection.updateCachedLocations(tableName, regionName, row,<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>              ClientExceptionsUtil.isMetaClearingException(t) ? null : t, server);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>          }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        } catch (Throwable ex) {<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>          // That should never happen, but if it did, we want to make sure<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          // we still process errors<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>          LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        for (Action&lt;Row&gt; action : e.getValue()) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          Retry retry = manageError(<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              action.getOriginalIndex(), action.getAction(), canRetry, t, server);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>          if (retry == Retry.YES) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>            toReplay.add(action);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>            ++stopped;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>            ++failed;<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
 <span class="sourceLineNo">1214</span>      }<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>     * Log as much info as possible, and, if there is something to replay,<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     * submit it again after a back off sleep.<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>     */<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    private void resubmit(ServerName oldServer, List&lt;Action&lt;Row&gt;&gt; toReplay,<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        int numAttempt, int failureCount, Throwable throwable) {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      // We have something to replay. We're going to sleep a little before.<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // We have two contradicting needs here:<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      //  1) We want to get the new location after having slept, as it may change.<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      //  2) We want to take into account the location when calculating the sleep time.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      //  3) If all this is just because the response needed to be chunked try again FAST.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      // It should be possible to have some heuristics to take the right decision. Short term,<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>      //  we go for one.<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      boolean retryImmediately = throwable instanceof RetryImmediatelyException;<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      int nextAttemptNumber = retryImmediately ? numAttempt : numAttempt + 1;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      long backOffTime = retryImmediately ? 0 :<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          errorsByServer.calculateBackoffTime(oldServer, pause);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>      if (numAttempt &gt; startLogErrorsCnt) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        // We use this value to have some logs when we have multiple failures, but not too many<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        //  logs, as errors are to be expected when a region moves, splits and so on<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        LOG.info(createLog(numAttempt, failureCount, toReplay.size(),<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>            oldServer, throwable, backOffTime, true, null, -1, -1));<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      try {<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>        if (backOffTime &gt; 0) {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>          Thread.sleep(backOffTime);<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>        }<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      } catch (InterruptedException e) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>        LOG.warn("#" + id + ", not sent: " + toReplay.size() + " operations, " + oldServer, e);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>        Thread.currentThread().interrupt();<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        return;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>      groupAndSendMultiAction(toReplay, nextAttemptNumber);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    private void logNoResubmit(ServerName oldServer, int numAttempt,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        int failureCount, Throwable throwable, int failed, int stopped) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      if (failureCount != 0 || numAttempt &gt; startLogErrorsCnt + 1) {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>        String timeStr = new Date(errorsByServer.getStartTrackingTime()).toString();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>        String logMessage = createLog(numAttempt, failureCount, 0, oldServer,<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>            throwable, -1, false, timeStr, failed, stopped);<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>        if (failed != 0) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>          // Only log final failures as warning<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>          LOG.warn(logMessage);<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        } else {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>          LOG.info(logMessage);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>        }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    }<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    /**<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>     * Called when we receive the result of a server query.<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>     *<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>     * @param multiAction    - the multiAction we sent<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>     * @param server       - the location. It's used as a server name.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>     * @param responses      - the response, if any<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>     * @param numAttempt     - the attempt<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>     */<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    private void receiveMultiAction(MultiAction&lt;Row&gt; multiAction,<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>        ServerName server, MultiResponse responses, int numAttempt) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>       assert responses != null;<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span><a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      // Success or partial success<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      // Analyze detailed results. We can still have individual failures to be redo.<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      // two specific throwables are managed:<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      //  - DoNotRetryIOException: we continue to retry for other actions<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      //  - RegionMovedException: we update the cache with the new region location<a name="line.1286"></a>
+<span class="sourceLineNo">1215</span><a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      if (toReplay.isEmpty()) {<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>        logNoResubmit(server, numAttempt, rsActions.size(), t, failed, stopped);<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>        resubmit(server, toReplay, numAttempt, rsActions.size(), t);<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    }<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>     * Log as much info as possible, and, if there is something to replay,<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>     * submit it again after a back off sleep.<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    private void resubmit(ServerName oldServer, List&lt;Action&lt;Row&gt;&gt; toReplay,<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        int numAttempt, int failureCount, Throwable throwable) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>      // We have something to replay. We're going to sleep a little before.<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      // We have two contradicting needs here:<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>      //  1) We want to get the new location after having slept, as it may change.<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>      //  2) We want to take into account the location when calculating the sleep time.<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      //  3) If all this is just because the response needed to be chunked try again FAST.<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      // It should be possible to have some heuristics to take the right decision. Short term,<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      //  we go for one.<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      boolean retryImmediately = throwable instanceof RetryImmediatelyException;<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>      int nextAttemptNumber = retryImmediately ? numAttempt : numAttempt + 1;<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      long backOffTime = retryImmediately ? 0 :<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          errorsByServer.calculateBackoffTime(oldServer, pause);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      if (numAttempt &gt; startLogErrorsCnt) {<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>        // We use this value to have some logs when we have multiple failures, but not too many<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>        //  logs, as errors are to be expected when a region moves, splits and so on<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>        LOG.info(createLog(numAttempt, failureCount, toReplay.size(),<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>            oldServer, throwable, backOffTime, true, null, -1, -1));<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      }<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span><a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      try {<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>        if (backOffTime &gt; 0) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>          Thread.sleep(backOffTime);<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>        }<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      } catch (InterruptedException e) {<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>        LOG.warn("#" + id + ", not sent: " + toReplay.size() + " operations, " + oldServer, e);<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>        Thread.currentThread().interrupt();<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>        return;<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span><a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      groupAndSendMultiAction(toReplay, nextAttemptNumber);<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    private void logNoResubmit(ServerName oldServer, int numAttempt,<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        int failureCount, Throwable throwable, int failed, int stopped) {<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>      if (failureCount != 0 || numAttempt &gt; startLogErrorsCnt + 1) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>        String timeStr = new Date(errorsByServer.getStartTrackingTime()).toString();<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>        String logMessage = createLog(numAttempt, failureCount, 0, oldServer,<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>            throwable, -1, false, timeStr, failed, stopped);<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>        if (failed != 0) {<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          // Only log final failures as warning<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          LOG.warn(logMessage);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>        } else {<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>          LOG.info(logMessage);<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>        }<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    }<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span><a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>    /**<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>     * Called when we receive the result of a server query.<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>     *<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>     * @param multiAction    - the multiAction we sent<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>     * @param server       - the location. It's used as a server name.<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>     * @param responses      - the response, if any<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>     * @param numAttempt     - the attempt<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>     */<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    private void receiveMultiAction(MultiAction&lt;Row&gt; multiAction,<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        ServerName server, MultiResponse responses, int numAttempt) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>       assert responses != null;<a name="line.1286"></a>
 <span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      List&lt;Action&lt;Row&gt;&gt; toReplay = new ArrayList&lt;Action&lt;Row&gt;&gt;();<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      Throwable throwable = null;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      int failureCount = 0;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      boolean canRetry = true;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span><a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      Map&lt;byte[], MultiResponse.RegionResult&gt; results = responses.getResults();<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      updateStats(server, results);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      int failed = 0, stopped = 0;<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      // Go by original action.<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      for (Map.Entry&lt;byte[], List&lt;Action&lt;Row&gt;&gt;&gt; regionEntry : multiAction.actions.entrySet()) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        byte[] regionName = regionEntry.getKey();<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>        Map&lt;Integer, Object&gt; regionResults = results.get(regionName) == null<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>            ?  null : results.get(regionName).result;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        if (regionResults == null) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>          if (!responses.getExceptions().containsKey(regionName)) {<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>            LOG.error("Server sent us neither results nor exceptions for "<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>                + Bytes.toStringBinary(regionName));<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>            responses.getExceptions().put(regionName, new RuntimeException("Invalid response"));<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>          }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>          continue;<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>        }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>        boolean regionFailureRegistered = false;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>        for (Action&lt;Row&gt; sentAction : regionEntry.getValue()) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>          Object result = regionResults.get(sentAction.getOriginalIndex());<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>          // Failure: retry if it's make sense else update the errors lists<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>          if (result == null || result instanceof Throwable) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>            Row row = sentAction.getAction();<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>            throwable = ClientExceptionsUtil.findException(result);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>            // Register corresponding failures once per server/once per region.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>            if (!regionFailureRegistered) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>              regionFailureRegistered = true;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>              connection.updateCachedLocations(<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>                  tableName, regionName, row.getRow(), result, server);<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>            }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>            if (failureCount == 0) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>              errorsByServer.reportServerError(server);<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>              // We determine canRetry only once for all calls, after reporting server failure.<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>              canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            }<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            ++failureCount;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>            Retry retry = manageError(sentAction.getOriginalIndex(), row,<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>                canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, (Throwable) result, server);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>            if (retry == Retry.YES) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>              toReplay.add(sentAction);<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>            } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>              ++stopped;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>            } else {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>              ++failed;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>            }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>          } else {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>            if (callback != null) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>              try {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>                //noinspection unchecked<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>                // TODO: would callback expect a replica region name if it gets one?<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>                this.callback.update(regionName, sentAction.getAction().getRow(), (CResult) result);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>              } catch (Throwable t) {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>                LOG.error("User callback threw an exception for "<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>                    + Bytes.toStringBinary(regionName) + ", ignoring", t);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>              }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>            }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>            setResult(sentAction, result);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>          }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>        }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      }<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span><a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      // The failures global to a region. We will use for multiAction we sent previously to find the<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      //   actions to replay.<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      for (Map.Entry&lt;byte[], Throwable&gt; throwableEntry : responses.getExceptions().entrySet()) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>        throwable = throwableEntry.getValue();<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>        byte[] region = throwableEntry.getKey();<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        List&lt;Action&lt;Row&gt;&gt; actions = multiAction.actions.get(region);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>        if (actions == null || actions.isEmpty()) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          throw new IllegalStateException("Wrong response for the region: " +<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>              HRegionInfo.encodeRegionName(region));<a name="line.1362"></a>
+<span class="sourceLineNo">1288</span>      // Success or partial success<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>      // Analyze detailed results. We can still have individual failures to be redo.<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      // two specific throwables are managed:<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      //  - DoNotRetryIOException: we continue to retry for other actions<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      //  - RegionMovedException: we update the cache with the new region location<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span><a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      List&lt;Action&lt;Row&gt;&gt; toReplay = new ArrayList&lt;Action&lt;Row&gt;&gt;();<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      Throwable throwable = null;<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      int failureCount = 0;<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      boolean canRetry = true;<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span><a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      Map&lt;byte[], MultiResponse.RegionResult&gt; results = responses.getResults();<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      updateStats(server, results);<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span><a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      int failed = 0, stopped = 0;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>      // Go by original action.<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>      for (Map.Entry&lt;byte[], List&lt;Action&lt;Row&gt;&gt;&gt; regionEntry : multiAction.actions.entrySet()) {<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>        byte[] regionName = regionEntry.getKey();<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>        Map&lt;Integer, Object&gt; regionResults = results.get(regionName) == null<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>            ?  null : results.get(regionName).result;<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>        if (regionResults == null) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>          if (!responses.getExceptions().containsKey(regionName)) {<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>            LOG.error("Server sent us neither results nor exceptions for "<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>                + Bytes.toStringBinary(regionName));<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>            responses.getExceptions().put(regionName, new RuntimeException("Invalid response"));<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>          }<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>          continue;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>        }<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        boolean regionFailureRegistered = false;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        for (Action&lt;Row&gt; sentAction : regionEntry.getValue()) {<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>          Object result = regionResults.get(sentAction.getOriginalIndex());<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>          // Failure: retry if it's make sense else update the errors lists<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>          if (result == null || result instanceof Throwable) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>            Row row = sentAction.getAction();<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>            throwable = ClientExceptionsUtil.findException(result);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>            // Register corresponding failures once per server/once per region.<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>            if (!regionFailureRegistered) {<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>              regionFailureRegistered = true;<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>              try {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>                connection.updateCachedLocations(<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>                  tableName, regionName, row.getRow(), result, server);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>              } catch (Throwable ex) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>                // That should never happen, but if it did, we want to make sure<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>                // we still process errors<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>                LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>              }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>            }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>            if (failureCount == 0) {<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>              errorsByServer.reportServerError(server);<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>              // We determine canRetry only once for all calls, after reporting server failure.<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>              canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>            }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>            ++failureCount;<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>            Retry retry = manageError(sentAction.getOriginalIndex(), row,<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>                canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, (Throwable) result, server);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>            if (retry == Retry.YES) {<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>              toReplay.add(sentAction);<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>            } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>              ++stopped;<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>            } else {<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>              ++failed;<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>            }<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>          } else {<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>            if (callback != null) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>              try {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>                //noinspection unchecked<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>                // TODO: would callback expect a replica region name if it gets one?<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>                this.callback.update(regionName, sentAction.getAction().getRow(), (CResult) result);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>              } catch (Throwable t) {<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>                LOG.error("User callback threw an exception for "<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>                    + Bytes.toStringBinary(regionName) + ", ignoring", t);<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>            setResult(sentAction, result);<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>          }<a name="line.1362"></a>
 <span class="sourceLineNo">1363</span>        }<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        if (failureCount == 0) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>          errorsByServer.reportServerError(server);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>          canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>        }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        if (null == tableName &amp;&amp; ClientExceptionsUtil.isMetaClearingException(throwable)) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>          // For multi-actions, we don't have a table name, but we want to make sure to clear the<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>          // cache in case there were location-related exceptions. We don't to clear the cache<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>          // for every possible exception that comes through, however.<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>          connection.clearCaches(server);<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        } else {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>          connection.updateCachedLocations(<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>              tableName, region, actions.get(0).getAction().getRow(), throwable, server);<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>        }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        failureCount += actions.size();<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span><a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>        for (Action&lt;Row&gt; action : actions) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>          Row row = action.getAction();<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          Retry retry = manageError(action.getOriginalIndex(), row,<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>              canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, throwable, server);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>          if (retry == Retry.YES) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>            toReplay.add(action);<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>            ++stopped;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>          } else {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>            ++failed;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>          }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        }<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (toReplay.isEmpty()) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        logNoResubmit(server, numAttempt, failureCount, throwable, failed, stopped);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      } else {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>        resubmit(server, toReplay, numAttempt, failureCount, throwable);<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    private String createLog(int numAttempt, int failureCount, int replaySize, ServerName sn,<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        Throwable error, long backOffTime, boolean willRetry, String startTime,<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>        int failed, int stopped) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      StringBuilder sb = new StringBuilder();<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      sb.append("#").append(id).append(", table=").append(tableName).append(", ")<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>        .append("attempt=").append(numAttempt)<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>        .append("/").append(numTries).append(" ");<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span><a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      if (failureCount &gt; 0 || error != null){<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>        sb.append("failed=").append(failureCount).append("ops").append(", last exception: ").<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>            append(error == null ? "null" : error);<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>      } else {<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        sb.append("succeeded");<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      }<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span><a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      sb.append(" on ").append(sn).append(", tracking started ").append(startTime);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span><a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      if (willRetry) {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        sb.append(", retrying after=").append(backOffTime).append("ms").<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>            append(", replay=").append(replaySize).append("ops");<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      } else if (failureCount &gt; 0) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        if (stopped &gt; 0) {<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          sb.append("; not retrying ").append(stopped).append(" due to success from other replica");<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>        }<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        if (failed &gt; 0) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          sb.append("; not retrying ").append(failed).append(" - final failure");<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>        }<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span><a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span><a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      return sb.toString();<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
+<span class="sourceLineNo">1364</span>      }<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span><a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      // The failures global to a region. We will use for multiAction we sent previously to find the<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>      //   actions to replay.<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      for (Map.Entry&lt;byte[], Throwable&gt; throwableEntry : responses.getExceptions().entrySet()) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        throwable = throwableEntry.getValue();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>        byte[] region = throwableEntry.getKey();<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>        List&lt;Action&lt;Row&gt;&gt; actions = multiAction.actions.get(region);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>        if (actions == null || actions.isEmpty()) {<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>          throw new IllegalStateException("Wrong response for the region: " +<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>              HRegionInfo.encodeRegionName(region));<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        }<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span><a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        if (failureCount == 0) {<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>          errorsByServer.reportServerError(server);<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>          canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>        }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>        if (null == tableName &amp;&amp; ClientExceptionsUtil.isMetaClearingException(throwable)) {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>          // For multi-actions, we don't have a table name, but we want to make sure to clear the<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>          // cache in case there were location-related exceptions. We don't to clear the cache<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>          // for every possible exception that comes through, however.<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>          connection.clearCaches(server);<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>        } else {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>          try {<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>            connection.updateCachedLocations(<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>              tableName, region, actions.get(0).getAction().getRow(), throwable, server);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          } catch (Throwable ex) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>            // That should never happen, but if it did, we want to make sure<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            // we still process errors<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>            LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          }<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        failureCount += actions.size();<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span><a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>        for (Action&lt;Row&gt; action : actions) {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>          Row row = action.getAction();<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>          Retry retry = manageError(action.getOriginalIndex(), row,<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>              canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, throwable, server);<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>          if (retry == Retry.YES) {<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>            toReplay.add(action);<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>            ++stopped;<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>          } else {<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>            ++failed;<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>          }<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        }<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      }<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>      if (toReplay.isEmpty()) {<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>        logNoResubmit(server, numAttempt, failureCount, throwable, failed, stopped);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>      } else {<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>        resubmit(server, toReplay, numAttempt, failureCount, throwable);<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>      }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span><a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    private String createLog(int numAttempt, int failureCount, int replaySize, ServerName sn,<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>        Throwable error, long backOffTime, boolean willRetry, String startTime,<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>        int failed, int stopped) {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      StringBuilder sb = new StringBuilder();<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>      sb.append("#").append(id).append(", table=").append(tableName).append(", ")<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>        .append("attempt=").append(numAttempt)<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>        .append("/").append(numTries).append(" ");<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span><a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      if (failureCount &gt; 0 || error != null){<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>        sb.append("failed=").append(failureCount).append("ops").append(", last exception: ").<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>            append(error == null ? "null" : error);<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      } else {<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>        sb.append("succeeded");<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>      }<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>     * Sets the non-error result from a particular action.<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>     * @param action Action (request) that the server responded to.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>     * @param result The result.<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>     */<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    private void setResult(Action&lt;Row&gt; action, Object result) {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      if (result == null) {<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        throw new RuntimeException("Result cannot be null");<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      }<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      ReplicaResultState state = null;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      boolean isStale = !RegionReplicaUtil.isDefaultReplica(action.getReplicaId());<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      int index = action.getOriginalIndex();<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      if (results == null) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        decActionCounter(index);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        return; // Simple case, no replica requests.<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      }<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      state = trySetResultSimple(index, action.getAction(), false, result, null, isStale);<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      if (state == null) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        return; // Simple case, no replica requests.<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      // At this point we know that state is set to replica tracking class.<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>      // It could be that someone else is also looking at it; however, we know there can<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      // only be one state object, and only one thread can set callCount to 0. Other threads<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>      // will either see state with callCount 0 after locking it; or will not see state at all<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      // we will replace it with the result.<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      synchronized (state) {<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>        if (state.callCount == 0) {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>          return; // someone already set the result<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>        }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        state.callCount = 0;<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>      }<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>      synchronized (replicaResultLock) {<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>        if (results[index] != state) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>          throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>        }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        results[index] = result;<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>      }<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span><a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      decActionCounter(index);<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    }<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span><a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>    /**<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>     * Sets the error from a particular action.<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>     * @param index Original action index.<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>     * @param row Original request.<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>     * @param throwable The resulting error.<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>     * @param server The source server.<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>     */<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>    private void setError(int index, Row row, Throwable throwable, ServerName server) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      ReplicaResultState state = null;<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>      if (results == null) {<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>        // Note that we currently cannot have replica requests with null results. So it shouldn't<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>        // happen that multiple replica calls will call dAC for same actions with results == null.<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        // Only one call per action should be present in this case.<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        errors.add(throwable, row, server);<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>        decActionCounter(index);<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>        return; // Simple case, no replica requests.<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>      }<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>      state = trySetResultSimple(index, row, true, throwable, server, false);<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>      if (state == null) {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>        return; // Simple case, no replica requests.<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>      }<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>      BatchErrors target = null; // Error will be added to final errors, or temp replica errors.<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      boolean isActionDone = false;<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>      synchronized (state) {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>        switch (state.callCount) {<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>          case 0: return; // someone already set the result<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>          case 1: { // All calls failed, we are the last error.<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>            target = errors;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>            isActionDone = true;<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>            break;<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>          }<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>          default: {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>            assert state.callCount &gt; 1;<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>            if (state.replicaErrors == null) {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>              state.replicaErrors = new BatchErrors();<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>            }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>            target = state.replicaErrors;<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>            break;<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>        --state.callCount;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      target.add(throwable, row, server);<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>      if (isActionDone) {<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        if (state.replicaErrors != null) { // last call, no need to lock<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>          errors.merge(state.replicaErrors);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>        }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>        // See setResult for explanations.<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>        synchronized (replicaResultLock) {<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>          if (results[index] != state) {<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>            throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>          }<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>          results[index] = throwable;<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>        }<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>        decActionCounter(index);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      }<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    }<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span><a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    /**<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>     * Checks if the action is complete; used on error to prevent needless retries.<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>     * Does not synchronize, assuming element index/field accesses are atomic.<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>     * This is an opportunistic optimization check, doesn't have to be strict.<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>     * @param index Original action index.<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>     * @param row Original request.<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>     */<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    private boolean isActionComplete(int index, Row row) {<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      if (!isReplicaGet(row)) return false;<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      Object resObj = results[index];<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      return (resObj != null) &amp;&amp; (!(resObj instanceof ReplicaResultState)<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>          || ((ReplicaResultState)resObj).callCount == 0);<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>     * Tries to set the result or error for a particular action as if there were no replica calls.<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>     * @return null if successful; replica state if there were in fact replica calls.<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>     */<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    private ReplicaResultState trySetResultSimple(int index, Row row, boolean isError,<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>        Object result, ServerName server, boolean isFromReplica) {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      Object resObj = null;<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      if (!isReplicaGet(row)) {<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>        if (isFromReplica) {<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>          throw new AssertionError("Unexpected stale result for " + row);<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        }<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        results[index] = result;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>      } else {<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>        synchronized (replicaResultLock) {<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          resObj = results[index];<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>          if (resObj == null) {<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>            if (isFromReplica) {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>              throw new AssertionError("Unexpected stale result for " + row);<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>            }<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>            results[index] = result;<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>          }<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>        }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>      }<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span><a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>      ReplicaResultState rrs =<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>          (resObj instanceof ReplicaResultState) ? (ReplicaResultState)resObj : null;<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      if (rrs == null &amp;&amp; isError) {<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>        // The resObj is not replica state (null or already set).<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>        errors.add((Throwable)result, row, server);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>      }<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span><a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>      if (resObj == null) {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>        // resObj is null - no replica calls were made.<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>        decActionCounter(index);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>        return null;<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      }<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      return rrs;<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    }<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span><a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    private void decActionCounter(int index) {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>      long actionsRemaining = actionsInProgress.decrementAndGet();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      if (actionsRemaining &lt; 0) {<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>        String error = buildDetailedErrorMsg("Incorrect actions in progress", index);<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>        throw new AssertionError(error);<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      } else if (actionsRemaining == 0) {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>        synchronized (actionsInProgress) {<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>          actionsInProgress.notifyAll();<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>        }<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>      }<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span><a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>    private String buildDetailedErrorMsg(String string, int index) {<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>      StringBuilder error = new StringBuilder(128);<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>      error.append(string).append("; called for ").append(index).append(", actionsInProgress ")<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>          .append(actionsInProgress.get()).append("; replica gets: ");<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>      if (replicaGetIndices != null) {<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>        for (int i = 0; i &lt; replicaGetIndices.length; ++i) {<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>          error.append(replicaGetIndices[i]).append(", ");<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>        }<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>      } else {<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>        error.append(hasAnyReplicaGets ? "all" : "none");<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>      }<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      error.append("; results ");<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      if (results != null) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>        for (int i = 0; i &lt; results.length; ++i) {<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>          Object o = results[i];<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          error.append(((o == null) ? "null" : o.toString())).append(", ");<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>        }<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>      }<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      return error.toString();<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    }<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span><a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    @Override<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    public void waitUntilDone() throws InterruptedIOException {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      try {<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>        waitUntilDone(Long.MAX_VALUE);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>      } catch (InterruptedException iex) {<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        throw new InterruptedIOException(iex.getMessage());<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>      } finally {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>        if (callsInProgress != null) {<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>          for (PayloadCarryingServerCallable clb : callsInProgress) {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>            clb.cancel();<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>          }<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>      }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>    }<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span><a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    private boolean waitUntilDone(long cutoff) throws InterruptedException {<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>      boolean hasWait = cutoff != Long.MAX_VALUE;<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>      long lastLog = EnvironmentEdgeManager.currentTime();<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>      long currentInProgress;<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>      while (0 != (currentInProgress = actionsInProgress.get())) {<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>        long now = EnvironmentEdgeManager.currentTime();<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>        if (hasWait &amp;&amp; (now * 1000L) &gt; cutoff) {<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>          return false;<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>        }<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>        if (!hasWait) { // Only log if wait is infinite.<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>          if (now &gt; lastLog + 10000) {<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>            lastLog = now;<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>            LOG.info("#" + id + ", waiting for " + currentInProgress + "  actions to finish");<a name="line.1645"></a>
+<span class="sourceLineNo">1433</span>      sb.append(" on ").append(sn).append(", tracking started ").append(startTime);<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span><a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      if (willRetry) {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>        sb.append(", retrying after=").append(backOffTime).append("ms").<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>            append(", replay=").append(replaySize).append("ops");<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>      } else if (failureCount &gt; 0) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>        if (stopped &gt; 0) {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>          sb.append("; not retrying ").append(stopped).append(" due to success from other replica");<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        if (failed &gt; 0) {<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>          sb.append("; not retrying ").append(failed).append(" - final failure");<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>        }<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><a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      return sb.toString();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>    }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span><a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>    /**<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>     * Sets the non-error result from a particular action.<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>     * @param action Action (request) that the server responded to.<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>     * @param result The result.<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>     */<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    private void setResult(Action&lt;Row&gt; action, Object result) {<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      if (result == null) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>        throw new RuntimeException("Result cannot be null");<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>      ReplicaResultState state = null;<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>      boolean isStale = !RegionReplicaUtil.isDefaultReplica(action.getReplicaId());<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      int index = action.getOriginalIndex();<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>      if (results == null) {<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>        decActionCounter(index);<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>        return; // Simple case, no replica requests.<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>      }<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>      state = trySetResultSimple(index, action.getAction(), false, result, null, isStale);<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      if (state == null) {<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>        return; // Simple case, no replica requests.<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>      }<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>      // At this point we know that state is set to replica tracking class.<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>      // It could be that someone else is also looking at it; however, we know there can<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      // only be one state object, and only one thread can set callCount to 0. Other threads<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      // will either see state with callCount 0 after locking it; or will not see state at all<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>      // we will replace it with the result.<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>      synchronized (state) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>        if (state.callCount == 0) {<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>          return; // someone already set the result<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>        state.callCount = 0;<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      }<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      synchronized (replicaResultLock) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>        if (results[index] != state) {<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>          throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>        }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>        results[index] = result;<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>      decActionCounter(index);<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    }<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span><a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    /**<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>     * Sets the error from a particular action.<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>     * @param index Original action index.<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>     * @param row Original request.<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>     * @param throwable The resulting error.<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>     * @param server The source server.<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>     */<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    private void setError(int index, Row row, Throwable throwable, ServerName server) {<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      ReplicaResultState state = null;<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>      if (results == null) {<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>        // Note that we currently cannot have replica requests with null results. So it shouldn't<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>        // happen that multiple replica calls will call dAC for same actions with results == null.<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>        // Only one call per action should be present in this case.<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>        errors.add(throwable, row, server);<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>        decActionCounter(index);<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>        return; // Simple case, no replica requests.<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>      }<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>      state = trySetResultSimple(index, row, true, throwable, server, false);<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      if (state == null) {<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>        return; // Simple case, no replica requests.<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>      }<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      BatchErrors target = null; // Error will be added to final errors, or temp replica errors.<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>      boolean isActionDone = false;<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>      synchronized (state) {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>        switch (state.callCount) {<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>          case 0: return; // someone already set the result<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>          case 1: { // All calls failed, we are the last error.<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>            target = errors;<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>            isActionDone = true;<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>            break;<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>          }<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          default: {<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>            assert state.callCount &gt; 1;<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>            if (state.replicaErrors == null) {<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>              state.replicaErrors = new BatchErrors();<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>            }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>            target = state.replicaErrors;<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>            break;<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>          }<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>        }<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>        --state.callCount;<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>      }<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span>      target.add(throwable, row, server);<a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>      if (isActionDone) {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>        if (state.replicaErrors != null) { // last call, no need to lock<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>          errors.merge(state.replicaErrors);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>        }<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>        // See setResult for explanations.<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>        synchronized (replicaResultLock) {<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>          if (results[index] != state) {<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>            throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>          }<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>          results[index] = throwable;<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>        }<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>        decActionCounter(index);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>      }<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>    }<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span><a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>    /**<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>     * Checks if the action is complete; used on error to prevent needless retries.<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>     * Does not synchronize, assuming element index/field accesses are atomic.<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>     * This is an opportunistic optimization check, doesn't have to be strict.<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>     * @param index Original action index.<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>     * @param row Original request.<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>     */<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    private boolean isActionComplete(int index, Row row) {<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>      if (!isReplicaGet(row)) return false;<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>      Object resObj = results[index];<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>      return (resObj != null) &amp;&amp; (!(resObj instanceof ReplicaResultState)<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>          || ((ReplicaResultState)resObj).callCount == 0);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    }<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span><a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>    /**<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>     * Tries to set the result or error for a particular action as if there were no replica calls.<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>     * @return null if successful; replica state if there were in fact replica calls.<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>     */<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>    private ReplicaResultState trySetResultSimple(int index, Row row, boolean isError,<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>        Object result, ServerName server, boolean isFromReplica) {<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>      Object resObj = null;<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      if (!isReplicaGet(row)) {<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>        if (isFromReplica) {<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>          throw new AssertionError("Unexpected stale result for " + row);<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>        }<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>        results[index] = result;<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>      } else {<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>        synchronized (replicaResultLock) {<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>          resObj = results[index];<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>          if (resObj == null) {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>            if (isFromReplica) {<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>              throw new AssertionError("Unexpected stale result for " + row);<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>            }<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>            results[index] = result;<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>          }<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>        }<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>      }<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span><a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>      ReplicaResultState rrs =<a name="line.1588"></a>
+<span class="so

<TRUNCATED>

[23/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html
index 36faa46..ac6b775 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html
@@ -25,111 +25,113 @@
 <span class="sourceLineNo">017</span> */<a name="line.17"></a>
 <span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.ipc;<a name="line.18"></a>
 <span class="sourceLineNo">019</span><a name="line.19"></a>
-<span class="sourceLineNo">020</span>import io.netty.buffer.ByteBuf;<a name="line.20"></a>
-<span class="sourceLineNo">021</span>import io.netty.buffer.ByteBufInputStream;<a name="line.21"></a>
-<span class="sourceLineNo">022</span>import io.netty.channel.ChannelHandlerContext;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import io.netty.channel.ChannelInboundHandlerAdapter;<a name="line.23"></a>
-<span class="sourceLineNo">024</span><a name="line.24"></a>
-<span class="sourceLineNo">025</span>import java.io.IOException;<a name="line.25"></a>
-<span class="sourceLineNo">026</span><a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.CellScanner;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.31"></a>
-<span class="sourceLineNo">032</span><a name="line.32"></a>
-<span class="sourceLineNo">033</span>import com.google.protobuf.Message;<a name="line.33"></a>
+<span class="sourceLineNo">020</span>import java.io.IOException;<a name="line.20"></a>
+<span class="sourceLineNo">021</span><a name="line.21"></a>
+<span class="sourceLineNo">022</span>import org.apache.hadoop.hbase.CellScanner;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import org.apache.hadoop.hbase.classification.InterfaceAudience;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.protobuf.generated.RPCProtos;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.26"></a>
+<span class="sourceLineNo">027</span><a name="line.27"></a>
+<span class="sourceLineNo">028</span>import com.google.protobuf.Message;<a name="line.28"></a>
+<span class="sourceLineNo">029</span><a name="line.29"></a>
+<span class="sourceLineNo">030</span>import io.netty.buffer.ByteBuf;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import io.netty.buffer.ByteBufInputStream;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import io.netty.channel.ChannelHandlerContext;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import io.netty.channel.SimpleChannelInboundHandler;<a name="line.33"></a>
 <span class="sourceLineNo">034</span><a name="line.34"></a>
 <span class="sourceLineNo">035</span>/**<a name="line.35"></a>
 <span class="sourceLineNo">036</span> * Handles Hbase responses<a name="line.36"></a>
 <span class="sourceLineNo">037</span> */<a name="line.37"></a>
 <span class="sourceLineNo">038</span>@InterfaceAudience.Private<a name="line.38"></a>
-<span class="sourceLineNo">039</span>public class AsyncServerResponseHandler extends ChannelInboundHandlerAdapter {<a name="line.39"></a>
+<span class="sourceLineNo">039</span>public class AsyncServerResponseHandler extends SimpleChannelInboundHandler&lt;ByteBuf&gt; {<a name="line.39"></a>
 <span class="sourceLineNo">040</span>  private final AsyncRpcChannel channel;<a name="line.40"></a>
 <span class="sourceLineNo">041</span><a name="line.41"></a>
 <span class="sourceLineNo">042</span>  /**<a name="line.42"></a>
 <span class="sourceLineNo">043</span>   * Constructor<a name="line.43"></a>
-<span class="sourceLineNo">044</span>   *<a name="line.44"></a>
-<span class="sourceLineNo">045</span>   * @param channel on which this response handler operates<a name="line.45"></a>
-<span class="sourceLineNo">046</span>   */<a name="line.46"></a>
-<span class="sourceLineNo">047</span>  public AsyncServerResponseHandler(AsyncRpcChannel channel) {<a name="line.47"></a>
-<span class="sourceLineNo">048</span>    this.channel = channel;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>  }<a name="line.49"></a>
-<span class="sourceLineNo">050</span><a name="line.50"></a>
-<span class="sourceLineNo">051</span>  @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {<a name="line.51"></a>
-<span class="sourceLineNo">052</span>    ByteBuf inBuffer = (ByteBuf) msg;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>    ByteBufInputStream in = new ByteBufInputStream(inBuffer);<a name="line.53"></a>
-<span class="sourceLineNo">054</span>    int totalSize = inBuffer.readableBytes();<a name="line.54"></a>
-<span class="sourceLineNo">055</span>    try {<a name="line.55"></a>
-<span class="sourceLineNo">056</span>      // Read the header<a name="line.56"></a>
-<span class="sourceLineNo">057</span>      RPCProtos.ResponseHeader responseHeader = RPCProtos.ResponseHeader.parseDelimitedFrom(in);<a name="line.57"></a>
-<span class="sourceLineNo">058</span>      int id = responseHeader.getCallId();<a name="line.58"></a>
-<span class="sourceLineNo">059</span>      AsyncCall call = channel.removePendingCall(id);<a name="line.59"></a>
-<span class="sourceLineNo">060</span>      if (call == null) {<a name="line.60"></a>
-<span class="sourceLineNo">061</span>        // So we got a response for which we have no corresponding 'call' here on the client-side.<a name="line.61"></a>
-<span class="sourceLineNo">062</span>        // We probably timed out waiting, cleaned up all references, and now the server decides<a name="line.62"></a>
-<span class="sourceLineNo">063</span>        // to return a response.  There is nothing we can do w/ the response at this stage. Clean<a name="line.63"></a>
-<span class="sourceLineNo">064</span>        // out the wire of the response so its out of the way and we can get other responses on<a name="line.64"></a>
-<span class="sourceLineNo">065</span>        // this connection.<a name="line.65"></a>
-<span class="sourceLineNo">066</span>        int readSoFar = IPCUtil.getTotalSizeWhenWrittenDelimited(responseHeader);<a name="line.66"></a>
-<span class="sourceLineNo">067</span>        int whatIsLeftToRead = totalSize - readSoFar;<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>        // This is done through a Netty ByteBuf which has different behavior than InputStream.<a name="line.69"></a>
-<span class="sourceLineNo">070</span>        // It does not return number of bytes read but will update pointer internally and throws an<a name="line.70"></a>
-<span class="sourceLineNo">071</span>        // exception when too many bytes are to be skipped.<a name="line.71"></a>
-<span class="sourceLineNo">072</span>        inBuffer.skipBytes(whatIsLeftToRead);<a name="line.72"></a>
-<span class="sourceLineNo">073</span>        return;<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>      if (responseHeader.hasException()) {<a name="line.76"></a>
-<span class="sourceLineNo">077</span>        RPCProtos.ExceptionResponse exceptionResponse = responseHeader.getException();<a name="line.77"></a>
-<span class="sourceLineNo">078</span>        RemoteException re = createRemoteException(exceptionResponse);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>        if (exceptionResponse.getExceptionClassName().<a name="line.79"></a>
-<span class="sourceLineNo">080</span>            equals(FatalConnectionException.class.getName())) {<a name="line.80"></a>
-<span class="sourceLineNo">081</span>          channel.close(re);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>        } else {<a name="line.82"></a>
-<span class="sourceLineNo">083</span>          call.setFailed(re);<a name="line.83"></a>
-<span class="sourceLineNo">084</span>        }<a name="line.84"></a>
-<span class="sourceLineNo">085</span>      } else {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>        Message value = null;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>        // Call may be null because it may have timedout and been cleaned up on this side already<a name="line.87"></a>
-<span class="sourceLineNo">088</span>        if (call.responseDefaultType != null) {<a name="line.88"></a>
-<span class="sourceLineNo">089</span>          Message.Builder builder = call.responseDefaultType.newBuilderForType();<a name="line.89"></a>
-<span class="sourceLineNo">090</span>          ProtobufUtil.mergeDelimitedFrom(builder, in);<a name="line.90"></a>
-<span class="sourceLineNo">091</span>          value = builder.build();<a name="line.91"></a>
-<span class="sourceLineNo">092</span>        }<a name="line.92"></a>
-<span class="sourceLineNo">093</span>        CellScanner cellBlockScanner = null;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>        if (responseHeader.hasCellBlockMeta()) {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>          int size = responseHeader.getCellBlockMeta().getLength();<a name="line.95"></a>
-<span class="sourceLineNo">096</span>          byte[] cellBlock = new byte[size];<a name="line.96"></a>
-<span class="sourceLineNo">097</span>          inBuffer.readBytes(cellBlock, 0, cellBlock.length);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>          cellBlockScanner = channel.client.createCellScanner(cellBlock);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>        }<a name="line.99"></a>
-<span class="sourceLineNo">100</span>        call.setSuccess(value, cellBlockScanner);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>        call.callStats.setResponseSizeBytes(totalSize);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>      }<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    } catch (IOException e) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      // Treat this as a fatal condition and close this connection<a name="line.104"></a>
-<span class="sourceLineNo">105</span>      channel.close(e);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    } finally {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      inBuffer.release();<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    }<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
-<span class="sourceLineNo">110</span><a name="line.110"></a>
-<span class="sourceLineNo">111</span>  /**<a name="line.111"></a>
-<span class="sourceLineNo">112</span>   * @param e Proto exception<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   * @return RemoteException made from passed &lt;code&gt;e&lt;/code&gt;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   */<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  private RemoteException createRemoteException(final RPCProtos.ExceptionResponse e) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    String innerExceptionClassName = e.getExceptionClassName();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    boolean doNotRetry = e.getDoNotRetry();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    return e.hasHostname() ?<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        // If a hostname then add it to the RemoteWithExtrasException<a name="line.119"></a>
-<span class="sourceLineNo">120</span>        new RemoteWithExtrasException(innerExceptionClassName, e.getStackTrace(), e.getHostname(),<a name="line.120"></a>
-<span class="sourceLineNo">121</span>            e.getPort(), doNotRetry) :<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        new RemoteWithExtrasException(innerExceptionClassName, e.getStackTrace(), doNotRetry);<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
-<span class="sourceLineNo">124</span>}<a name="line.124"></a>
+<span class="sourceLineNo">044</span>   * @param channel on which this response handler operates<a name="line.44"></a>
+<span class="sourceLineNo">045</span>   */<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  public AsyncServerResponseHandler(AsyncRpcChannel channel) {<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    this.channel = channel;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>  }<a name="line.48"></a>
+<span class="sourceLineNo">049</span><a name="line.49"></a>
+<span class="sourceLineNo">050</span>  @Override<a name="line.50"></a>
+<span class="sourceLineNo">051</span>  protected void channelRead0(ChannelHandlerContext ctx, ByteBuf inBuffer) throws Exception {<a name="line.51"></a>
+<span class="sourceLineNo">052</span>    ByteBufInputStream in = new ByteBufInputStream(inBuffer);<a name="line.52"></a>
+<span class="sourceLineNo">053</span>    int totalSize = inBuffer.readableBytes();<a name="line.53"></a>
+<span class="sourceLineNo">054</span>    // Read the header<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    RPCProtos.ResponseHeader responseHeader = RPCProtos.ResponseHeader.parseDelimitedFrom(in);<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    int id = responseHeader.getCallId();<a name="line.56"></a>
+<span class="sourceLineNo">057</span>    AsyncCall call = channel.removePendingCall(id);<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    if (call == null) {<a name="line.58"></a>
+<span class="sourceLineNo">059</span>      // So we got a response for which we have no corresponding 'call' here on the client-side.<a name="line.59"></a>
+<span class="sourceLineNo">060</span>      // We probably timed out waiting, cleaned up all references, and now the server decides<a name="line.60"></a>
+<span class="sourceLineNo">061</span>      // to return a response. There is nothing we can do w/ the response at this stage. Clean<a name="line.61"></a>
+<span class="sourceLineNo">062</span>      // out the wire of the response so its out of the way and we can get other responses on<a name="line.62"></a>
+<span class="sourceLineNo">063</span>      // this connection.<a name="line.63"></a>
+<span class="sourceLineNo">064</span>      int readSoFar = IPCUtil.getTotalSizeWhenWrittenDelimited(responseHeader);<a name="line.64"></a>
+<span class="sourceLineNo">065</span>      int whatIsLeftToRead = totalSize - readSoFar;<a name="line.65"></a>
+<span class="sourceLineNo">066</span><a name="line.66"></a>
+<span class="sourceLineNo">067</span>      // This is done through a Netty ByteBuf which has different behavior than InputStream.<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      // It does not return number of bytes read but will update pointer internally and throws an<a name="line.68"></a>
+<span class="sourceLineNo">069</span>      // exception when too many bytes are to be skipped.<a name="line.69"></a>
+<span class="sourceLineNo">070</span>      inBuffer.skipBytes(whatIsLeftToRead);<a name="line.70"></a>
+<span class="sourceLineNo">071</span>      return;<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>    if (responseHeader.hasException()) {<a name="line.74"></a>
+<span class="sourceLineNo">075</span>      RPCProtos.ExceptionResponse exceptionResponse = responseHeader.getException();<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      RemoteException re = createRemoteException(exceptionResponse);<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      if (exceptionResponse.getExceptionClassName()<a name="line.77"></a>
+<span class="sourceLineNo">078</span>          .equals(FatalConnectionException.class.getName())) {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>        channel.close(re);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>      } else {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>        call.setFailed(re);<a name="line.81"></a>
+<span class="sourceLineNo">082</span>      }<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    } else {<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      Message value = null;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      // Call may be null because it may have timedout and been cleaned up on this side already<a name="line.85"></a>
+<span class="sourceLineNo">086</span>      if (call.responseDefaultType != null) {<a name="line.86"></a>
+<span class="sourceLineNo">087</span>        Message.Builder builder = call.responseDefaultType.newBuilderForType();<a name="line.87"></a>
+<span class="sourceLineNo">088</span>        ProtobufUtil.mergeDelimitedFrom(builder, in);<a name="line.88"></a>
+<span class="sourceLineNo">089</span>        value = builder.build();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>      }<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      CellScanner cellBlockScanner = null;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>      if (responseHeader.hasCellBlockMeta()) {<a name="line.92"></a>
+<span class="sourceLineNo">093</span>        int size = responseHeader.getCellBlockMeta().getLength();<a name="line.93"></a>
+<span class="sourceLineNo">094</span>        byte[] cellBlock = new byte[size];<a name="line.94"></a>
+<span class="sourceLineNo">095</span>        inBuffer.readBytes(cellBlock, 0, cellBlock.length);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>        cellBlockScanner = channel.client.createCellScanner(cellBlock);<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      }<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      call.setSuccess(value, cellBlockScanner);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      call.callStats.setResponseSizeBytes(totalSize);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    }<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  }<a name="line.101"></a>
+<span class="sourceLineNo">102</span><a name="line.102"></a>
+<span class="sourceLineNo">103</span>  @Override<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    channel.close(cause);<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  }<a name="line.106"></a>
+<span class="sourceLineNo">107</span><a name="line.107"></a>
+<span class="sourceLineNo">108</span>  @Override<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  public void channelInactive(ChannelHandlerContext ctx) throws Exception {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    channel.close(new IOException("connection closed"));<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  }<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>  /**<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   * @param e Proto exception<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * @return RemoteException made from passed &lt;code&gt;e&lt;/code&gt;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   */<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  private RemoteException createRemoteException(final RPCProtos.ExceptionResponse e) {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    String innerExceptionClassName = e.getExceptionClassName();<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    boolean doNotRetry = e.getDoNotRetry();<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    return e.hasHostname() ?<a name="line.120"></a>
+<span class="sourceLineNo">121</span>        // If a hostname then add it to the RemoteWithExtrasException<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        new RemoteWithExtrasException(innerExceptionClassName, e.getStackTrace(), e.getHostname(),<a name="line.122"></a>
+<span class="sourceLineNo">123</span>            e.getPort(), doNotRetry)<a name="line.123"></a>
+<span class="sourceLineNo">124</span>        : new RemoteWithExtrasException(innerExceptionClassName, e.getStackTrace(), doNotRetry);<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>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html
index b62790e..972da71 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/KeyValueScanner.html
@@ -38,144 +38,148 @@
 <span class="sourceLineNo">030</span> * Scanner that returns the next KeyValue.<a name="line.30"></a>
 <span class="sourceLineNo">031</span> */<a name="line.31"></a>
 <span class="sourceLineNo">032</span>@InterfaceAudience.Private<a name="line.32"></a>
-<span class="sourceLineNo">033</span>public interface KeyValueScanner extends Shipper, Closeable {<a name="line.33"></a>
-<span class="sourceLineNo">034</span>  /**<a name="line.34"></a>
-<span class="sourceLineNo">035</span>   * The byte array represents for NO_NEXT_INDEXED_KEY;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>   * The actual value is irrelevant because this is always compared by reference.<a name="line.36"></a>
-<span class="sourceLineNo">037</span>   */<a name="line.37"></a>
-<span class="sourceLineNo">038</span>  public static final Cell NO_NEXT_INDEXED_KEY = new KeyValue();<a name="line.38"></a>
-<span class="sourceLineNo">039</span><a name="line.39"></a>
-<span class="sourceLineNo">040</span>  /**<a name="line.40"></a>
-<span class="sourceLineNo">041</span>   * Look at the next Cell in this scanner, but do not iterate scanner.<a name="line.41"></a>
-<span class="sourceLineNo">042</span>   * @return the next Cell<a name="line.42"></a>
-<span class="sourceLineNo">043</span>   */<a name="line.43"></a>
-<span class="sourceLineNo">044</span>  Cell peek();<a name="line.44"></a>
-<span class="sourceLineNo">045</span><a name="line.45"></a>
-<span class="sourceLineNo">046</span>  /**<a name="line.46"></a>
-<span class="sourceLineNo">047</span>   * Return the next Cell in this scanner, iterating the scanner<a name="line.47"></a>
-<span class="sourceLineNo">048</span>   * @return the next Cell<a name="line.48"></a>
-<span class="sourceLineNo">049</span>   */<a name="line.49"></a>
-<span class="sourceLineNo">050</span>  Cell next() throws IOException;<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>   * Seek the scanner at or after the specified KeyValue.<a name="line.53"></a>
-<span class="sourceLineNo">054</span>   * @param key seek value<a name="line.54"></a>
-<span class="sourceLineNo">055</span>   * @return true if scanner has values left, false if end of scanner<a name="line.55"></a>
-<span class="sourceLineNo">056</span>   */<a name="line.56"></a>
-<span class="sourceLineNo">057</span>  boolean seek(Cell key) throws IOException;<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>  /**<a name="line.59"></a>
-<span class="sourceLineNo">060</span>   * Reseek the scanner at or after the specified KeyValue.<a name="line.60"></a>
-<span class="sourceLineNo">061</span>   * This method is guaranteed to seek at or after the required key only if the<a name="line.61"></a>
-<span class="sourceLineNo">062</span>   * key comes after the current position of the scanner. Should not be used<a name="line.62"></a>
-<span class="sourceLineNo">063</span>   * to seek to a key which may come before the current position.<a name="line.63"></a>
-<span class="sourceLineNo">064</span>   * @param key seek value (should be non-null)<a name="line.64"></a>
-<span class="sourceLineNo">065</span>   * @return true if scanner has values left, false if end of scanner<a name="line.65"></a>
-<span class="sourceLineNo">066</span>   */<a name="line.66"></a>
-<span class="sourceLineNo">067</span>  boolean reseek(Cell key) throws IOException;<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>   * Get the sequence id associated with this KeyValueScanner. This is required<a name="line.70"></a>
-<span class="sourceLineNo">071</span>   * for comparing multiple files to find out which one has the latest data.<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   * The default implementation for this would be to return 0. A file having<a name="line.72"></a>
-<span class="sourceLineNo">073</span>   * lower sequence id will be considered to be the older one.<a name="line.73"></a>
-<span class="sourceLineNo">074</span>   */<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  // TODO: Implement SequenceId Interface instead.<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  long getSequenceID();<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>  /**<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   * Close the KeyValue scanner.<a name="line.79"></a>
-<span class="sourceLineNo">080</span>   */<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  void close();<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>   * Allows to filter out scanners (both StoreFile and memstore) that we don't<a name="line.84"></a>
-<span class="sourceLineNo">085</span>   * want to use based on criteria such as Bloom filters and timestamp ranges.<a name="line.85"></a>
-<span class="sourceLineNo">086</span>   * @param scan the scan that we are selecting scanners for<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   * @param store the store we are performing the scan on.<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * @param oldestUnexpiredTS the oldest timestamp we are interested in for<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   *          this query, based on TTL<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   * @return true if the scanner should be included in the query<a name="line.90"></a>
-<span class="sourceLineNo">091</span>   */<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  boolean shouldUseScanner(Scan scan, Store store, long oldestUnexpiredTS);<a name="line.92"></a>
-<span class="sourceLineNo">093</span><a name="line.93"></a>
-<span class="sourceLineNo">094</span>  // "Lazy scanner" optimizations<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>   * Similar to {@link #seek} (or {@link #reseek} if forward is true) but only<a name="line.97"></a>
-<span class="sourceLineNo">098</span>   * does a seek operation after checking that it is really necessary for the<a name="line.98"></a>
-<span class="sourceLineNo">099</span>   * row/column combination specified by the kv parameter. This function was<a name="line.99"></a>
-<span class="sourceLineNo">100</span>   * added to avoid unnecessary disk seeks by checking row-column Bloom filters<a name="line.100"></a>
-<span class="sourceLineNo">101</span>   * before a seek on multi-column get/scan queries, and to optimize by looking<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * up more recent files first.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   * @param forward do a forward-only "reseek" instead of a random-access seek<a name="line.103"></a>
-<span class="sourceLineNo">104</span>   * @param useBloom whether to enable multi-column Bloom filter optimization<a name="line.104"></a>
-<span class="sourceLineNo">105</span>   */<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  boolean requestSeek(Cell kv, boolean forward, boolean useBloom)<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      throws IOException;<a name="line.107"></a>
-<span class="sourceLineNo">108</span><a name="line.108"></a>
-<span class="sourceLineNo">109</span>  /**<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   * We optimize our store scanners by checking the most recent store file<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   * first, so we sometimes pretend we have done a seek but delay it until the<a name="line.111"></a>
-<span class="sourceLineNo">112</span>   * store scanner bubbles up to the top of the key-value heap. This method is<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   * then used to ensure the top store file scanner has done a seek operation.<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   */<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  boolean realSeekDone();<a name="line.115"></a>
-<span class="sourceLineNo">116</span><a name="line.116"></a>
-<span class="sourceLineNo">117</span>  /**<a name="line.117"></a>
-<span class="sourceLineNo">118</span>   * Does the real seek operation in case it was skipped by<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   * seekToRowCol(KeyValue, boolean) (TODO: Whats this?). Note that this function should<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * be never called on scanners that always do real seek operations (i.e. most<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * of the scanners). The easiest way to achieve this is to call<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   * {@link #realSeekDone()} first.<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   */<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  void enforceSeek() throws IOException;<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>   * @return true if this is a file scanner. Otherwise a memory scanner is<a name="line.127"></a>
-<span class="sourceLineNo">128</span>   *         assumed.<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  boolean isFileScanner();<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // Support for "Reversed Scanner"<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  /**<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   * Seek the scanner at or before the row of specified Cell, it firstly<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   * tries to seek the scanner at or after the specified Cell, return if<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * peek KeyValue of scanner has the same row with specified Cell,<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   * otherwise seek the scanner at the first Cell of the row which is the<a name="line.137"></a>
-<span class="sourceLineNo">138</span>   * previous row of specified KeyValue<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   * <a name="line.139"></a>
-<span class="sourceLineNo">140</span>   * @param key seek KeyValue<a name="line.140"></a>
-<span class="sourceLineNo">141</span>   * @return true if the scanner is at the valid KeyValue, false if such<a name="line.141"></a>
-<span class="sourceLineNo">142</span>   *         KeyValue does not exist<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>  public boolean backwardSeek(Cell key) throws IOException;<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>   * Seek the scanner at the first Cell of the row which is the previous row<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   * of specified key<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * @param key seek value<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * @return true if the scanner at the first valid Cell of previous row,<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   *         false if not existing such Cell<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   */<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public boolean seekToPreviousRow(Cell key) throws IOException;<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>   * Seek the scanner at the first KeyValue of last row<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * <a name="line.158"></a>
-<span class="sourceLineNo">159</span>   * @return true if scanner has values left, false if the underlying data is<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   *         empty<a name="line.160"></a>
-<span class="sourceLineNo">161</span>   * @throws IOException<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public boolean seekToLastRow() throws IOException;<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>   * @return the next key in the index (the key to seek to the next block)<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * if known, or null otherwise<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  public Cell getNextIndexedKey();<a name="line.169"></a>
-<span class="sourceLineNo">170</span>}<a name="line.170"></a>
+<span class="sourceLineNo">033</span>// TODO: Change name from KeyValueScanner to CellScanner only we already have a simple CellScanner<a name="line.33"></a>
+<span class="sourceLineNo">034</span>// so this should be something else altogether, a decoration on our base CellScanner. TODO.<a name="line.34"></a>
+<span class="sourceLineNo">035</span>// This class shows in CPs so do it all in one swell swoop. HBase-2.0.0.<a name="line.35"></a>
+<span class="sourceLineNo">036</span>public interface KeyValueScanner extends Shipper, Closeable {<a name="line.36"></a>
+<span class="sourceLineNo">037</span>  /**<a name="line.37"></a>
+<span class="sourceLineNo">038</span>   * The byte array represents for NO_NEXT_INDEXED_KEY;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>   * The actual value is irrelevant because this is always compared by reference.<a name="line.39"></a>
+<span class="sourceLineNo">040</span>   */<a name="line.40"></a>
+<span class="sourceLineNo">041</span>  public static final Cell NO_NEXT_INDEXED_KEY = new KeyValue();<a name="line.41"></a>
+<span class="sourceLineNo">042</span><a name="line.42"></a>
+<span class="sourceLineNo">043</span>  /**<a name="line.43"></a>
+<span class="sourceLineNo">044</span>   * Look at the next Cell in this scanner, but do not iterate scanner.<a name="line.44"></a>
+<span class="sourceLineNo">045</span>   * @return the next Cell<a name="line.45"></a>
+<span class="sourceLineNo">046</span>   */<a name="line.46"></a>
+<span class="sourceLineNo">047</span>  Cell peek();<a name="line.47"></a>
+<span class="sourceLineNo">048</span><a name="line.48"></a>
+<span class="sourceLineNo">049</span>  /**<a name="line.49"></a>
+<span class="sourceLineNo">050</span>   * Return the next Cell in this scanner, iterating the scanner<a name="line.50"></a>
+<span class="sourceLineNo">051</span>   * @return the next Cell<a name="line.51"></a>
+<span class="sourceLineNo">052</span>   */<a name="line.52"></a>
+<span class="sourceLineNo">053</span>  Cell next() throws IOException;<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>   * Seek the scanner at or after the specified KeyValue.<a name="line.56"></a>
+<span class="sourceLineNo">057</span>   * @param key seek value<a name="line.57"></a>
+<span class="sourceLineNo">058</span>   * @return true if scanner has values left, false if end of scanner<a name="line.58"></a>
+<span class="sourceLineNo">059</span>   */<a name="line.59"></a>
+<span class="sourceLineNo">060</span>  boolean seek(Cell key) throws IOException;<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>   * Reseek the scanner at or after the specified KeyValue.<a name="line.63"></a>
+<span class="sourceLineNo">064</span>   * This method is guaranteed to seek at or after the required key only if the<a name="line.64"></a>
+<span class="sourceLineNo">065</span>   * key comes after the current position of the scanner. Should not be used<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * to seek to a key which may come before the current position.<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   * @param key seek value (should be non-null)<a name="line.67"></a>
+<span class="sourceLineNo">068</span>   * @return true if scanner has values left, false if end of scanner<a name="line.68"></a>
+<span class="sourceLineNo">069</span>   */<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  boolean reseek(Cell key) throws IOException;<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  /**<a name="line.72"></a>
+<span class="sourceLineNo">073</span>   * Get the sequence id associated with this KeyValueScanner. This is required<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   * for comparing multiple files to find out which one has the latest data.<a name="line.74"></a>
+<span class="sourceLineNo">075</span>   * The default implementation for this would be to return 0. A file having<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * lower sequence id will be considered to be the older one.<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   */<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  // TODO: Implement SequenceId Interface instead.<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  long getSequenceID();<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>   * Close the KeyValue scanner.<a name="line.82"></a>
+<span class="sourceLineNo">083</span>   */<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  void close();<a name="line.84"></a>
+<span class="sourceLineNo">085</span><a name="line.85"></a>
+<span class="sourceLineNo">086</span>  /**<a name="line.86"></a>
+<span class="sourceLineNo">087</span>   * Allows to filter out scanners (both StoreFile and memstore) that we don't<a name="line.87"></a>
+<span class="sourceLineNo">088</span>   * want to use based on criteria such as Bloom filters and timestamp ranges.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>   * @param scan the scan that we are selecting scanners for<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   * @param store the store we are performing the scan on.<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * @param oldestUnexpiredTS the oldest timestamp we are interested in for<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   *          this query, based on TTL<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * @return true if the scanner should be included in the query<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  boolean shouldUseScanner(Scan scan, Store store, long oldestUnexpiredTS);<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>  // "Lazy scanner" optimizations<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>   * Similar to {@link #seek} (or {@link #reseek} if forward is true) but only<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   * does a seek operation after checking that it is really necessary for the<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   * row/column combination specified by the kv parameter. This function was<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   * added to avoid unnecessary disk seeks by checking row-column Bloom filters<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   * before a seek on multi-column get/scan queries, and to optimize by looking<a name="line.104"></a>
+<span class="sourceLineNo">105</span>   * up more recent files first.<a name="line.105"></a>
+<span class="sourceLineNo">106</span>   * @param forward do a forward-only "reseek" instead of a random-access seek<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * @param useBloom whether to enable multi-column Bloom filter optimization<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  boolean requestSeek(Cell kv, boolean forward, boolean useBloom)<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      throws IOException;<a name="line.110"></a>
+<span class="sourceLineNo">111</span><a name="line.111"></a>
+<span class="sourceLineNo">112</span>  /**<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   * We optimize our store scanners by checking the most recent store file<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   * first, so we sometimes pretend we have done a seek but delay it until the<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * store scanner bubbles up to the top of the key-value heap. This method is<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   * then used to ensure the top store file scanner has done a seek operation.<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   */<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  boolean realSeekDone();<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>   * Does the real seek operation in case it was skipped by<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   * seekToRowCol(KeyValue, boolean) (TODO: Whats this?). Note that this function should<a name="line.122"></a>
+<span class="sourceLineNo">123</span>   * be never called on scanners that always do real seek operations (i.e. most<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   * of the scanners). The easiest way to achieve this is to call<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * {@link #realSeekDone()} first.<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  void enforceSeek() throws IOException;<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>   * @return true if this is a file scanner. Otherwise a memory scanner is<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   *         assumed.<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   */<a name="line.132"></a>
+<span class="sourceLineNo">133</span>  boolean isFileScanner();<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // Support for "Reversed Scanner"<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  /**<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   * Seek the scanner at or before the row of specified Cell, it firstly<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   * tries to seek the scanner at or after the specified Cell, return if<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * peek KeyValue of scanner has the same row with specified Cell,<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   * otherwise seek the scanner at the first Cell of the row which is the<a name="line.140"></a>
+<span class="sourceLineNo">141</span>   * previous row of specified KeyValue<a name="line.141"></a>
+<span class="sourceLineNo">142</span>   *<a name="line.142"></a>
+<span class="sourceLineNo">143</span>   * @param key seek KeyValue<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   * @return true if the scanner is at the valid KeyValue, false if such<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   *         KeyValue does not exist<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>  public boolean backwardSeek(Cell key) throws IOException;<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>   * Seek the scanner at the first Cell of the row which is the previous row<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * of specified key<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   * @param key seek value<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * @return true if the scanner at the first valid Cell of previous row,<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   *         false if not existing such Cell<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   */<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  public boolean seekToPreviousRow(Cell key) throws IOException;<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>  /**<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   * Seek the scanner at the first KeyValue of last row<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   *<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   * @return true if scanner has values left, false if the underlying data is<a name="line.162"></a>
+<span class="sourceLineNo">163</span>   *         empty<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   * @throws IOException<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   */<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public boolean seekToLastRow() throws IOException;<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>   * @return the next key in the index, usually the first key of next block OR a key that falls<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   * between last key of current block and first key of next block..<a name="line.170"></a>
+<span class="sourceLineNo">171</span>   * see HFileWriterImpl#getMidpoint, or null if not known.<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   */<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public Cell getNextIndexedKey();<a name="line.173"></a>
+<span class="sourceLineNo">174</span>}<a name="line.174"></a>
 
 
 


[14/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/hbase-shaded-client-project/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/hbase-shaded-client-project/team-list.html b/hbase-archetypes/hbase-shaded-client-project/team-list.html
index 1c3f3ad..51237d4 100644
--- a/hbase-archetypes/hbase-shaded-client-project/team-list.html
+++ b/hbase-archetypes/hbase-shaded-client-project/team-list.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Exemplar for hbase-shaded-client archetype">Apache HBase - Exemplar for hbase-shaded-client archetype</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/index.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/index.html b/hbase-archetypes/index.html
index 9f3a751..3664f17 100644
--- a/hbase-archetypes/index.html
+++ b/hbase-archetypes/index.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetypes">Apache HBase - Archetypes</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/integration.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/integration.html b/hbase-archetypes/integration.html
index ebc70ee..7fd7879 100644
--- a/hbase-archetypes/integration.html
+++ b/hbase-archetypes/integration.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetypes">Apache HBase - Archetypes</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/issue-tracking.html b/hbase-archetypes/issue-tracking.html
index b731745..257de63 100644
--- a/hbase-archetypes/issue-tracking.html
+++ b/hbase-archetypes/issue-tracking.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetypes">Apache HBase - Archetypes</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/license.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/license.html b/hbase-archetypes/license.html
index 1955fb5..587624a 100644
--- a/hbase-archetypes/license.html
+++ b/hbase-archetypes/license.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetypes">Apache HBase - Archetypes</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/mail-lists.html b/hbase-archetypes/mail-lists.html
index 0c5ff14..e574ec5 100644
--- a/hbase-archetypes/mail-lists.html
+++ b/hbase-archetypes/mail-lists.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetypes">Apache HBase - Archetypes</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/modules.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/modules.html b/hbase-archetypes/modules.html
index d56a44c..4293040 100644
--- a/hbase-archetypes/modules.html
+++ b/hbase-archetypes/modules.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetypes">Apache HBase - Archetypes</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/plugin-management.html b/hbase-archetypes/plugin-management.html
index 5a4f241..c933a62 100644
--- a/hbase-archetypes/plugin-management.html
+++ b/hbase-archetypes/plugin-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetypes">Apache HBase - Archetypes</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/plugins.html b/hbase-archetypes/plugins.html
index a98636a..b15cff5 100644
--- a/hbase-archetypes/plugins.html
+++ b/hbase-archetypes/plugins.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetypes">Apache HBase - Archetypes</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/project-info.html b/hbase-archetypes/project-info.html
index f23a5c8..5e8100b 100644
--- a/hbase-archetypes/project-info.html
+++ b/hbase-archetypes/project-info.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetypes">Apache HBase - Archetypes</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/project-summary.html b/hbase-archetypes/project-summary.html
index c35b914..d5790b1 100644
--- a/hbase-archetypes/project-summary.html
+++ b/hbase-archetypes/project-summary.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetypes">Apache HBase - Archetypes</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/source-repository.html b/hbase-archetypes/source-repository.html
index 441be2b..8d74107 100644
--- a/hbase-archetypes/source-repository.html
+++ b/hbase-archetypes/source-repository.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetypes">Apache HBase - Archetypes</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-archetypes/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-archetypes/team-list.html b/hbase-archetypes/team-list.html
index d6a7469..9386800 100644
--- a/hbase-archetypes/team-list.html
+++ b/hbase-archetypes/team-list.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Archetypes">Apache HBase - Archetypes</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-spark/checkstyle.html
----------------------------------------------------------------------
diff --git a/hbase-spark/checkstyle.html b/hbase-spark/checkstyle.html
index 3582c95..d1f1309 100644
--- a/hbase-spark/checkstyle.html
+++ b/hbase-spark/checkstyle.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-spark/dependencies.html
----------------------------------------------------------------------
diff --git a/hbase-spark/dependencies.html b/hbase-spark/dependencies.html
index 58069ad..872f2ce 100644
--- a/hbase-spark/dependencies.html
+++ b/hbase-spark/dependencies.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>
@@ -765,7 +765,7 @@
 <tr class="b">
 <td>org.apache.zookeeper</td>
 <td>zookeeper</td>
-<td>3.4.6</td>
+<td>3.4.8</td>
 <td>jar</td>
 <td>-</td></tr>
 <tr class="a">
@@ -2752,7 +2752,7 @@ built on Jackson JSON processor</p>
 <p><b>Description: </b>A tracing framework for use with distributed systems written in java</p>
 <p><b>URL: </b><a class="externalLink" href="http://incubator.apache.org/projects/htrace.html">http://incubator.apache.org/projects/htrace.html</a></p>
 <p><b>Project License: </b><a class="externalLink" href="http://www.apache.org/licenses/LICENSE-2.0.txt">The Apache Software License, Version 2.0</a></p></td></tr></table></div></li>
-<li>org.apache.zookeeper:zookeeper:jar:3.4.6 (compile) <img id="_img255" src="./images/icon_info_sml.gif" alt="Information" onclick="toggleDependencyDetail( '_dep254', '_img255' );" style="cursor: pointer;vertical-align:text-bottom;"></img><div id="_dep254" style="display:none">
+<li>org.apache.zookeeper:zookeeper:jar:3.4.8 (compile) <img id="_img255" src="./images/icon_info_sml.gif" alt="Information" onclick="toggleDependencyDetail( '_dep254', '_img255' );" style="cursor: pointer;vertical-align:text-bottom;"></img><div id="_dep254" style="display:none">
 <table border="0" class="bodyTable">
 <tr class="a">
 <th>zookeeper</th></tr>
@@ -4536,7 +4536,7 @@ Jackson JSON processor's data binding functionality.</p>
 <td>-</td></tr>
 <tr class="b">
 <td>hbase-server-2.0.0-SNAPSHOT-tests.jar</td>
-<td>7.38 MB</td>
+<td>7.39 MB</td>
 <td>-</td>
 <td>-</td>
 <td>-</td>
@@ -4778,10 +4778,10 @@ Jackson JSON processor's data binding functionality.</p>
 <td>debug</td>
 <td>-</td></tr>
 <tr class="a">
-<td>zookeeper-3.4.6.jar</td>
-<td>774.38 kB</td>
-<td>464</td>
-<td>440</td>
+<td>zookeeper-3.4.8.jar</td>
+<td>785.74 kB</td>
+<td>471</td>
+<td>447</td>
 <td>19</td>
 <td>1.5</td>
 <td>debug</td>
@@ -5193,25 +5193,25 @@ Jackson JSON processor's data binding functionality.</p>
 <th>Sealed</th></tr>
 <tr class="a">
 <td>186</td>
-<td>138.90 MB</td>
-<td>81,734</td>
-<td>74,127</td>
+<td>138.92 MB</td>
+<td>81,741</td>
+<td>74,134</td>
 <td>2,249</td>
 <td>1.6</td>
 <td>161</td>
 <td>1</td></tr>
 <tr class="b">
 <td>compile: 102</td>
-<td>compile: 44.60 MB</td>
-<td>compile: 28,075</td>
-<td>compile: 25,164</td>
+<td>compile: 44.61 MB</td>
+<td>compile: 28,082</td>
+<td>compile: 25,171</td>
 <td>compile: 1,222</td>
 <td>-</td>
 <td>compile: 89</td>
 <td>compile: 1</td></tr>
 <tr class="a">
 <td>test: 21</td>
-<td>test: 41.37 MB</td>
+<td>test: 41.38 MB</td>
 <td>test: 16,701</td>
 <td>test: 13,582</td>
 <td>test: 315</td>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-spark/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/hbase-spark/dependency-convergence.html b/hbase-spark/dependency-convergence.html
index 9d1662a..bf5a5c0 100644
--- a/hbase-spark/dependency-convergence.html
+++ b/hbase-spark/dependency-convergence.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>
@@ -1188,7 +1188,7 @@
 <td>
 <table border="0" class="bodyTable">
 <tr class="b">
-<td width="25%">3.4.6</td>
+<td width="25%">3.4.8</td>
 <td>
 <ol style="list-style-type: lower-alpha">
 <li><a class="externalLink" href="http://hbase.apache.org/hbase-client">org.apache.hbase:hbase-client</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-spark/dependency-info.html
----------------------------------------------------------------------
diff --git a/hbase-spark/dependency-info.html b/hbase-spark/dependency-info.html
index 3f5ccd8..990d992 100644
--- a/hbase-spark/dependency-info.html
+++ b/hbase-spark/dependency-info.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-spark/dependency-management.html
----------------------------------------------------------------------
diff --git a/hbase-spark/dependency-management.html b/hbase-spark/dependency-management.html
index 2b22df9..6def98d 100644
--- a/hbase-spark/dependency-management.html
+++ b/hbase-spark/dependency-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>
@@ -404,7 +404,7 @@
 <tr class="b">
 <td>org.apache.zookeeper</td>
 <td>zookeeper</td>
-<td>3.4.6</td>
+<td>3.4.8</td>
 <td>jar</td>
 <td>-</td></tr>
 <tr class="a">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-spark/distribution-management.html
----------------------------------------------------------------------
diff --git a/hbase-spark/distribution-management.html b/hbase-spark/distribution-management.html
index 885ddab..4ad7e0f 100644
--- a/hbase-spark/distribution-management.html
+++ b/hbase-spark/distribution-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-spark/index.html
----------------------------------------------------------------------
diff --git a/hbase-spark/index.html b/hbase-spark/index.html
index e53ed11..6f70840 100644
--- a/hbase-spark/index.html
+++ b/hbase-spark/index.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-spark/integration.html
----------------------------------------------------------------------
diff --git a/hbase-spark/integration.html b/hbase-spark/integration.html
index 69faa97..403b82b 100644
--- a/hbase-spark/integration.html
+++ b/hbase-spark/integration.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-spark/issue-tracking.html
----------------------------------------------------------------------
diff --git a/hbase-spark/issue-tracking.html b/hbase-spark/issue-tracking.html
index a8c8bca..d13f751 100644
--- a/hbase-spark/issue-tracking.html
+++ b/hbase-spark/issue-tracking.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-spark/license.html
----------------------------------------------------------------------
diff --git a/hbase-spark/license.html b/hbase-spark/license.html
index 23de49a..1065de4 100644
--- a/hbase-spark/license.html
+++ b/hbase-spark/license.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-spark/mail-lists.html
----------------------------------------------------------------------
diff --git a/hbase-spark/mail-lists.html b/hbase-spark/mail-lists.html
index 3fb4dda..7d1c95b 100644
--- a/hbase-spark/mail-lists.html
+++ b/hbase-spark/mail-lists.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-spark/plugin-management.html
----------------------------------------------------------------------
diff --git a/hbase-spark/plugin-management.html b/hbase-spark/plugin-management.html
index b865d82..161ac3c 100644
--- a/hbase-spark/plugin-management.html
+++ b/hbase-spark/plugin-management.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-spark/plugins.html
----------------------------------------------------------------------
diff --git a/hbase-spark/plugins.html b/hbase-spark/plugins.html
index 10bb401..0393933 100644
--- a/hbase-spark/plugins.html
+++ b/hbase-spark/plugins.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-spark/project-info.html
----------------------------------------------------------------------
diff --git a/hbase-spark/project-info.html b/hbase-spark/project-info.html
index e33b1e8..65004d8 100644
--- a/hbase-spark/project-info.html
+++ b/hbase-spark/project-info.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-spark/project-reports.html
----------------------------------------------------------------------
diff --git a/hbase-spark/project-reports.html b/hbase-spark/project-reports.html
index 33c26cd..ef13cb0 100644
--- a/hbase-spark/project-reports.html
+++ b/hbase-spark/project-reports.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-spark/project-summary.html
----------------------------------------------------------------------
diff --git a/hbase-spark/project-summary.html b/hbase-spark/project-summary.html
index 54b080e..5ca3b37 100644
--- a/hbase-spark/project-summary.html
+++ b/hbase-spark/project-summary.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-spark/source-repository.html
----------------------------------------------------------------------
diff --git a/hbase-spark/source-repository.html b/hbase-spark/source-repository.html
index 1239f7f..0f0f0bb 100644
--- a/hbase-spark/source-repository.html
+++ b/hbase-spark/source-repository.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/hbase-spark/team-list.html
----------------------------------------------------------------------
diff --git a/hbase-spark/team-list.html b/hbase-spark/team-list.html
index 581d0b7..7924cb7 100644
--- a/hbase-spark/team-list.html
+++ b/hbase-spark/team-list.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-23 -->
+<!-- Generated by Apache Maven Doxia Site Renderer 1.6 at 2016-03-24 -->
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
@@ -10,7 +10,7 @@
       @import url("./css/site.css");
     </style>
     <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
-    <meta name="Date-Revision-yyyymmdd" content="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
         
         </head>
@@ -27,7 +27,7 @@
             
                     
                 <div class="xleft">
-        <span id="publishDate">Last Published: 2016-03-23</span>
+        <span id="publishDate">Last Published: 2016-03-24</span>
                   &nbsp;| <span id="projectVersion">Version: 2.0.0-SNAPSHOT</span>
                       </div>
             <div class="xright">                    <a href="./" title="Apache HBase - Spark">Apache HBase - Spark</a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 470912e..453d71f 100644
--- a/index.html
+++ b/index.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBaseâ„¢ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -422,7 +422,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index 16cecbb..17b3638 100644
--- a/integration.html
+++ b/integration.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Continuous Integration</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-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index 8a5eeb1..1712ad5 100644
--- a/issue-tracking.html
+++ b/issue-tracking.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Tracking</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -287,7 +287,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index 1d2816b..23ca27b 100644
--- a/license.html
+++ b/license.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project License</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -490,7 +490,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index 203e870..d6ef948 100644
--- a/mail-lists.html
+++ b/mail-lists.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -340,7 +340,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index c2b6b9e..97f0b24 100644
--- a/metrics.html
+++ b/metrics.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -458,7 +458,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/modules.html
----------------------------------------------------------------------
diff --git a/modules.html b/modules.html
index 25d543c..cde379c 100644
--- a/modules.html
+++ b/modules.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Modules</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -381,7 +381,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 34f8878..fb0c66c 100644
--- a/old_news.html
+++ b/old_news.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -413,7 +413,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-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index 798d10d..a134f08 100644
--- a/plugin-management.html
+++ b/plugin-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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -423,7 +423,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 5796a10..bb03035 100644
--- a/plugins.html
+++ b/plugins.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Build Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -366,7 +366,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index d40def4..d8e53ea 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Powered By Apache HBase™</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -768,7 +768,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-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index ddc55ee..9cedafd 100644
--- a/project-info.html
+++ b/project-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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -340,7 +340,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index 298c20c..3354f5f 100644
--- a/project-reports.html
+++ b/project-reports.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -310,7 +310,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index 1cb7580..c043016 100644
--- a/project-summary.html
+++ b/project-summary.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -330,7 +330,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index 579cfc2..2f9188c 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 Running Apache HBase (TM) in pseudo-distributed mode
@@ -307,7 +307,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-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index 96b50c1..5a02097 100644
--- a/replication.html
+++ b/replication.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -302,7 +302,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-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index 767db7d..4938c5f 100644
--- a/resources.html
+++ b/resources.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Other Apache HBase (TM) Resources</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -324,7 +324,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-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index bbaa5e9..62aad86 100644
--- a/source-repository.html
+++ b/source-repository.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Repository</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -298,7 +298,7 @@
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index 047e92b..13e6a0d 100644
--- a/sponsors.html
+++ b/sponsors.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -332,7 +332,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-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index e53ee4f..3a4d5be 100644
--- a/supportingprojects.html
+++ b/supportingprojects.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -519,7 +519,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-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index 5571727..8881594 100644
--- a/team-list.html
+++ b/team-list.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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Team list</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -795,7 +795,7 @@ window.onLoad = init();
                         <a href="http://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2016-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/allclasses-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-frame.html b/testdevapidocs/allclasses-frame.html
index 8204b38..2565252 100644
--- a/testdevapidocs/allclasses-frame.html
+++ b/testdevapidocs/allclasses-frame.html
@@ -1523,6 +1523,7 @@
 <li><a href="org/apache/hadoop/hbase/regionserver/TestStoreFileRefresherChore.StaleStorefileRefresherChore.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestStoreFileRefresherChore.StaleStorefileRefresherChore</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/TestStoreFileScannerWithTagCompression.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestStoreFileScannerWithTagCompression</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestStoreScanner</a></li>
+<li><a href="org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestStoreScanner.CellGridStoreScanner</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/compactions/TestStripeCompactionPolicy.html" title="class in org.apache.hadoop.hbase.regionserver.compactions" target="classFrame">TestStripeCompactionPolicy</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/compactions/TestStripeCompactionPolicy.Scanner.html" title="class in org.apache.hadoop.hbase.regionserver.compactions" target="classFrame">TestStripeCompactionPolicy.Scanner</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/TestStripeCompactor.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestStripeCompactor</a></li>
@@ -1618,6 +1619,7 @@
 <li><a href="org/apache/hadoop/hbase/codec/prefixtree/timestamp/data/TestTimestampDataNumbers.html" title="class in org.apache.hadoop.hbase.codec.prefixtree.timestamp.data" target="classFrame">TestTimestampDataNumbers</a></li>
 <li><a href="org/apache/hadoop/hbase/codec/prefixtree/timestamp/data/TestTimestampDataRepeats.html" title="class in org.apache.hadoop.hbase.codec.prefixtree.timestamp.data" target="classFrame">TestTimestampDataRepeats</a></li>
 <li><a href="org/apache/hadoop/hbase/codec/prefixtree/timestamp/TestTimestampEncoder.html" title="class in org.apache.hadoop.hbase.codec.prefixtree.timestamp" target="classFrame">TestTimestampEncoder</a></li>
+<li><a href="org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestTimestampFilterSeekHint</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestTimestampsFilter.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestTimestampsFilter</a></li>
 <li><a href="org/apache/hadoop/hbase/security/token/TestTokenAuthentication.html" title="class in org.apache.hadoop.hbase.security.token" target="classFrame">TestTokenAuthentication</a></li>
 <li><a href="org/apache/hadoop/hbase/security/token/TestTokenAuthentication.AuthenticationServiceSecurityInfo.html" title="interface in org.apache.hadoop.hbase.security.token" target="classFrame"><i>TestTokenAuthentication.AuthenticationServiceSecurityInfo</i></a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/allclasses-noframe.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-noframe.html b/testdevapidocs/allclasses-noframe.html
index 20bcb8e..e4fcb38 100644
--- a/testdevapidocs/allclasses-noframe.html
+++ b/testdevapidocs/allclasses-noframe.html
@@ -1523,6 +1523,7 @@
 <li><a href="org/apache/hadoop/hbase/regionserver/TestStoreFileRefresherChore.StaleStorefileRefresherChore.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreFileRefresherChore.StaleStorefileRefresherChore</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/TestStoreFileScannerWithTagCompression.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreFileScannerWithTagCompression</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></li>
+<li><a href="org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner.CellGridStoreScanner</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/compactions/TestStripeCompactionPolicy.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">TestStripeCompactionPolicy</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/compactions/TestStripeCompactionPolicy.Scanner.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">TestStripeCompactionPolicy.Scanner</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/TestStripeCompactor.html" title="class in org.apache.hadoop.hbase.regionserver">TestStripeCompactor</a></li>
@@ -1618,6 +1619,7 @@
 <li><a href="org/apache/hadoop/hbase/codec/prefixtree/timestamp/data/TestTimestampDataNumbers.html" title="class in org.apache.hadoop.hbase.codec.prefixtree.timestamp.data">TestTimestampDataNumbers</a></li>
 <li><a href="org/apache/hadoop/hbase/codec/prefixtree/timestamp/data/TestTimestampDataRepeats.html" title="class in org.apache.hadoop.hbase.codec.prefixtree.timestamp.data">TestTimestampDataRepeats</a></li>
 <li><a href="org/apache/hadoop/hbase/codec/prefixtree/timestamp/TestTimestampEncoder.html" title="class in org.apache.hadoop.hbase.codec.prefixtree.timestamp">TestTimestampEncoder</a></li>
+<li><a href="org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">TestTimestampFilterSeekHint</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestTimestampsFilter.html" title="class in org.apache.hadoop.hbase.client">TestTimestampsFilter</a></li>
 <li><a href="org/apache/hadoop/hbase/security/token/TestTokenAuthentication.html" title="class in org.apache.hadoop.hbase.security.token">TestTokenAuthentication</a></li>
 <li><a href="org/apache/hadoop/hbase/security/token/TestTokenAuthentication.AuthenticationServiceSecurityInfo.html" title="interface in org.apache.hadoop.hbase.security.token"><i>TestTokenAuthentication.AuthenticationServiceSecurityInfo</i></a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/constant-values.html b/testdevapidocs/constant-values.html
index f9b8399..f7d09c3 100644
--- a/testdevapidocs/constant-values.html
+++ b/testdevapidocs/constant-values.html
@@ -7877,6 +7877,34 @@
 </tr>
 <tbody>
 <tr class="altColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.TestStoreScanner.CELL_GRID_BLOCK2_BOUNDARY">
+<!--   -->
+</a><code>private&nbsp;static&nbsp;final&nbsp;int</code></td>
+<td><code><a href="org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CELL_GRID_BLOCK2_BOUNDARY">CELL_GRID_BLOCK2_BOUNDARY</a></code></td>
+<td class="colLast"><code>4</code></td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.TestStoreScanner.CELL_GRID_BLOCK3_BOUNDARY">
+<!--   -->
+</a><code>private&nbsp;static&nbsp;final&nbsp;int</code></td>
+<td><code><a href="org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CELL_GRID_BLOCK3_BOUNDARY">CELL_GRID_BLOCK3_BOUNDARY</a></code></td>
+<td class="colLast"><code>11</code></td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.TestStoreScanner.CELL_GRID_BLOCK4_BOUNDARY">
+<!--   -->
+</a><code>private&nbsp;static&nbsp;final&nbsp;int</code></td>
+<td><code><a href="org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CELL_GRID_BLOCK4_BOUNDARY">CELL_GRID_BLOCK4_BOUNDARY</a></code></td>
+<td class="colLast"><code>15</code></td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.TestStoreScanner.CELL_GRID_BLOCK5_BOUNDARY">
+<!--   -->
+</a><code>private&nbsp;static&nbsp;final&nbsp;int</code></td>
+<td><code><a href="org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CELL_GRID_BLOCK5_BOUNDARY">CELL_GRID_BLOCK5_BOUNDARY</a></code></td>
+<td class="colLast"><code>19</code></td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.TestStoreScanner.CF_STR">
 <!--   -->
 </a><code>private&nbsp;static&nbsp;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></code></td>
@@ -7888,6 +7916,46 @@
 </li>
 <li class="blockList">
 <table border="0" cellpadding="3" cellspacing="0" summary="Constant Field Values table, listing constant fields, and values">
+<caption><span>org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">TestTimestampFilterSeekHint</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th scope="col">Constant Field</th>
+<th class="colLast" scope="col">Value</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.TestTimestampFilterSeekHint.FAMILY">
+<!--   -->
+</a><code>private&nbsp;static&nbsp;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></code></td>
+<td><code><a href="org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#FAMILY">FAMILY</a></code></td>
+<td class="colLast"><code>"D"</code></td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.TestTimestampFilterSeekHint.MAX_VERSIONS">
+<!--   -->
+</a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
+<td><code><a href="org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#MAX_VERSIONS">MAX_VERSIONS</a></code></td>
+<td class="colLast"><code>50000</code></td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.TestTimestampFilterSeekHint.QUAL">
+<!--   -->
+</a><code>private&nbsp;static&nbsp;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></code></td>
+<td><code><a href="org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#QUAL">QUAL</a></code></td>
+<td class="colLast"><code>"0"</code></td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.TestTimestampFilterSeekHint.RK">
+<!--   -->
+</a><code>private&nbsp;static&nbsp;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></code></td>
+<td><code><a href="org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#RK">RK</a></code></td>
+<td class="colLast"><code>"myRK"</code></td>
+</tr>
+</tbody>
+</table>
+</li>
+<li class="blockList">
+<table border="0" cellpadding="3" cellspacing="0" summary="Constant Field Values table, listing constant fields, and values">
 <caption><span>org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALLockup.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALLockup</a></span><span class="tabEnd">&nbsp;</span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>


[42/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 f2ff982..8b96979 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="filter">
+<a name="format">
 <!--   -->
 </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.275">filter</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.275">format</a></pre>
 </li>
 </ul>
-<a name="catalogJanitorEnabled">
+<a name="assignmentManager">
 <!--   -->
 </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.282">catalogJanitorEnabled</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.282">assignmentManager</a></pre>
 </li>
 </ul>
-<a name="metaLocation">
+<a name="filter">
 <!--   -->
 </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>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.289">filter</a></pre>
 </li>
 </ul>
-<a name="frags">
+<a name="servers">
 <!--   -->
 </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.296">frags</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.296">servers</a></pre>
 </li>
 </ul>
-<a name="serverManager">
+<a name="deadServers">
 <!--   -->
 </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.303">serverManager</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.303">deadServers</a></pre>
 </li>
 </ul>
-<a name="deadServers">
+<a name="serverManager">
 <!--   -->
 </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.310">deadServers</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.310">serverManager</a></pre>
 </li>
 </ul>
-<a name="assignmentManager">
+<a name="catalogJanitorEnabled">
 <!--   -->
 </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.317">assignmentManager</a></pre>
+<h4>catalogJanitorEnabled</h4>
+<pre>protected&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#line.317">catalogJanitorEnabled</a></pre>
 </li>
 </ul>
-<a name="format">
+<a name="frags">
 <!--   -->
 </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.324">format</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.324">frags</a></pre>
 </li>
 </ul>
-<a name="servers">
+<a name="metaLocation">
 <!--   -->
 </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>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.331">metaLocation</a></pre>
 </li>
 </ul>
 </li>
@@ -473,85 +473,85 @@ extends org.jamon.AbstractTemplateProxy</pre>
 </dl>
 </li>
 </ul>
-<a name="setFilter(java.lang.String)">
+<a name="setFormat(java.lang.String)">
 <!--   -->
 </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.276">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>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.276">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="setAssignmentManager(org.apache.hadoop.hbase.master.AssignmentManager)">
 <!--   -->
 </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.283">setCatalogJanitorEnabled</a>(boolean&nbsp;p_catalogJanitorEnabled)</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.283">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="setMetaLocation(org.apache.hadoop.hbase.ServerName)">
+<a name="setFilter(java.lang.String)">
 <!--   -->
 </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>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.290">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="setFrags(java.util.Map)">
+<a name="setServers(java.util.List)">
 <!--   -->
 </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.297">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>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.297">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="setServerManager(org.apache.hadoop.hbase.master.ServerManager)">
+<a name="setDeadServers(java.util.Set)">
 <!--   -->
 </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.304">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>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.304">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="setDeadServers(java.util.Set)">
+<a name="setServerManager(org.apache.hadoop.hbase.master.ServerManager)">
 <!--   -->
 </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.311">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>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.311">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="setAssignmentManager(org.apache.hadoop.hbase.master.AssignmentManager)">
+<a name="setCatalogJanitorEnabled(boolean)">
 <!--   -->
 </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.318">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>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.318">setCatalogJanitorEnabled</a>(boolean&nbsp;p_catalogJanitorEnabled)</pre>
 </li>
 </ul>
-<a name="setFormat(java.lang.String)">
+<a name="setFrags(java.util.Map)">
 <!--   -->
 </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.325">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>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.325">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="setServers(java.util.List)">
+<a name="setMetaLocation(org.apache.hadoop.hbase.ServerName)">
 <!--   -->
 </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>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.332">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="constructImpl(java.lang.Class)">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 7dfbf10..c2de943 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="filter">
+<a name="format">
 <!--   -->
 </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.63">filter</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.63">format</a></pre>
 </li>
 </ul>
-<a name="catalogJanitorEnabled">
+<a name="assignmentManager">
 <!--   -->
 </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.64">catalogJanitorEnabled</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.64">assignmentManager</a></pre>
 </li>
 </ul>
-<a name="metaLocation">
+<a name="filter">
 <!--   -->
 </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>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.65">filter</a></pre>
 </li>
 </ul>
-<a name="frags">
+<a name="servers">
 <!--   -->
 </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.66">frags</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.66">servers</a></pre>
 </li>
 </ul>
-<a name="serverManager">
+<a name="deadServers">
 <!--   -->
 </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.67">serverManager</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.67">deadServers</a></pre>
 </li>
 </ul>
-<a name="deadServers">
+<a name="serverManager">
 <!--   -->
 </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.68">deadServers</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.68">serverManager</a></pre>
 </li>
 </ul>
-<a name="assignmentManager">
+<a name="catalogJanitorEnabled">
 <!--   -->
 </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.69">assignmentManager</a></pre>
+<h4>catalogJanitorEnabled</h4>
+<pre>private final&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmplImpl.html#line.69">catalogJanitorEnabled</a></pre>
 </li>
 </ul>
-<a name="format">
+<a name="frags">
 <!--   -->
 </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.70">format</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.70">frags</a></pre>
 </li>
 </ul>
-<a name="servers">
+<a name="metaLocation">
 <!--   -->
 </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>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.71">metaLocation</a></pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 6f37c59..9013517 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_bcv">
+<a name="m_format">
 <!--   -->
 </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.83">m_bcv</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.83">m_format</a></pre>
 </li>
 </ul>
-<a name="m_bcv__IsNotDefault">
+<a name="m_format__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.88">m_bcv__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.88">m_format__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_bcn">
+<a name="m_filter">
 <!--   -->
 </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_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.100">m_filter</a></pre>
 </li>
 </ul>
-<a name="m_bcn__IsNotDefault">
+<a name="m_filter__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_filter__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.105">m_filter__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_format">
+<a name="m_bcv">
 <!--   -->
 </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.117">m_format</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.117">m_bcv</a></pre>
 </li>
 </ul>
-<a name="m_format__IsNotDefault">
+<a name="m_bcv__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.122">m_format__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.122">m_bcv__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_filter">
+<a name="m_bcn">
 <!--   -->
 </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_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.134">m_bcn</a></pre>
 </li>
 </ul>
-<a name="m_filter__IsNotDefault">
+<a name="m_bcn__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_bcn__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.139">m_bcn__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="setBcv(java.lang.String)">
+<a name="setFormat(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.73">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>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>
 </li>
 </ul>
-<a name="getBcv()">
+<a name="getFormat()">
 <!--   -->
 </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.79">getBcv</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.79">getFormat</a>()</pre>
 </li>
 </ul>
-<a name="getBcv__IsNotDefault()">
+<a name="getFormat__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.84">getBcv__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.84">getFormat__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setBcn(java.lang.String)">
+<a name="setFilter(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>setFilter</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.90">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="getBcn()">
+<a name="getFilter()">
 <!--   -->
 </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>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.96">getFilter</a>()</pre>
 </li>
 </ul>
-<a name="getBcn__IsNotDefault()">
+<a name="getFilter__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>getFilter__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.101">getFilter__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setFormat(java.lang.String)">
+<a name="setBcv(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.107">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>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>
 </li>
 </ul>
-<a name="getFormat()">
+<a name="getBcv()">
 <!--   -->
 </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.113">getFormat</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.113">getBcv</a>()</pre>
 </li>
 </ul>
-<a name="getFormat__IsNotDefault()">
+<a name="getBcv__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.118">getFormat__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.118">getBcv__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setFilter(java.lang.String)">
+<a name="setBcn(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>setBcn</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.124">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="getFilter()">
+<a name="getBcn()">
 <!--   -->
 </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>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.130">getBcn</a>()</pre>
 </li>
 </ul>
-<a name="getFilter__IsNotDefault()">
+<a name="getBcn__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>getBcn__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/regionserver/RSStatusTmpl.ImplData.html#line.135">getBcn__IsNotDefault</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 6d53054..7dad6c4 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="bcv">
+<a name="format">
 <!--   -->
 </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.151">bcv</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.151">format</a></pre>
 </li>
 </ul>
-<a name="bcn">
+<a name="filter">
 <!--   -->
 </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>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.158">filter</a></pre>
 </li>
 </ul>
-<a name="format">
+<a name="bcv">
 <!--   -->
 </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.165">format</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.165">bcv</a></pre>
 </li>
 </ul>
-<a name="filter">
+<a name="bcn">
 <!--   -->
 </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>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.172">bcn</a></pre>
 </li>
 </ul>
 </li>
@@ -388,40 +388,40 @@ extends org.jamon.AbstractTemplateProxy</pre>
 </dl>
 </li>
 </ul>
-<a name="setBcv(java.lang.String)">
+<a name="setFormat(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.152">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>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>
 </li>
 </ul>
-<a name="setBcn(java.lang.String)">
+<a name="setFilter(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>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.159">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="setFormat(java.lang.String)">
+<a name="setBcv(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.166">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>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>
 </li>
 </ul>
-<a name="setFilter(java.lang.String)">
+<a name="setBcn(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>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.173">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="constructImpl(java.lang.Class)">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 c56cb96..e27531a 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="bcv">
+<a name="format">
 <!--   -->
 </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.29">bcv</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.29">format</a></pre>
 </li>
 </ul>
-<a name="bcn">
+<a name="filter">
 <!--   -->
 </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>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.30">filter</a></pre>
 </li>
 </ul>
-<a name="format">
+<a name="bcv">
 <!--   -->
 </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.31">format</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.31">bcv</a></pre>
 </li>
 </ul>
-<a name="filter">
+<a name="bcn">
 <!--   -->
 </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>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.32">bcn</a></pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/util/CollectionBackedScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/CollectionBackedScanner.html b/devapidocs/org/apache/hadoop/hbase/util/CollectionBackedScanner.html
index e3a3464..0115163 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/CollectionBackedScanner.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/CollectionBackedScanner.html
@@ -110,10 +110,9 @@
 <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 class <a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.37">CollectionBackedScanner</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.36">CollectionBackedScanner</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/NonReversedNonLazyKeyValueScanner.html" title="class in org.apache.hadoop.hbase.regionserver">NonReversedNonLazyKeyValueScanner</a></pre>
-<div class="block">Utility scanner that wraps a sortable collection and serves
- as a KeyValueScanner.</div>
+<div class="block">Utility scanner that wraps a sortable collection and serves as a KeyValueScanner.</div>
 </li>
 </ul>
 </div>
@@ -284,7 +283,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/NonReversed
 <ul class="blockList">
 <li class="blockList">
 <h4>data</h4>
-<pre>private final&nbsp;<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="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.38">data</a></pre>
+<pre>private final&nbsp;<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="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.37">data</a></pre>
 </li>
 </ul>
 <a name="comparator">
@@ -293,7 +292,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/NonReversed
 <ul class="blockList">
 <li class="blockList">
 <h4>comparator</h4>
-<pre>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/util/CollectionBackedScanner.html#line.39">comparator</a></pre>
+<pre>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/util/CollectionBackedScanner.html#line.38">comparator</a></pre>
 </li>
 </ul>
 <a name="iter">
@@ -302,7 +301,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/NonReversed
 <ul class="blockList">
 <li class="blockList">
 <h4>iter</h4>
-<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html?is-external=true" title="class or interface in java.util">Iterator</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/util/CollectionBackedScanner.html#line.40">iter</a></pre>
+<pre>private&nbsp;<a href="http://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html?is-external=true" title="class or interface in java.util">Iterator</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/util/CollectionBackedScanner.html#line.39">iter</a></pre>
 </li>
 </ul>
 <a name="current">
@@ -311,7 +310,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/NonReversed
 <ul class="blockListLast">
 <li class="blockList">
 <h4>current</h4>
-<pre>private&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/util/CollectionBackedScanner.html#line.41">current</a></pre>
+<pre>private&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/util/CollectionBackedScanner.html#line.40">current</a></pre>
 </li>
 </ul>
 </li>
@@ -328,7 +327,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/NonReversed
 <ul class="blockList">
 <li class="blockList">
 <h4>CollectionBackedScanner</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.43">CollectionBackedScanner</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/SortedSet.html?is-external=true" title="class or interface in java.util">SortedSet</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;set)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.42">CollectionBackedScanner</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/SortedSet.html?is-external=true" title="class or interface in java.util">SortedSet</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;set)</pre>
 </li>
 </ul>
 <a name="CollectionBackedScanner(java.util.SortedSet, org.apache.hadoop.hbase.CellComparator)">
@@ -337,7 +336,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/NonReversed
 <ul class="blockList">
 <li class="blockList">
 <h4>CollectionBackedScanner</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.47">CollectionBackedScanner</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/SortedSet.html?is-external=true" title="class or interface in java.util">SortedSet</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;set,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.46">CollectionBackedScanner</a>(<a href="http://docs.oracle.com/javase/7/docs/api/java/util/SortedSet.html?is-external=true" title="class or interface in java.util">SortedSet</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;set,
                        <a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&nbsp;comparator)</pre>
 </li>
 </ul>
@@ -347,7 +346,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/NonReversed
 <ul class="blockList">
 <li class="blockList">
 <h4>CollectionBackedScanner</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.54">CollectionBackedScanner</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;list)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.53">CollectionBackedScanner</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;list)</pre>
 </li>
 </ul>
 <a name="CollectionBackedScanner(java.util.List, org.apache.hadoop.hbase.CellComparator)">
@@ -356,7 +355,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/NonReversed
 <ul class="blockList">
 <li class="blockList">
 <h4>CollectionBackedScanner</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.58">CollectionBackedScanner</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;list,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.57">CollectionBackedScanner</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;list,
                        <a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&nbsp;comparator)</pre>
 </li>
 </ul>
@@ -366,7 +365,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/NonReversed
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CollectionBackedScanner</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.66">CollectionBackedScanner</a>(<a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&nbsp;comparator,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.65">CollectionBackedScanner</a>(<a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&nbsp;comparator,
                        <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>...&nbsp;array)</pre>
 </li>
 </ul>
@@ -384,7 +383,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/NonReversed
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.77">init</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.76">init</a>()</pre>
 </li>
 </ul>
 <a name="peek()">
@@ -393,7 +392,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/NonReversed
 <ul class="blockList">
 <li class="blockList">
 <h4>peek</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.85">peek</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.84">peek</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#peek()">KeyValueScanner</a></code></strong></div>
 <div class="block">Look at the next Cell in this scanner, but do not iterate scanner.</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>the next Cell</dd></dl>
@@ -405,7 +404,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/NonReversed
 <ul class="blockList">
 <li class="blockList">
 <h4>next</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.90">next</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.89">next</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#next()">KeyValueScanner</a></code></strong></div>
 <div class="block">Return the next Cell in this scanner, iterating the scanner</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>the next Cell</dd></dl>
@@ -417,7 +416,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/NonReversed
 <ul class="blockList">
 <li class="blockList">
 <h4>seek</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.101">seek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;seekCell)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.100">seek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;seekCell)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#seek(org.apache.hadoop.hbase.Cell)">KeyValueScanner</a></code></strong></div>
 <div class="block">Seek the scanner at or after the specified KeyValue.</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>seekCell</code> - seek value</dd>
@@ -430,7 +429,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/NonReversed
 <ul class="blockList">
 <li class="blockList">
 <h4>reseek</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.108">reseek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;seekCell)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.107">reseek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;seekCell)</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#reseek(org.apache.hadoop.hbase.Cell)">KeyValueScanner</a></code></strong></div>
 <div class="block">Reseek the scanner at or after the specified KeyValue.
  This method is guaranteed to seek at or after the required key only if the
@@ -446,7 +445,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/NonReversed
 <ul class="blockList">
 <li class="blockList">
 <h4>getSequenceID</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.121">getSequenceID</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.120">getSequenceID</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#getSequenceID()">KeyValueScanner</a></code></strong></div>
 <div class="block">Get the sequence id associated with this KeyValueScanner. This is required
  for comparing multiple files to find out which one has the latest data.
@@ -460,7 +459,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/NonReversed
 <ul class="blockListLast">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.126">close</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/CollectionBackedScanner.html#line.125">close</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#close()">KeyValueScanner</a></code></strong></div>
 <div class="block">Close the KeyValue scanner.</div>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/util/package-summary.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-summary.html b/devapidocs/org/apache/hadoop/hbase/util/package-summary.html
index 57f43f3..c58ef6a 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-summary.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-summary.html
@@ -405,8 +405,7 @@
 <tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/CollectionBackedScanner.html" title="class in org.apache.hadoop.hbase.util">CollectionBackedScanner</a></td>
 <td class="colLast">
-<div class="block">Utility scanner that wraps a sortable collection and serves
- as a KeyValueScanner.</div>
+<div class="block">Utility scanner that wraps a sortable collection and serves as a KeyValueScanner.</div>
 </td>
 </tr>
 <tr class="altColor">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 ab5bcd5..0d2de9f 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -472,14 +472,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.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/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/FanOutOneBlockAsyncDFSOutput.State.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">FanOutOneBlockAsyncDFSOutput.State</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/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">PrettyPrinter.Unit</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">Order</span></a></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/FanOutOneBlockAsyncDFSOutput.State.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">FanOutOneBlockAsyncDFSOutput.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="strong">PrettyPrinter.Unit</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 8260133..2cda76d 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/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/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/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/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal"><span class="strong">WALFactory.Providers</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/overview-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/overview-tree.html b/devapidocs/overview-tree.html
index e055aaa..4f65443 100644
--- a/devapidocs/overview-tree.html
+++ b/devapidocs/overview-tree.html
@@ -767,7 +767,6 @@
 <ul>
 <li type="circle">io.netty.channel.ChannelInboundHandlerAdapter (implements io.netty.channel.ChannelInboundHandler)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html" title="class in org.apache.hadoop.hbase.ipc"><span class="strong">AsyncServerResponseHandler</span></a></li>
 <li type="circle">io.netty.channel.ChannelDuplexHandler (implements io.netty.channel.ChannelOutboundHandler)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="org/apache/hadoop/hbase/security/SaslClientHandler.html" title="class in org.apache.hadoop.hbase.security"><span class="strong">SaslClientHandler</span></a></li>
@@ -775,6 +774,7 @@
 </li>
 <li type="circle">io.netty.channel.SimpleChannelInboundHandler&lt;I&gt;
 <ul>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/AsyncServerResponseHandler.html" title="class in org.apache.hadoop.hbase.ipc"><span class="strong">AsyncServerResponseHandler</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/ClusterStatusListener.MulticastListener.ClusterStatusHandler.html" title="class in org.apache.hadoop.hbase.client"><span class="strong">ClusterStatusListener.MulticastListener.ClusterStatusHandler</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/CellComparator.MetaCellComparator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/CellComparator.MetaCellComparator.html b/devapidocs/src-html/org/apache/hadoop/hbase/CellComparator.MetaCellComparator.html
index c2faac4..8af4695 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/CellComparator.MetaCellComparator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/CellComparator.MetaCellComparator.html
@@ -441,7 +441,7 @@
 <span class="sourceLineNo">433</span>  /**<a name="line.433"></a>
 <span class="sourceLineNo">434</span>   * Used to compare two cells based on the column hint provided. This is specifically<a name="line.434"></a>
 <span class="sourceLineNo">435</span>   * used when we need to optimize the seeks based on the next indexed key. This is an<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * advance usage API specifically needed for some optimizations.<a name="line.436"></a>
+<span class="sourceLineNo">436</span>   * advanced usage API specifically needed for some optimizations.<a name="line.436"></a>
 <span class="sourceLineNo">437</span>   * @param nextIndexedCell the next indexed cell <a name="line.437"></a>
 <span class="sourceLineNo">438</span>   * @param currentCell the cell to be compared<a name="line.438"></a>
 <span class="sourceLineNo">439</span>   * @param foff the family offset of the currentCell<a name="line.439"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/CellComparator.RowComparator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/CellComparator.RowComparator.html b/devapidocs/src-html/org/apache/hadoop/hbase/CellComparator.RowComparator.html
index c2faac4..8af4695 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/CellComparator.RowComparator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/CellComparator.RowComparator.html
@@ -441,7 +441,7 @@
 <span class="sourceLineNo">433</span>  /**<a name="line.433"></a>
 <span class="sourceLineNo">434</span>   * Used to compare two cells based on the column hint provided. This is specifically<a name="line.434"></a>
 <span class="sourceLineNo">435</span>   * used when we need to optimize the seeks based on the next indexed key. This is an<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * advance usage API specifically needed for some optimizations.<a name="line.436"></a>
+<span class="sourceLineNo">436</span>   * advanced usage API specifically needed for some optimizations.<a name="line.436"></a>
 <span class="sourceLineNo">437</span>   * @param nextIndexedCell the next indexed cell <a name="line.437"></a>
 <span class="sourceLineNo">438</span>   * @param currentCell the cell to be compared<a name="line.438"></a>
 <span class="sourceLineNo">439</span>   * @param foff the family offset of the currentCell<a name="line.439"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/CellComparator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/CellComparator.html b/devapidocs/src-html/org/apache/hadoop/hbase/CellComparator.html
index c2faac4..8af4695 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/CellComparator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/CellComparator.html
@@ -441,7 +441,7 @@
 <span class="sourceLineNo">433</span>  /**<a name="line.433"></a>
 <span class="sourceLineNo">434</span>   * Used to compare two cells based on the column hint provided. This is specifically<a name="line.434"></a>
 <span class="sourceLineNo">435</span>   * used when we need to optimize the seeks based on the next indexed key. This is an<a name="line.435"></a>
-<span class="sourceLineNo">436</span>   * advance usage API specifically needed for some optimizations.<a name="line.436"></a>
+<span class="sourceLineNo">436</span>   * advanced usage API specifically needed for some optimizations.<a name="line.436"></a>
 <span class="sourceLineNo">437</span>   * @param nextIndexedCell the next indexed cell <a name="line.437"></a>
 <span class="sourceLineNo">438</span>   * @param currentCell the cell to be compared<a name="line.438"></a>
 <span class="sourceLineNo">439</span>   * @param foff the family offset of the currentCell<a name="line.439"></a>


[32/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html
index 9e42ac9..054df6f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallTracker.html
@@ -71,411 +71,413 @@
 <span class="sourceLineNo">063</span>  private static final String MEMLOAD_BASE = "memstoreLoad_";<a name="line.63"></a>
 <span class="sourceLineNo">064</span>  private static final String HEAP_BASE = "heapOccupancy_";<a name="line.64"></a>
 <span class="sourceLineNo">065</span>  private static final String CACHE_BASE = "cacheDroppingExceptions_";<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  private static final String CLIENT_SVC = ClientService.getDescriptor().getName();<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  /** A container class for collecting details about the RPC call as it percolates. */<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  public static class CallStats {<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    private long requestSizeBytes = 0;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    private long responseSizeBytes = 0;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    private long startTime = 0;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    private long callTimeMs = 0;<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>    public long getRequestSizeBytes() {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      return requestSizeBytes;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    }<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public void setRequestSizeBytes(long requestSizeBytes) {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      this.requestSizeBytes = requestSizeBytes;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    }<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>    public long getResponseSizeBytes() {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      return responseSizeBytes;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    }<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>    public void setResponseSizeBytes(long responseSizeBytes) {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      this.responseSizeBytes = responseSizeBytes;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    }<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>    public long getStartTime() {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      return startTime;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>    public void setStartTime(long startTime) {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>      this.startTime = startTime;<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>    public long getCallTimeMs() {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      return callTimeMs;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    }<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>    public void setCallTimeMs(long callTimeMs) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      this.callTimeMs = callTimeMs;<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><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @VisibleForTesting<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  protected static final class CallTracker {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    private final String name;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    @VisibleForTesting final Timer callTimer;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    @VisibleForTesting final Histogram reqHist;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    @VisibleForTesting final Histogram respHist;<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    private CallTracker(MetricRegistry registry, String name, String subName, String scope) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      StringBuilder sb = new StringBuilder(CLIENT_SVC).append("_").append(name);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      if (subName != null) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        sb.append("(").append(subName).append(")");<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      }<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      this.name = sb.toString();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      this.callTimer = registry.timer(name(MetricsConnection.class,<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        DRTN_BASE + this.name, scope));<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      this.reqHist = registry.histogram(name(MetricsConnection.class,<a name="line.123"></a>
-<span class="sourceLineNo">124</span>        REQ_BASE + this.name, scope));<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      this.respHist = registry.histogram(name(MetricsConnection.class,<a name="line.125"></a>
-<span class="sourceLineNo">126</span>        RESP_BASE + this.name, scope));<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>    private CallTracker(MetricRegistry registry, String name, String scope) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      this(registry, name, null, scope);<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>    public void updateRpc(CallStats stats) {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      this.callTimer.update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      this.reqHist.update(stats.getRequestSizeBytes());<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      this.respHist.update(stats.getResponseSizeBytes());<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>    @Override<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    public String toString() {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      return "CallTracker:" + name;<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>  protected static class RegionStats {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    final String name;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    final Histogram memstoreLoadHist;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    final Histogram heapOccupancyHist;<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    public RegionStats(MetricRegistry registry, String name) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      this.name = name;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      this.memstoreLoadHist = registry.histogram(name(MetricsConnection.class,<a name="line.152"></a>
-<span class="sourceLineNo">153</span>          MEMLOAD_BASE + this.name));<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      this.heapOccupancyHist = registry.histogram(name(MetricsConnection.class,<a name="line.154"></a>
-<span class="sourceLineNo">155</span>          HEAP_BASE + this.name));<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>    public void update(ClientProtos.RegionLoadStats regionStatistics) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      this.memstoreLoadHist.update(regionStatistics.getMemstoreLoad());<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      this.heapOccupancyHist.update(regionStatistics.getHeapOccupancy());<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    }<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>  protected static class RunnerStats {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    final Counter normalRunners;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    final Counter delayRunners;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    final Histogram delayIntevalHist;<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    public RunnerStats(MetricRegistry registry) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      this.normalRunners = registry.counter(<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        name(MetricsConnection.class, "normalRunnersCount"));<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      this.delayRunners = registry.counter(<a name="line.173"></a>
-<span class="sourceLineNo">174</span>        name(MetricsConnection.class, "delayRunnersCount"));<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      this.delayIntevalHist = registry.histogram(<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        name(MetricsConnection.class, "delayIntervalHist"));<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    public void incrNormalRunners() {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      this.normalRunners.inc();<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>    public void incrDelayRunners() {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      this.delayRunners.inc();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    public void updateDelayInterval(long interval) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      this.delayIntevalHist.update(interval);<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><a name="line.191"></a>
-<span class="sourceLineNo">192</span>  @VisibleForTesting<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  protected ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt; serverStats<a name="line.193"></a>
-<span class="sourceLineNo">194</span>          = new ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt;();<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>  public void updateServerStats(ServerName serverName, byte[] regionName,<a name="line.196"></a>
-<span class="sourceLineNo">197</span>                                Object r) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    if (!(r instanceof Result)) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      return;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    Result result = (Result) r;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    ClientProtos.RegionLoadStats stats = result.getStats();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    if (stats == null) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      return;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    updateRegionStats(serverName, regionName, stats);<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>  @Override<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  public void updateRegionStats(ServerName serverName, byte[] regionName,<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ClientProtos.RegionLoadStats stats) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    String name = serverName.getServerName() + "," + Bytes.toStringBinary(regionName);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ConcurrentMap&lt;byte[], RegionStats&gt; rsStats = null;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    if (serverStats.containsKey(serverName)) {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      rsStats = serverStats.get(serverName);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    } else {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      rsStats = serverStats.putIfAbsent(serverName,<a name="line.217"></a>
-<span class="sourceLineNo">218</span>          new ConcurrentSkipListMap&lt;byte[], RegionStats&gt;(Bytes.BYTES_COMPARATOR));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      if (rsStats == null) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        rsStats = serverStats.get(serverName);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    RegionStats regionStats = null;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    if (rsStats.containsKey(regionName)) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      regionStats = rsStats.get(regionName);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    } else {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      regionStats = rsStats.putIfAbsent(regionName, new RegionStats(this.registry, name));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      if (regionStats == null) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>        regionStats = rsStats.get(regionName);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      }<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    regionStats.update(stats);<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">066</span>  private static final String UNKNOWN_EXCEPTION = "UnknownException";<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  private static final String CLIENT_SVC = ClientService.getDescriptor().getName();<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>  /** A container class for collecting details about the RPC call as it percolates. */<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  public static class CallStats {<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    private long requestSizeBytes = 0;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    private long responseSizeBytes = 0;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    private long startTime = 0;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    private long callTimeMs = 0;<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>    public long getRequestSizeBytes() {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      return requestSizeBytes;<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>    public void setRequestSizeBytes(long requestSizeBytes) {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>      this.requestSizeBytes = requestSizeBytes;<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>    public long getResponseSizeBytes() {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      return responseSizeBytes;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    }<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>    public void setResponseSizeBytes(long responseSizeBytes) {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      this.responseSizeBytes = responseSizeBytes;<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">092</span>    public long getStartTime() {<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      return startTime;<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>    public void setStartTime(long startTime) {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      this.startTime = startTime;<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>    public long getCallTimeMs() {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      return callTimeMs;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>    public void setCallTimeMs(long callTimeMs) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      this.callTimeMs = callTimeMs;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    }<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  }<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  @VisibleForTesting<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  protected static final class CallTracker {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    private final String name;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    @VisibleForTesting final Timer callTimer;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    @VisibleForTesting final Histogram reqHist;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    @VisibleForTesting final Histogram respHist;<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>    private CallTracker(MetricRegistry registry, String name, String subName, String scope) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      StringBuilder sb = new StringBuilder(CLIENT_SVC).append("_").append(name);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      if (subName != null) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        sb.append("(").append(subName).append(")");<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      }<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      this.name = sb.toString();<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      this.callTimer = registry.timer(name(MetricsConnection.class,<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        DRTN_BASE + this.name, scope));<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      this.reqHist = registry.histogram(name(MetricsConnection.class,<a name="line.124"></a>
+<span class="sourceLineNo">125</span>        REQ_BASE + this.name, scope));<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      this.respHist = registry.histogram(name(MetricsConnection.class,<a name="line.126"></a>
+<span class="sourceLineNo">127</span>        RESP_BASE + this.name, scope));<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>    private CallTracker(MetricRegistry registry, String name, String scope) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      this(registry, name, null, scope);<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>    public void updateRpc(CallStats stats) {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      this.callTimer.update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      this.reqHist.update(stats.getRequestSizeBytes());<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      this.respHist.update(stats.getResponseSizeBytes());<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>    @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    public String toString() {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      return "CallTracker:" + name;<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><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  protected static class RegionStats {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    final String name;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    final Histogram memstoreLoadHist;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    final Histogram heapOccupancyHist;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>    public RegionStats(MetricRegistry registry, String name) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      this.name = name;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      this.memstoreLoadHist = registry.histogram(name(MetricsConnection.class,<a name="line.153"></a>
+<span class="sourceLineNo">154</span>          MEMLOAD_BASE + this.name));<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      this.heapOccupancyHist = registry.histogram(name(MetricsConnection.class,<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          HEAP_BASE + this.name));<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>    public void update(ClientProtos.RegionLoadStats regionStatistics) {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      this.memstoreLoadHist.update(regionStatistics.getMemstoreLoad());<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      this.heapOccupancyHist.update(regionStatistics.getHeapOccupancy());<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><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  @VisibleForTesting<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  protected static class RunnerStats {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    final Counter normalRunners;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    final Counter delayRunners;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    final Histogram delayIntevalHist;<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    public RunnerStats(MetricRegistry registry) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      this.normalRunners = registry.counter(<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        name(MetricsConnection.class, "normalRunnersCount"));<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      this.delayRunners = registry.counter(<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        name(MetricsConnection.class, "delayRunnersCount"));<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      this.delayIntevalHist = registry.histogram(<a name="line.176"></a>
+<span class="sourceLineNo">177</span>        name(MetricsConnection.class, "delayIntervalHist"));<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
+<span class="sourceLineNo">179</span><a name="line.179"></a>
+<span class="sourceLineNo">180</span>    public void incrNormalRunners() {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      this.normalRunners.inc();<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
+<span class="sourceLineNo">183</span><a name="line.183"></a>
+<span class="sourceLineNo">184</span>    public void incrDelayRunners() {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      this.delayRunners.inc();<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public void updateDelayInterval(long interval) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      this.delayIntevalHist.update(interval);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  }<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>  @VisibleForTesting<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  protected ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt; serverStats<a name="line.194"></a>
+<span class="sourceLineNo">195</span>          = new ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt;();<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>  public void updateServerStats(ServerName serverName, byte[] regionName,<a name="line.197"></a>
+<span class="sourceLineNo">198</span>                                Object r) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    if (!(r instanceof Result)) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      return;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    Result result = (Result) r;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    ClientProtos.RegionLoadStats stats = result.getStats();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    if (stats == null) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      return;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    updateRegionStats(serverName, regionName, stats);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  @Override<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public void updateRegionStats(ServerName serverName, byte[] regionName,<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ClientProtos.RegionLoadStats stats) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    String name = serverName.getServerName() + "," + Bytes.toStringBinary(regionName);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ConcurrentMap&lt;byte[], RegionStats&gt; rsStats = null;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    if (serverStats.containsKey(serverName)) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      rsStats = serverStats.get(serverName);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    } else {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      rsStats = serverStats.putIfAbsent(serverName,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>          new ConcurrentSkipListMap&lt;byte[], RegionStats&gt;(Bytes.BYTES_COMPARATOR));<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      if (rsStats == null) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        rsStats = serverStats.get(serverName);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    RegionStats regionStats = null;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    if (rsStats.containsKey(regionName)) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      regionStats = rsStats.get(regionName);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    } else {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      regionStats = rsStats.putIfAbsent(regionName, new RegionStats(this.registry, name));<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      if (regionStats == null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        regionStats = rsStats.get(regionName);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      }<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    regionStats.update(stats);<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>  /** A lambda for dispatching to the appropriate metric factory method */<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  private static interface NewMetric&lt;T&gt; {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    T newMetric(Class&lt;?&gt; clazz, String name, String scope);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>  /** Anticipated number of metric entries */<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  private static final int CAPACITY = 50;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>  /** Default load factor from {@link java.util.HashMap#DEFAULT_LOAD_FACTOR} */<a name="line.243"></a>
-<span class="sourceLineNo">244</span>  private static final float LOAD_FACTOR = 0.75f;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /**<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * Anticipated number of concurrent accessor threads, from<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * {@link ConnectionImplementation#getBatchPool()}<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   */<a name="line.248"></a>
-<span class="sourceLineNo">249</span>  private static final int CONCURRENCY_LEVEL = 256;<a name="line.249"></a>
-<span class="sourceLineNo">250</span><a name="line.250"></a>
-<span class="sourceLineNo">251</span>  private final MetricRegistry registry;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  private final JmxReporter reporter;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  private final String scope;<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private final NewMetric&lt;Timer&gt; timerFactory = new NewMetric&lt;Timer&gt;() {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    @Override public Timer newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      return registry.timer(name(clazz, name, scope));<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>  private final NewMetric&lt;Histogram&gt; histogramFactory = new NewMetric&lt;Histogram&gt;() {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    @Override public Histogram newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return registry.histogram(name(clazz, name, scope));<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  };<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  private final NewMetric&lt;Counter&gt; counterFactory = new NewMetric&lt;Counter&gt;() {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    @Override public Counter newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      return registry.counter(name(clazz, name, scope));<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  };<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  // static metrics<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>  @VisibleForTesting protected final Counter metaCacheHits;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  @VisibleForTesting protected final Counter metaCacheMisses;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  @VisibleForTesting protected final CallTracker getTracker;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @VisibleForTesting protected final CallTracker scanTracker;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  @VisibleForTesting protected final CallTracker appendTracker;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  @VisibleForTesting protected final CallTracker deleteTracker;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  @VisibleForTesting protected final CallTracker incrementTracker;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  @VisibleForTesting protected final CallTracker putTracker;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @VisibleForTesting protected final CallTracker multiTracker;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  @VisibleForTesting protected final RunnerStats runnerStats;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  private final Counter metaCacheNumClearServer;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  private final Counter metaCacheNumClearRegion;<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // dynamic metrics<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>  // These maps are used to cache references to the metric instances that are managed by the<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // registry. I don't think their use perfectly removes redundant allocations, but it's<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  // a big improvement over calling registry.newMetric each time.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Timer&gt; rpcTimers =<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Histogram&gt; rpcHistograms =<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY * 2 /* tracking both request and response sizes */,<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  private final ConcurrentMap&lt;String, Counter&gt; cacheDroppingExceptions =<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>  public MetricsConnection(final ConnectionImplementation conn) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    this.scope = conn.toString();<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    this.registry = new MetricRegistry();<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    final ThreadPoolExecutor batchPool = (ThreadPoolExecutor) conn.getCurrentBatchPool();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    final ThreadPoolExecutor metaPool = (ThreadPoolExecutor) conn.getCurrentMetaLookupPool();<a name="line.305"></a>
-<span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>    this.registry.register(name(this.getClass(), "executorPoolActiveThreads", scope),<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        new RatioGauge() {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>          @Override<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          protected Ratio getRatio() {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>            return Ratio.of(batchPool.getActiveCount(), batchPool.getMaximumPoolSize());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          }<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        });<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    this.registry.register(name(this.getClass(), "metaPoolActiveThreads", scope),<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        new RatioGauge() {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>          @Override<a name="line.316"></a>
-<span class="sourceLineNo">317</span>          protected Ratio getRatio() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>            return Ratio.of(metaPool.getActiveCount(), metaPool.getMaximumPoolSize());<a name="line.318"></a>
-<span class="sourceLineNo">319</span>          }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        });<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    this.metaCacheHits = registry.counter(name(this.getClass(), "metaCacheHits", scope));<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    this.metaCacheMisses = registry.counter(name(this.getClass(), "metaCacheMisses", scope));<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    this.metaCacheNumClearServer = registry.counter(name(this.getClass(),<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      "metaCacheNumClearServer", scope));<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    this.metaCacheNumClearRegion = registry.counter(name(this.getClass(),<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      "metaCacheNumClearRegion", scope));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    this.getTracker = new CallTracker(this.registry, "Get", scope);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    this.scanTracker = new CallTracker(this.registry, "Scan", scope);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    this.appendTracker = new CallTracker(this.registry, "Mutate", "Append", scope);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    this.deleteTracker = new CallTracker(this.registry, "Mutate", "Delete", scope);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    this.incrementTracker = new CallTracker(this.registry, "Mutate", "Increment", scope);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    this.putTracker = new CallTracker(this.registry, "Mutate", "Put", scope);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    this.multiTracker = new CallTracker(this.registry, "Multi", scope);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    this.runnerStats = new RunnerStats(this.registry);<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    this.reporter = JmxReporter.forRegistry(this.registry).build();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    this.reporter.start();<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>  public void shutdown() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    this.reporter.stop();<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>  /** Produce an instance of {@link CallStats} for clients to attach to RPCs. */<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  public static CallStats newCallStats() {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    // TODO: instance pool to reduce GC?<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    return new CallStats();<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">350</span>  /** Increment the number of meta cache hits. */<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  public void incrMetaCacheHit() {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    metaCacheHits.inc();<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>  /** Increment the number of meta cache misses. */<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  public void incrMetaCacheMiss() {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    metaCacheMisses.inc();<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>  /** Increment the number of meta cache drops requested for entire RegionServer. */<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  public void incrMetaCacheNumClearServer() {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    metaCacheNumClearServer.inc();<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>  /** Increment the number of meta cache drops requested for individual region. */<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  public void incrMetaCacheNumClearRegion() {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    metaCacheNumClearRegion.inc();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  /** Increment the number of normal runner counts. */<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  public void incrNormalRunners() {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    this.runnerStats.incrNormalRunners();<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  /** Increment the number of delay runner counts. */<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  public void incrDelayRunners() {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    this.runnerStats.incrDelayRunners();<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>  /** Update delay interval of delay runner. */<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public void updateDelayInterval(long interval) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    this.runnerStats.updateDelayInterval(interval);<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>   * Get a metric for {@code key} from {@code map}, or create it with {@code factory}.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   */<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  private &lt;T&gt; T getMetric(String key, ConcurrentMap&lt;String, T&gt; map, NewMetric&lt;T&gt; factory) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    T t = map.get(key);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    if (t == null) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      t = factory.newMetric(this.getClass(), key, scope);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      T tmp = map.putIfAbsent(key, t);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      t = (tmp == null) ? t : tmp;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    }<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    return t;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  }<a name="line.396"></a>
-<span class="sourceLineNo">397</span><a name="line.397"></a>
-<span class="sourceLineNo">398</span>  /** Update call stats for non-critical-path methods */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>  private void updateRpcGeneric(MethodDescriptor method, CallStats stats) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    final String methodName = method.getService().getName() + "_" + method.getName();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    getMetric(DRTN_BASE + methodName, rpcTimers, timerFactory)<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        .update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    getMetric(REQ_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        .update(stats.getRequestSizeBytes());<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    getMetric(RESP_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        .update(stats.getResponseSizeBytes());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>  /** Report RPC context to metrics system. */<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  public void updateRpc(MethodDescriptor method, Message param, CallStats stats) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // this implementation is tied directly to protobuf implementation details. would be better<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // if we could dispatch based on something static, ie, request Message type.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    if (method.getService() == ClientService.getDescriptor()) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      switch(method.getIndex()) {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      case 0:<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        assert "Get".equals(method.getName());<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        getTracker.updateRpc(stats);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        return;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      case 1:<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        assert "Mutate".equals(method.getName());<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        final MutationType mutationType = ((MutateRequest) param).getMutation().getMutateType();<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        switch(mutationType) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        case APPEND:<a name="line.423"></a>
-<span class="sourceLineNo">424</span>          appendTracker.updateRpc(stats);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          return;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        case DELETE:<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          deleteTracker.updateRpc(stats);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          return;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        case INCREMENT:<a name="line.429"></a>
-<span class="sourceLineNo">430</span>          incrementTracker.updateRpc(stats);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>          return;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        case PUT:<a name="line.432"></a>
-<span class="sourceLineNo">433</span>          putTracker.updateRpc(stats);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>          return;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        default:<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          throw new RuntimeException("Unrecognized mutation type " + mutationType);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        }<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      case 2:<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        assert "Scan".equals(method.getName());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        scanTracker.updateRpc(stats);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        return;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      case 3:<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        assert "BulkLoadHFile".equals(method.getName());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        // use generic implementation<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        break;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      case 4:<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        assert "ExecService".equals(method.getName());<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        // use generic implementation<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        break;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      case 5:<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        assert "ExecRegionServerService".equals(method.getName());<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        // use generic implementation<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        break;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      case 6:<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        assert "Multi".equals(method.getName());<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        multiTracker.updateRpc(stats);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        return;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      default:<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        throw new RuntimeException("Unrecognized ClientService RPC type " + method.getFullName());<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      }<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    }<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // Fallback to dynamic registry lookup for DDL methods.<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    updateRpcGeneric(method, stats);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  }<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>  public void incrCacheDroppingExceptions(Object exception) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    getMetric(CACHE_BASE + exception.getClass().getSimpleName(),<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      cacheDroppingExceptions, counterFactory).inc();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>  }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>}<a name="line.470"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /** A lambda for dispatching to the appropriate metric factory method */<a name="line.237"></a>
+<span class="sourceLineNo">238</span>  private static interface NewMetric&lt;T&gt; {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    T newMetric(Class&lt;?&gt; clazz, String name, String scope);<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>  /** Anticipated number of metric entries */<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  private static final int CAPACITY = 50;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  /** Default load factor from {@link java.util.HashMap#DEFAULT_LOAD_FACTOR} */<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  private static final float LOAD_FACTOR = 0.75f;<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  /**<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * Anticipated number of concurrent accessor threads, from<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * {@link ConnectionImplementation#getBatchPool()}<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  private static final int CONCURRENCY_LEVEL = 256;<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  private final MetricRegistry registry;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  private final JmxReporter reporter;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  private final String scope;<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  private final NewMetric&lt;Timer&gt; timerFactory = new NewMetric&lt;Timer&gt;() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    @Override public Timer newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      return registry.timer(name(clazz, name, scope));<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>  private final NewMetric&lt;Histogram&gt; histogramFactory = new NewMetric&lt;Histogram&gt;() {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    @Override public Histogram newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      return registry.histogram(name(clazz, name, scope));<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  };<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  private final NewMetric&lt;Counter&gt; counterFactory = new NewMetric&lt;Counter&gt;() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    @Override public Counter newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      return registry.counter(name(clazz, name, scope));<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span>  };<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>  // static metrics<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @VisibleForTesting protected final Counter metaCacheHits;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @VisibleForTesting protected final Counter metaCacheMisses;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  @VisibleForTesting protected final CallTracker getTracker;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  @VisibleForTesting protected final CallTracker scanTracker;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  @VisibleForTesting protected final CallTracker appendTracker;<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  @VisibleForTesting protected final CallTracker deleteTracker;<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @VisibleForTesting protected final CallTracker incrementTracker;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  @VisibleForTesting protected final CallTracker putTracker;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  @VisibleForTesting protected final CallTracker multiTracker;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  @VisibleForTesting protected final RunnerStats runnerStats;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  private final Counter metaCacheNumClearServer;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  private final Counter metaCacheNumClearRegion;<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>  // dynamic metrics<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>  // These maps are used to cache references to the metric instances that are managed by the<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  // registry. I don't think their use perfectly removes redundant allocations, but it's<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  // a big improvement over calling registry.newMetric each time.<a name="line.293"></a>
+<span class="sourceLineNo">294</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Timer&gt; rpcTimers =<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Histogram&gt; rpcHistograms =<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY * 2 /* tracking both request and response sizes */,<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  private final ConcurrentMap&lt;String, Counter&gt; cacheDroppingExceptions =<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  public MetricsConnection(final ConnectionImplementation conn) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    this.scope = conn.toString();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    this.registry = new MetricRegistry();<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    final ThreadPoolExecutor batchPool = (ThreadPoolExecutor) conn.getCurrentBatchPool();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    final ThreadPoolExecutor metaPool = (ThreadPoolExecutor) conn.getCurrentMetaLookupPool();<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>    this.registry.register(name(this.getClass(), "executorPoolActiveThreads", scope),<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        new RatioGauge() {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>          @Override<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          protected Ratio getRatio() {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            return Ratio.of(batchPool.getActiveCount(), batchPool.getMaximumPoolSize());<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>    this.registry.register(name(this.getClass(), "metaPoolActiveThreads", scope),<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        new RatioGauge() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          @Override<a name="line.317"></a>
+<span class="sourceLineNo">318</span>          protected Ratio getRatio() {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>            return Ratio.of(metaPool.getActiveCount(), metaPool.getMaximumPoolSize());<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>    this.metaCacheHits = registry.counter(name(this.getClass(), "metaCacheHits", scope));<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    this.metaCacheMisses = registry.counter(name(this.getClass(), "metaCacheMisses", scope));<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    this.metaCacheNumClearServer = registry.counter(name(this.getClass(),<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      "metaCacheNumClearServer", scope));<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    this.metaCacheNumClearRegion = registry.counter(name(this.getClass(),<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      "metaCacheNumClearRegion", scope));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    this.getTracker = new CallTracker(this.registry, "Get", scope);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    this.scanTracker = new CallTracker(this.registry, "Scan", scope);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    this.appendTracker = new CallTracker(this.registry, "Mutate", "Append", scope);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    this.deleteTracker = new CallTracker(this.registry, "Mutate", "Delete", scope);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    this.incrementTracker = new CallTracker(this.registry, "Mutate", "Increment", scope);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    this.putTracker = new CallTracker(this.registry, "Mutate", "Put", scope);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    this.multiTracker = new CallTracker(this.registry, "Multi", scope);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    this.runnerStats = new RunnerStats(this.registry);<a name="line.335"></a>
+<span class="sourceLineNo">336</span><a name="line.336"></a>
+<span class="sourceLineNo">337</span>    this.reporter = JmxReporter.forRegistry(this.registry).build();<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    this.reporter.start();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  public void shutdown() {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    this.reporter.stop();<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  /** Produce an instance of {@link CallStats} for clients to attach to RPCs. */<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  public static CallStats newCallStats() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    // TODO: instance pool to reduce GC?<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    return new CallStats();<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>  /** Increment the number of meta cache hits. */<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  public void incrMetaCacheHit() {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    metaCacheHits.inc();<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>  /** Increment the number of meta cache misses. */<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  public void incrMetaCacheMiss() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    metaCacheMisses.inc();<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  }<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span>  /** Increment the number of meta cache drops requested for entire RegionServer. */<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  public void incrMetaCacheNumClearServer() {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    metaCacheNumClearServer.inc();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>  }<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span>  /** Increment the number of meta cache drops requested for individual region. */<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  public void incrMetaCacheNumClearRegion() {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    metaCacheNumClearRegion.inc();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  }<a name="line.369"></a>
+<span class="sourceLineNo">370</span><a name="line.370"></a>
+<span class="sourceLineNo">371</span>  /** Increment the number of normal runner counts. */<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  public void incrNormalRunners() {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    this.runnerStats.incrNormalRunners();<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>  /** Increment the number of delay runner counts. */<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void incrDelayRunners() {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    this.runnerStats.incrDelayRunners();<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>  /** Update delay interval of delay runner. */<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public void updateDelayInterval(long interval) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    this.runnerStats.updateDelayInterval(interval);<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>  /**<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   * Get a metric for {@code key} from {@code map}, or create it with {@code factory}.<a name="line.387"></a>
+<span class="sourceLineNo">388</span>   */<a name="line.388"></a>
+<span class="sourceLineNo">389</span>  private &lt;T&gt; T getMetric(String key, ConcurrentMap&lt;String, T&gt; map, NewMetric&lt;T&gt; factory) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    T t = map.get(key);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    if (t == null) {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      t = factory.newMetric(this.getClass(), key, scope);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      T tmp = map.putIfAbsent(key, t);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      t = (tmp == null) ? t : tmp;<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    return t;<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>  /** Update call stats for non-critical-path methods */<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  private void updateRpcGeneric(MethodDescriptor method, CallStats stats) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    final String methodName = method.getService().getName() + "_" + method.getName();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    getMetric(DRTN_BASE + methodName, rpcTimers, timerFactory)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        .update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    getMetric(REQ_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        .update(stats.getRequestSizeBytes());<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    getMetric(RESP_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        .update(stats.getResponseSizeBytes());<a name="line.407"></a>
+<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
+<span class="sourceLineNo">410</span>  /** Report RPC context to metrics system. */<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public void updateRpc(MethodDescriptor method, Message param, CallStats stats) {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    // this implementation is tied directly to protobuf implementation details. would be better<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    // if we could dispatch based on something static, ie, request Message type.<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (method.getService() == ClientService.getDescriptor()) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      switch(method.getIndex()) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      case 0:<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        assert "Get".equals(method.getName());<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        getTracker.updateRpc(stats);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        return;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      case 1:<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        assert "Mutate".equals(method.getName());<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        final MutationType mutationType = ((MutateRequest) param).getMutation().getMutateType();<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        switch(mutationType) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        case APPEND:<a name="line.424"></a>
+<span class="sourceLineNo">425</span>          appendTracker.updateRpc(stats);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          return;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        case DELETE:<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          deleteTracker.updateRpc(stats);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          return;<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        case INCREMENT:<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          incrementTracker.updateRpc(stats);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          return;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>        case PUT:<a name="line.433"></a>
+<span class="sourceLineNo">434</span>          putTracker.updateRpc(stats);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>          return;<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        default:<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          throw new RuntimeException("Unrecognized mutation type " + mutationType);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        }<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      case 2:<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        assert "Scan".equals(method.getName());<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        scanTracker.updateRpc(stats);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        return;<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      case 3:<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        assert "BulkLoadHFile".equals(method.getName());<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        // use generic implementation<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        break;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      case 4:<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        assert "ExecService".equals(method.getName());<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        // use generic implementation<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        break;<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      case 5:<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        assert "ExecRegionServerService".equals(method.getName());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        // use generic implementation<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        break;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      case 6:<a name="line.455"></a>
+<span class="sourceLineNo">456</span>        assert "Multi".equals(method.getName());<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        multiTracker.updateRpc(stats);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        return;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      default:<a name="line.459"></a>
+<span class="sourceLineNo">460</span>        throw new RuntimeException("Unrecognized ClientService RPC type " + method.getFullName());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      }<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    // Fallback to dynamic registry lookup for DDL methods.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    updateRpcGeneric(method, stats);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  public void incrCacheDroppingExceptions(Object exception) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    getMetric(CACHE_BASE +<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      (exception == null? UNKNOWN_EXCEPTION : exception.getClass().getSimpleName()),<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      cacheDroppingExceptions, counterFactory).inc();<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>}<a name="line.472"></a>
 
 
 


[37/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.BatchErrors.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.BatchErrors.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.BatchErrors.html
index ed7bc7f..e65df71 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.BatchErrors.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.BatchErrors.html
@@ -1198,681 +1198,699 @@
 <span class="sourceLineNo">1190</span>        byte[] row = e.getValue().iterator().next().getAction().getRow();<a name="line.1190"></a>
 <span class="sourceLineNo">1191</span>        // Do not use the exception for updating cache because it might be coming from<a name="line.1191"></a>
 <span class="sourceLineNo">1192</span>        // any of the regions in the MultiAction.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        if (tableName != null) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>          connection.updateCachedLocations(tableName, regionName, row,<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>              ClientExceptionsUtil.isMetaClearingException(t) ? null : t, server);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>        for (Action&lt;Row&gt; action : e.getValue()) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          Retry retry = manageError(<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>              action.getOriginalIndex(), action.getAction(), canRetry, t, server);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (retry == Retry.YES) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            toReplay.add(action);<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            ++stopped;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>          } else {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            ++failed;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>          }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>        }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>      }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      if (toReplay.isEmpty()) {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>        logNoResubmit(server, numAttempt, rsActions.size(), t, failed, stopped);<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>      } else {<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        resubmit(server, toReplay, numAttempt, rsActions.size(), t);<a name="line.1213"></a>
+<span class="sourceLineNo">1193</span>        try {<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          if (tableName != null) {<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>            connection.updateCachedLocations(tableName, regionName, row,<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>              ClientExceptionsUtil.isMetaClearingException(t) ? null : t, server);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>          }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        } catch (Throwable ex) {<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>          // That should never happen, but if it did, we want to make sure<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          // we still process errors<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>          LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        for (Action&lt;Row&gt; action : e.getValue()) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          Retry retry = manageError(<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              action.getOriginalIndex(), action.getAction(), canRetry, t, server);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>          if (retry == Retry.YES) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>            toReplay.add(action);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>            ++stopped;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>            ++failed;<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
 <span class="sourceLineNo">1214</span>      }<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>     * Log as much info as possible, and, if there is something to replay,<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     * submit it again after a back off sleep.<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>     */<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    private void resubmit(ServerName oldServer, List&lt;Action&lt;Row&gt;&gt; toReplay,<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        int numAttempt, int failureCount, Throwable throwable) {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      // We have something to replay. We're going to sleep a little before.<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // We have two contradicting needs here:<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      //  1) We want to get the new location after having slept, as it may change.<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      //  2) We want to take into account the location when calculating the sleep time.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      //  3) If all this is just because the response needed to be chunked try again FAST.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      // It should be possible to have some heuristics to take the right decision. Short term,<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>      //  we go for one.<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      boolean retryImmediately = throwable instanceof RetryImmediatelyException;<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      int nextAttemptNumber = retryImmediately ? numAttempt : numAttempt + 1;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      long backOffTime = retryImmediately ? 0 :<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          errorsByServer.calculateBackoffTime(oldServer, pause);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>      if (numAttempt &gt; startLogErrorsCnt) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        // We use this value to have some logs when we have multiple failures, but not too many<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        //  logs, as errors are to be expected when a region moves, splits and so on<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        LOG.info(createLog(numAttempt, failureCount, toReplay.size(),<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>            oldServer, throwable, backOffTime, true, null, -1, -1));<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      try {<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>        if (backOffTime &gt; 0) {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>          Thread.sleep(backOffTime);<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>        }<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      } catch (InterruptedException e) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>        LOG.warn("#" + id + ", not sent: " + toReplay.size() + " operations, " + oldServer, e);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>        Thread.currentThread().interrupt();<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        return;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>      groupAndSendMultiAction(toReplay, nextAttemptNumber);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    private void logNoResubmit(ServerName oldServer, int numAttempt,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        int failureCount, Throwable throwable, int failed, int stopped) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      if (failureCount != 0 || numAttempt &gt; startLogErrorsCnt + 1) {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>        String timeStr = new Date(errorsByServer.getStartTrackingTime()).toString();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>        String logMessage = createLog(numAttempt, failureCount, 0, oldServer,<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>            throwable, -1, false, timeStr, failed, stopped);<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>        if (failed != 0) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>          // Only log final failures as warning<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>          LOG.warn(logMessage);<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        } else {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>          LOG.info(logMessage);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>        }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    }<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    /**<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>     * Called when we receive the result of a server query.<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>     *<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>     * @param multiAction    - the multiAction we sent<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>     * @param server       - the location. It's used as a server name.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>     * @param responses      - the response, if any<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>     * @param numAttempt     - the attempt<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>     */<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    private void receiveMultiAction(MultiAction&lt;Row&gt; multiAction,<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>        ServerName server, MultiResponse responses, int numAttempt) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>       assert responses != null;<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span><a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      // Success or partial success<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      // Analyze detailed results. We can still have individual failures to be redo.<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      // two specific throwables are managed:<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      //  - DoNotRetryIOException: we continue to retry for other actions<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      //  - RegionMovedException: we update the cache with the new region location<a name="line.1286"></a>
+<span class="sourceLineNo">1215</span><a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      if (toReplay.isEmpty()) {<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>        logNoResubmit(server, numAttempt, rsActions.size(), t, failed, stopped);<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>        resubmit(server, toReplay, numAttempt, rsActions.size(), t);<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    }<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>     * Log as much info as possible, and, if there is something to replay,<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>     * submit it again after a back off sleep.<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    private void resubmit(ServerName oldServer, List&lt;Action&lt;Row&gt;&gt; toReplay,<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        int numAttempt, int failureCount, Throwable throwable) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>      // We have something to replay. We're going to sleep a little before.<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      // We have two contradicting needs here:<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>      //  1) We want to get the new location after having slept, as it may change.<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>      //  2) We want to take into account the location when calculating the sleep time.<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      //  3) If all this is just because the response needed to be chunked try again FAST.<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      // It should be possible to have some heuristics to take the right decision. Short term,<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      //  we go for one.<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      boolean retryImmediately = throwable instanceof RetryImmediatelyException;<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>      int nextAttemptNumber = retryImmediately ? numAttempt : numAttempt + 1;<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      long backOffTime = retryImmediately ? 0 :<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          errorsByServer.calculateBackoffTime(oldServer, pause);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      if (numAttempt &gt; startLogErrorsCnt) {<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>        // We use this value to have some logs when we have multiple failures, but not too many<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>        //  logs, as errors are to be expected when a region moves, splits and so on<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>        LOG.info(createLog(numAttempt, failureCount, toReplay.size(),<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>            oldServer, throwable, backOffTime, true, null, -1, -1));<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      }<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span><a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      try {<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>        if (backOffTime &gt; 0) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>          Thread.sleep(backOffTime);<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>        }<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      } catch (InterruptedException e) {<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>        LOG.warn("#" + id + ", not sent: " + toReplay.size() + " operations, " + oldServer, e);<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>        Thread.currentThread().interrupt();<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>        return;<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span><a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      groupAndSendMultiAction(toReplay, nextAttemptNumber);<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    private void logNoResubmit(ServerName oldServer, int numAttempt,<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        int failureCount, Throwable throwable, int failed, int stopped) {<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>      if (failureCount != 0 || numAttempt &gt; startLogErrorsCnt + 1) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>        String timeStr = new Date(errorsByServer.getStartTrackingTime()).toString();<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>        String logMessage = createLog(numAttempt, failureCount, 0, oldServer,<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>            throwable, -1, false, timeStr, failed, stopped);<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>        if (failed != 0) {<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          // Only log final failures as warning<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          LOG.warn(logMessage);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>        } else {<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>          LOG.info(logMessage);<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>        }<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    }<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span><a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>    /**<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>     * Called when we receive the result of a server query.<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>     *<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>     * @param multiAction    - the multiAction we sent<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>     * @param server       - the location. It's used as a server name.<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>     * @param responses      - the response, if any<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>     * @param numAttempt     - the attempt<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>     */<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    private void receiveMultiAction(MultiAction&lt;Row&gt; multiAction,<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        ServerName server, MultiResponse responses, int numAttempt) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>       assert responses != null;<a name="line.1286"></a>
 <span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      List&lt;Action&lt;Row&gt;&gt; toReplay = new ArrayList&lt;Action&lt;Row&gt;&gt;();<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      Throwable throwable = null;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      int failureCount = 0;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      boolean canRetry = true;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span><a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      Map&lt;byte[], MultiResponse.RegionResult&gt; results = responses.getResults();<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      updateStats(server, results);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      int failed = 0, stopped = 0;<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      // Go by original action.<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      for (Map.Entry&lt;byte[], List&lt;Action&lt;Row&gt;&gt;&gt; regionEntry : multiAction.actions.entrySet()) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        byte[] regionName = regionEntry.getKey();<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>        Map&lt;Integer, Object&gt; regionResults = results.get(regionName) == null<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>            ?  null : results.get(regionName).result;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        if (regionResults == null) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>          if (!responses.getExceptions().containsKey(regionName)) {<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>            LOG.error("Server sent us neither results nor exceptions for "<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>                + Bytes.toStringBinary(regionName));<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>            responses.getExceptions().put(regionName, new RuntimeException("Invalid response"));<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>          }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>          continue;<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>        }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>        boolean regionFailureRegistered = false;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>        for (Action&lt;Row&gt; sentAction : regionEntry.getValue()) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>          Object result = regionResults.get(sentAction.getOriginalIndex());<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>          // Failure: retry if it's make sense else update the errors lists<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>          if (result == null || result instanceof Throwable) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>            Row row = sentAction.getAction();<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>            throwable = ClientExceptionsUtil.findException(result);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>            // Register corresponding failures once per server/once per region.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>            if (!regionFailureRegistered) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>              regionFailureRegistered = true;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>              connection.updateCachedLocations(<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>                  tableName, regionName, row.getRow(), result, server);<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>            }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>            if (failureCount == 0) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>              errorsByServer.reportServerError(server);<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>              // We determine canRetry only once for all calls, after reporting server failure.<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>              canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            }<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            ++failureCount;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>            Retry retry = manageError(sentAction.getOriginalIndex(), row,<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>                canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, (Throwable) result, server);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>            if (retry == Retry.YES) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>              toReplay.add(sentAction);<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>            } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>              ++stopped;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>            } else {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>              ++failed;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>            }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>          } else {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>            if (callback != null) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>              try {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>                //noinspection unchecked<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>                // TODO: would callback expect a replica region name if it gets one?<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>                this.callback.update(regionName, sentAction.getAction().getRow(), (CResult) result);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>              } catch (Throwable t) {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>                LOG.error("User callback threw an exception for "<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>                    + Bytes.toStringBinary(regionName) + ", ignoring", t);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>              }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>            }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>            setResult(sentAction, result);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>          }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>        }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      }<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span><a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      // The failures global to a region. We will use for multiAction we sent previously to find the<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      //   actions to replay.<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      for (Map.Entry&lt;byte[], Throwable&gt; throwableEntry : responses.getExceptions().entrySet()) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>        throwable = throwableEntry.getValue();<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>        byte[] region = throwableEntry.getKey();<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        List&lt;Action&lt;Row&gt;&gt; actions = multiAction.actions.get(region);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>        if (actions == null || actions.isEmpty()) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          throw new IllegalStateException("Wrong response for the region: " +<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>              HRegionInfo.encodeRegionName(region));<a name="line.1362"></a>
+<span class="sourceLineNo">1288</span>      // Success or partial success<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>      // Analyze detailed results. We can still have individual failures to be redo.<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      // two specific throwables are managed:<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      //  - DoNotRetryIOException: we continue to retry for other actions<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      //  - RegionMovedException: we update the cache with the new region location<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span><a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      List&lt;Action&lt;Row&gt;&gt; toReplay = new ArrayList&lt;Action&lt;Row&gt;&gt;();<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      Throwable throwable = null;<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      int failureCount = 0;<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      boolean canRetry = true;<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span><a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      Map&lt;byte[], MultiResponse.RegionResult&gt; results = responses.getResults();<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      updateStats(server, results);<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span><a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      int failed = 0, stopped = 0;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>      // Go by original action.<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>      for (Map.Entry&lt;byte[], List&lt;Action&lt;Row&gt;&gt;&gt; regionEntry : multiAction.actions.entrySet()) {<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>        byte[] regionName = regionEntry.getKey();<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>        Map&lt;Integer, Object&gt; regionResults = results.get(regionName) == null<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>            ?  null : results.get(regionName).result;<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>        if (regionResults == null) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>          if (!responses.getExceptions().containsKey(regionName)) {<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>            LOG.error("Server sent us neither results nor exceptions for "<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>                + Bytes.toStringBinary(regionName));<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>            responses.getExceptions().put(regionName, new RuntimeException("Invalid response"));<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>          }<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>          continue;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>        }<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        boolean regionFailureRegistered = false;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        for (Action&lt;Row&gt; sentAction : regionEntry.getValue()) {<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>          Object result = regionResults.get(sentAction.getOriginalIndex());<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>          // Failure: retry if it's make sense else update the errors lists<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>          if (result == null || result instanceof Throwable) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>            Row row = sentAction.getAction();<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>            throwable = ClientExceptionsUtil.findException(result);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>            // Register corresponding failures once per server/once per region.<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>            if (!regionFailureRegistered) {<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>              regionFailureRegistered = true;<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>              try {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>                connection.updateCachedLocations(<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>                  tableName, regionName, row.getRow(), result, server);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>              } catch (Throwable ex) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>                // That should never happen, but if it did, we want to make sure<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>                // we still process errors<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>                LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>              }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>            }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>            if (failureCount == 0) {<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>              errorsByServer.reportServerError(server);<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>              // We determine canRetry only once for all calls, after reporting server failure.<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>              canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>            }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>            ++failureCount;<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>            Retry retry = manageError(sentAction.getOriginalIndex(), row,<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>                canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, (Throwable) result, server);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>            if (retry == Retry.YES) {<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>              toReplay.add(sentAction);<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>            } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>              ++stopped;<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>            } else {<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>              ++failed;<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>            }<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>          } else {<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>            if (callback != null) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>              try {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>                //noinspection unchecked<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>                // TODO: would callback expect a replica region name if it gets one?<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>                this.callback.update(regionName, sentAction.getAction().getRow(), (CResult) result);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>              } catch (Throwable t) {<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>                LOG.error("User callback threw an exception for "<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>                    + Bytes.toStringBinary(regionName) + ", ignoring", t);<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>            setResult(sentAction, result);<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>          }<a name="line.1362"></a>
 <span class="sourceLineNo">1363</span>        }<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        if (failureCount == 0) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>          errorsByServer.reportServerError(server);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>          canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>        }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        if (null == tableName &amp;&amp; ClientExceptionsUtil.isMetaClearingException(throwable)) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>          // For multi-actions, we don't have a table name, but we want to make sure to clear the<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>          // cache in case there were location-related exceptions. We don't to clear the cache<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>          // for every possible exception that comes through, however.<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>          connection.clearCaches(server);<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        } else {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>          connection.updateCachedLocations(<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>              tableName, region, actions.get(0).getAction().getRow(), throwable, server);<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>        }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        failureCount += actions.size();<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span><a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>        for (Action&lt;Row&gt; action : actions) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>          Row row = action.getAction();<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          Retry retry = manageError(action.getOriginalIndex(), row,<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>              canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, throwable, server);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>          if (retry == Retry.YES) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>            toReplay.add(action);<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>            ++stopped;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>          } else {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>            ++failed;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>          }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        }<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (toReplay.isEmpty()) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        logNoResubmit(server, numAttempt, failureCount, throwable, failed, stopped);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      } else {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>        resubmit(server, toReplay, numAttempt, failureCount, throwable);<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    private String createLog(int numAttempt, int failureCount, int replaySize, ServerName sn,<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        Throwable error, long backOffTime, boolean willRetry, String startTime,<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>        int failed, int stopped) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      StringBuilder sb = new StringBuilder();<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      sb.append("#").append(id).append(", table=").append(tableName).append(", ")<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>        .append("attempt=").append(numAttempt)<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>        .append("/").append(numTries).append(" ");<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span><a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      if (failureCount &gt; 0 || error != null){<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>        sb.append("failed=").append(failureCount).append("ops").append(", last exception: ").<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>            append(error == null ? "null" : error);<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>      } else {<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        sb.append("succeeded");<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      }<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span><a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      sb.append(" on ").append(sn).append(", tracking started ").append(startTime);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span><a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      if (willRetry) {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        sb.append(", retrying after=").append(backOffTime).append("ms").<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>            append(", replay=").append(replaySize).append("ops");<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      } else if (failureCount &gt; 0) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        if (stopped &gt; 0) {<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          sb.append("; not retrying ").append(stopped).append(" due to success from other replica");<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>        }<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        if (failed &gt; 0) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          sb.append("; not retrying ").append(failed).append(" - final failure");<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>        }<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span><a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span><a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      return sb.toString();<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
+<span class="sourceLineNo">1364</span>      }<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span><a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      // The failures global to a region. We will use for multiAction we sent previously to find the<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>      //   actions to replay.<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      for (Map.Entry&lt;byte[], Throwable&gt; throwableEntry : responses.getExceptions().entrySet()) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        throwable = throwableEntry.getValue();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>        byte[] region = throwableEntry.getKey();<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>        List&lt;Action&lt;Row&gt;&gt; actions = multiAction.actions.get(region);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>        if (actions == null || actions.isEmpty()) {<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>          throw new IllegalStateException("Wrong response for the region: " +<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>              HRegionInfo.encodeRegionName(region));<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        }<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span><a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        if (failureCount == 0) {<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>          errorsByServer.reportServerError(server);<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>          canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>        }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>        if (null == tableName &amp;&amp; ClientExceptionsUtil.isMetaClearingException(throwable)) {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>          // For multi-actions, we don't have a table name, but we want to make sure to clear the<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>          // cache in case there were location-related exceptions. We don't to clear the cache<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>          // for every possible exception that comes through, however.<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>          connection.clearCaches(server);<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>        } else {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>          try {<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>            connection.updateCachedLocations(<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>              tableName, region, actions.get(0).getAction().getRow(), throwable, server);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          } catch (Throwable ex) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>            // That should never happen, but if it did, we want to make sure<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            // we still process errors<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>            LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          }<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        failureCount += actions.size();<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span><a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>        for (Action&lt;Row&gt; action : actions) {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>          Row row = action.getAction();<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>          Retry retry = manageError(action.getOriginalIndex(), row,<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>              canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, throwable, server);<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>          if (retry == Retry.YES) {<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>            toReplay.add(action);<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>            ++stopped;<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>          } else {<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>            ++failed;<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>          }<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        }<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      }<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>      if (toReplay.isEmpty()) {<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>        logNoResubmit(server, numAttempt, failureCount, throwable, failed, stopped);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>      } else {<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>        resubmit(server, toReplay, numAttempt, failureCount, throwable);<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>      }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span><a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    private String createLog(int numAttempt, int failureCount, int replaySize, ServerName sn,<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>        Throwable error, long backOffTime, boolean willRetry, String startTime,<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>        int failed, int stopped) {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      StringBuilder sb = new StringBuilder();<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>      sb.append("#").append(id).append(", table=").append(tableName).append(", ")<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>        .append("attempt=").append(numAttempt)<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>        .append("/").append(numTries).append(" ");<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span><a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      if (failureCount &gt; 0 || error != null){<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>        sb.append("failed=").append(failureCount).append("ops").append(", last exception: ").<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>            append(error == null ? "null" : error);<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      } else {<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>        sb.append("succeeded");<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>      }<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>     * Sets the non-error result from a particular action.<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>     * @param action Action (request) that the server responded to.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>     * @param result The result.<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>     */<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    private void setResult(Action&lt;Row&gt; action, Object result) {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      if (result == null) {<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        throw new RuntimeException("Result cannot be null");<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      }<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      ReplicaResultState state = null;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      boolean isStale = !RegionReplicaUtil.isDefaultReplica(action.getReplicaId());<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      int index = action.getOriginalIndex();<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      if (results == null) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        decActionCounter(index);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        return; // Simple case, no replica requests.<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      }<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      state = trySetResultSimple(index, action.getAction(), false, result, null, isStale);<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      if (state == null) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        return; // Simple case, no replica requests.<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      // At this point we know that state is set to replica tracking class.<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>      // It could be that someone else is also looking at it; however, we know there can<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      // only be one state object, and only one thread can set callCount to 0. Other threads<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>      // will either see state with callCount 0 after locking it; or will not see state at all<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      // we will replace it with the result.<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      synchronized (state) {<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>        if (state.callCount == 0) {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>          return; // someone already set the result<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>        }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        state.callCount = 0;<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>      }<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>      synchronized (replicaResultLock) {<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>        if (results[index] != state) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>          throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>        }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        results[index] = result;<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>      }<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span><a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      decActionCounter(index);<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    }<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span><a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>    /**<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>     * Sets the error from a particular action.<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>     * @param index Original action index.<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>     * @param row Original request.<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>     * @param throwable The resulting error.<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>     * @param server The source server.<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>     */<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>    private void setError(int index, Row row, Throwable throwable, ServerName server) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      ReplicaResultState state = null;<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>      if (results == null) {<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>        // Note that we currently cannot have replica requests with null results. So it shouldn't<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>        // happen that multiple replica calls will call dAC for same actions with results == null.<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        // Only one call per action should be present in this case.<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        errors.add(throwable, row, server);<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>        decActionCounter(index);<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>        return; // Simple case, no replica requests.<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>      }<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>      state = trySetResultSimple(index, row, true, throwable, server, false);<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>      if (state == null) {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>        return; // Simple case, no replica requests.<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>      }<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>      BatchErrors target = null; // Error will be added to final errors, or temp replica errors.<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      boolean isActionDone = false;<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>      synchronized (state) {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>        switch (state.callCount) {<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>          case 0: return; // someone already set the result<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>          case 1: { // All calls failed, we are the last error.<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>            target = errors;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>            isActionDone = true;<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>            break;<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>          }<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>          default: {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>            assert state.callCount &gt; 1;<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>            if (state.replicaErrors == null) {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>              state.replicaErrors = new BatchErrors();<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>            }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>            target = state.replicaErrors;<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>            break;<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>        --state.callCount;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      target.add(throwable, row, server);<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>      if (isActionDone) {<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        if (state.replicaErrors != null) { // last call, no need to lock<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>          errors.merge(state.replicaErrors);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>        }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>        // See setResult for explanations.<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>        synchronized (replicaResultLock) {<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>          if (results[index] != state) {<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>            throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>          }<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>          results[index] = throwable;<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>        }<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>        decActionCounter(index);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      }<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    }<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span><a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    /**<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>     * Checks if the action is complete; used on error to prevent needless retries.<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>     * Does not synchronize, assuming element index/field accesses are atomic.<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>     * This is an opportunistic optimization check, doesn't have to be strict.<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>     * @param index Original action index.<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>     * @param row Original request.<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>     */<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    private boolean isActionComplete(int index, Row row) {<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      if (!isReplicaGet(row)) return false;<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      Object resObj = results[index];<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      return (resObj != null) &amp;&amp; (!(resObj instanceof ReplicaResultState)<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>          || ((ReplicaResultState)resObj).callCount == 0);<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>     * Tries to set the result or error for a particular action as if there were no replica calls.<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>     * @return null if successful; replica state if there were in fact replica calls.<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>     */<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    private ReplicaResultState trySetResultSimple(int index, Row row, boolean isError,<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>        Object result, ServerName server, boolean isFromReplica) {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      Object resObj = null;<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      if (!isReplicaGet(row)) {<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>        if (isFromReplica) {<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>          throw new AssertionError("Unexpected stale result for " + row);<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        }<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        results[index] = result;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>      } else {<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>        synchronized (replicaResultLock) {<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          resObj = results[index];<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>          if (resObj == null) {<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>            if (isFromReplica) {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>              throw new AssertionError("Unexpected stale result for " + row);<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>            }<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>            results[index] = result;<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>          }<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>        }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>      }<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span><a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>      ReplicaResultState rrs =<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>          (resObj instanceof ReplicaResultState) ? (ReplicaResultState)resObj : null;<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      if (rrs == null &amp;&amp; isError) {<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>        // The resObj is not replica state (null or already set).<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>        errors.add((Throwable)result, row, server);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>      }<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span><a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>      if (resObj == null) {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>        // resObj is null - no replica calls were made.<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>        decActionCounter(index);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>        return null;<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      }<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      return rrs;<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    }<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span><a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    private void decActionCounter(int index) {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>      long actionsRemaining = actionsInProgress.decrementAndGet();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      if (actionsRemaining &lt; 0) {<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>        String error = buildDetailedErrorMsg("Incorrect actions in progress", index);<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>        throw new AssertionError(error);<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      } else if (actionsRemaining == 0) {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>        synchronized (actionsInProgress) {<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>          actionsInProgress.notifyAll();<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>        }<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>      }<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span><a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>    private String buildDetailedErrorMsg(String string, int index) {<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>      StringBuilder error = new StringBuilder(128);<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>      error.append(string).append("; called for ").append(index).append(", actionsInProgress ")<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>          .append(actionsInProgress.get()).append("; replica gets: ");<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>      if (replicaGetIndices != null) {<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>        for (int i = 0; i &lt; replicaGetIndices.length; ++i) {<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>          error.append(replicaGetIndices[i]).append(", ");<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>        }<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>      } else {<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>        error.append(hasAnyReplicaGets ? "all" : "none");<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>      }<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      error.append("; results ");<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      if (results != null) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>        for (int i = 0; i &lt; results.length; ++i) {<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>          Object o = results[i];<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          error.append(((o == null) ? "null" : o.toString())).append(", ");<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>        }<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>      }<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      return error.toString();<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    }<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span><a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    @Override<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    public void waitUntilDone() throws InterruptedIOException {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      try {<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>        waitUntilDone(Long.MAX_VALUE);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>      } catch (InterruptedException iex) {<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        throw new InterruptedIOException(iex.getMessage());<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>      } finally {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>        if (callsInProgress != null) {<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>          for (PayloadCarryingServerCallable clb : callsInProgress) {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>            clb.cancel();<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>          }<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>      }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>    }<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span><a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    private boolean waitUntilDone(long cutoff) throws InterruptedException {<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>      boolean hasWait = cutoff != Long.MAX_VALUE;<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>      long lastLog = EnvironmentEdgeManager.currentTime();<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>      long currentInProgress;<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>      while (0 != (currentInProgress = actionsInProgress.get())) {<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>        long now = EnvironmentEdgeManager.currentTime();<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>        if (hasWait &amp;&amp; (now * 1000L) &gt; cutoff) {<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>          return false;<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>        }<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>        if (!hasWait) { // Only log if wait is infinite.<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>          if (now &gt; lastLog + 10000) {<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>            lastLog = now;<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>            LOG.info("#" + id + ", waiting for " + currentInProgress + "  actions to finish");<a name="line.1645"></a>
+<span class="sourceLineNo">1433</span>      sb.append(" on ").append(sn).append(", tracking started ").append(startTime);<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span><a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      if (willRetry) {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>        sb.append(", retrying after=").append(backOffTime).append("ms").<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>            append(", replay=").append(replaySize).append("ops");<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>      } else if (failureCount &gt; 0) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>        if (stopped &gt; 0) {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>          sb.append("; not retrying ").append(stopped).append(" due to success from other replica");<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        if (failed &gt; 0) {<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>          sb.append("; not retrying ").append(failed).append(" - final failure");<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>        }<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><a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      return sb.toString();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>    }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span><a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>    /**<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>     * Sets the non-error result from a particular action.<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>     * @param action Action (request) that the server responded to.<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>     * @param result The result.<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>     */<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    private void setResult(Action&lt;Row&gt; action, Object result) {<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      if (result == null) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>        throw new RuntimeException("Result cannot be null");<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>      ReplicaResultState state = null;<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>      boolean isStale = !RegionReplicaUtil.isDefaultReplica(action.getReplicaId());<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      int index = action.getOriginalIndex();<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>      if (results == null) {<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>        decActionCounter(index);<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>        return; // Simple case, no replica requests.<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>      }<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>      state = trySetResultSimple(index, action.getAction(), false, result, null, isStale);<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      if (state == null) {<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>        return; // Simple case, no replica requests.<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>      }<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>      // At this point we know that state is set to replica tracking class.<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>      // It could be that someone else is also looking at it; however, we know there can<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      // only be one state object, and only one thread can set callCount to 0. Other threads<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      // will either see state with callCount 0 after locking it; or will not see state at all<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>      // we will replace it with the result.<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>      synchronized (state) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>        if (state.callCount == 0) {<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>          return; // someone already set the result<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>        state.callCount = 0;<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      }<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      synchronized (replicaResultLock) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>        if (results[index] != state) {<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>          throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>        }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>        results[index] = result;<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>      decActionCounter(index);<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    }<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span><a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    /**<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>     * Sets the error from a particular action.<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>     * @param index Original action index.<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>     * @param row Original request.<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>     * @param throwable The resulting error.<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>     * @param server The source server.<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>     */<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    private void setError(int index, Row row, Throwable throwable, ServerName server) {<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      ReplicaResultState state = null;<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>      if (results == null) {<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>        // Note that we currently cannot have replica requests with null results. So it shouldn't<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>        // happen that multiple replica calls will call dAC for same actions with results == null.<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>        // Only one call per action should be present in this case.<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>        errors.add(throwable, row, server);<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>        decActionCounter(index);<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>        return; // Simple case, no replica requests.<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>      }<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>      state = trySetResultSimple(index, row, true, throwable, server, false);<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      if (state == null) {<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>        return; // Simple case, no replica requests.<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>      }<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      BatchErrors target = null; // Error will be added to final errors, or temp replica errors.<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>      boolean isActionDone = false;<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>      synchronized (state) {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>        switch (state.callCount) {<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>          case 0: return; // someone already set the result<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>          case 1: { // All calls failed, we are the last error.<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>            target = errors;<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>            isActionDone = true;<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>            break;<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>          }<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          default: {<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>            assert state.callCount &gt; 1;<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>            if (state.replicaErrors == null) {<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>              state.replicaErrors = new BatchErrors();<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>            }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>            target = state.replicaErrors;<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>            break;<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>          }<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>        }<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>        --state.callCount;<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>      }<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span>      target.add(throwable, row, server);<a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>      if (isActionDone) {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>        if (state.replicaErrors != null) { // last call, no need to lock<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>          errors.merge(state.replicaErrors);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>        }<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>        // See setResult for explanations.<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>        synchronized (replicaResultLock) {<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>          if (results[index] != state) {<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>            throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>          }<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>          results[index] = throwable;<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>        }<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>        decActionCounter(index);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>      }<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>    }<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span><a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>    /**<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>     * Checks if the action is complete; used on error to prevent needless retries.<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>     * Does not synchronize, assuming element index/field accesses are atomic.<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>     * This is an opportunistic optimization check, doesn't have to be strict.<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>     * @param index Original action index.<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>     * @param row Original request.<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>     */<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    private boolean isActionComplete(int index, Row row) {<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>      if (!isReplicaGet(row)) return false;<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>      Object resObj = results[index];<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>      return (resObj != null) &amp;&amp; (!(resObj instanceof ReplicaResultState)<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>          || ((ReplicaResultState)resObj).callCount == 0);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    }<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span><a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>    /**<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>     * Tries to set the result or error for a particular action as if there were no replica calls.<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>     * @return null if successful; replica state if there were in fact replica calls.<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>     */<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>    private ReplicaResultState trySetResultSimple(int index, Row row, boolean isError,<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>        Object result, ServerName server, boolean isFromReplica) {<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>      Object resObj = null;<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      if (!isReplicaGet(row)) {<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>        if (isFromReplica) {<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>          throw new AssertionError("Unexpected stale result for " + row);<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>        }<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>        results[index] = result;<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>      } else {<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>        synchronized (replicaResultLock) {<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>          resObj = results[index];<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>          if (resObj == null) {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>            if (isFromReplica) {<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>              throw new AssertionError("Unexpected stale result for " + row);<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>            }<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>            results[index] = result;<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>          }<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>        }<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>      }<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span><a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>      ReplicaResultState rrs =<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>          (resObj instanceof Rep

<TRUNCATED>

[21/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html
index 289df25..2470b8f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.html
@@ -101,7 +101,7 @@
 <span class="sourceLineNo">093</span>  /* row is not private for tests */<a name="line.93"></a>
 <span class="sourceLineNo">094</span>  /** Row the query is on */<a name="line.94"></a>
 <span class="sourceLineNo">095</span>  Cell curCell;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  <a name="line.96"></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>   * Oldest put in any of the involved store files<a name="line.98"></a>
 <span class="sourceLineNo">099</span>   * Used to decide whether it is ok to delete<a name="line.99"></a>
@@ -127,7 +127,7 @@
 <span class="sourceLineNo">119</span>   * first column.<a name="line.119"></a>
 <span class="sourceLineNo">120</span>   * */<a name="line.120"></a>
 <span class="sourceLineNo">121</span>  private boolean hasNullColumn = true;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  <a name="line.122"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
 <span class="sourceLineNo">123</span>  private RegionCoprocessorHost regionCoprocessorHost= null;<a name="line.123"></a>
 <span class="sourceLineNo">124</span><a name="line.124"></a>
 <span class="sourceLineNo">125</span>  // By default, when hbase.hstore.time.to.purge.deletes is 0ms, a delete<a name="line.125"></a>
@@ -148,22 +148,22 @@
 <span class="sourceLineNo">140</span>  // currently influencing. This is because Puts, that this delete can<a name="line.140"></a>
 <span class="sourceLineNo">141</span>  // influence.  may appear out of order.<a name="line.141"></a>
 <span class="sourceLineNo">142</span>  private final long timeToPurgeDeletes;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  <a name="line.143"></a>
+<span class="sourceLineNo">143</span><a name="line.143"></a>
 <span class="sourceLineNo">144</span>  private final boolean isUserScan;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
 <span class="sourceLineNo">146</span>  private final boolean isReversed;<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>   * Construct a QueryMatcher for a scan<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * @param scan<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * @param scanInfo The store's immutable scan info<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * @param columns<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * @param scanType Type of the scan<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * @param earliestPutTs Earliest put seen in any of the store files.<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * @param oldestUnexpiredTS the oldest timestamp we are interested in,<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   *  based on TTL<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * @param regionCoprocessorHost <a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * @throws IOException <a name="line.158"></a>
+<span class="sourceLineNo">149</span>   * True if we are doing a 'Get' Scan. Every Get is actually a one-row Scan.<a name="line.149"></a>
+<span class="sourceLineNo">150</span>   */<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private final boolean get;<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>   * Construct a QueryMatcher for a scan<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * @param scanInfo The store's immutable scan info<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * @param scanType Type of the scan<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * @param earliestPutTs Earliest put seen in any of the store files.<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * @param oldestUnexpiredTS the oldest timestamp we are interested in, based on TTL<a name="line.158"></a>
 <span class="sourceLineNo">159</span>   */<a name="line.159"></a>
 <span class="sourceLineNo">160</span>  public ScanQueryMatcher(Scan scan, ScanInfo scanInfo, NavigableSet&lt;byte[]&gt; columns,<a name="line.160"></a>
 <span class="sourceLineNo">161</span>      ScanType scanType, long readPointToUse, long earliestPutTs, long oldestUnexpiredTS,<a name="line.161"></a>
@@ -174,518 +174,524 @@
 <span class="sourceLineNo">166</span>    } else {<a name="line.166"></a>
 <span class="sourceLineNo">167</span>      this.tr = timeRange;<a name="line.167"></a>
 <span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    this.rowComparator = scanInfo.getComparator();<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    this.regionCoprocessorHost = regionCoprocessorHost;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    this.deletes =  instantiateDeleteTracker();<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    this.stopRow = scan.getStopRow();<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    this.startKey = CellUtil.createFirstDeleteFamilyCellOnRow(scan.getStartRow(),<a name="line.173"></a>
-<span class="sourceLineNo">174</span>        scanInfo.getFamily());<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    this.filter = scan.getFilter();<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    this.earliestPutTs = earliestPutTs;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    this.oldestUnexpiredTS = oldestUnexpiredTS;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    this.now = now;<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>    this.maxReadPointToTrackVersions = readPointToUse;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    this.timeToPurgeDeletes = scanInfo.getTimeToPurgeDeletes();<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    this.ttl = oldestUnexpiredTS;<a name="line.182"></a>
-<span class="sourceLineNo">183</span><a name="line.183"></a>
-<span class="sourceLineNo">184</span>    /* how to deal with deletes */<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    this.isUserScan = scanType == ScanType.USER_SCAN;<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    // keep deleted cells: if compaction or raw scan<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    this.keepDeletedCells = scan.isRaw() ? KeepDeletedCells.TRUE :<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      isUserScan ? KeepDeletedCells.FALSE : scanInfo.getKeepDeletedCells();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    // retain deletes: if minor compaction or raw scanisDone<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    this.retainDeletesInOutput = scanType == ScanType.COMPACT_RETAIN_DELETES || scan.isRaw();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    // seePastDeleteMarker: user initiated scans<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    this.seePastDeleteMarkers =<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        scanInfo.getKeepDeletedCells() != KeepDeletedCells.FALSE &amp;&amp; isUserScan;<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    int maxVersions =<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        scan.isRaw() ? scan.getMaxVersions() : Math.min(scan.getMaxVersions(),<a name="line.196"></a>
-<span class="sourceLineNo">197</span>          scanInfo.getMaxVersions());<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>    // Single branch to deal with two types of reads (columns vs all in family)<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    if (columns == null || columns.size() == 0) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      // there is always a null column in the wildcard column query.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      hasNullColumn = true;<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span>      // use a specialized scan for wildcard column tracker.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      this.columns = new ScanWildcardColumnTracker(<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          scanInfo.getMinVersions(), maxVersions, oldestUnexpiredTS);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    } else {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      // whether there is null column in the explicit column query<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      hasNullColumn = (columns.first().length == 0);<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>      // We can share the ExplicitColumnTracker, diff is we reset<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      // between rows, not between storefiles.<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      this.columns = new ExplicitColumnTracker(columns, scanInfo.getMinVersions(), maxVersions,<a name="line.213"></a>
-<span class="sourceLineNo">214</span>          oldestUnexpiredTS);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    this.isReversed = scan.isReversed();<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  }<a name="line.217"></a>
-<span class="sourceLineNo">218</span><a name="line.218"></a>
-<span class="sourceLineNo">219</span>  private DeleteTracker instantiateDeleteTracker() throws IOException {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    DeleteTracker tracker = new ScanDeleteTracker();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    if (regionCoprocessorHost != null) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      tracker = regionCoprocessorHost.postInstantiateDeleteTracker(tracker);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    return tracker;<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>  /**<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * Construct a QueryMatcher for a scan that drop deletes from a limited range of rows.<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   * @param scan<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * @param scanInfo The store's immutable scan info<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   * @param columns<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * @param earliestPutTs Earliest put seen in any of the store files.<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * @param oldestUnexpiredTS the oldest timestamp we are interested in, based on TTL<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * @param now the current server time<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   * @param dropDeletesFromRow The inclusive left bound of the range; can be EMPTY_START_ROW.<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * @param dropDeletesToRow The exclusive right bound of the range; can be EMPTY_END_ROW.<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param regionCoprocessorHost <a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @throws IOException <a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public ScanQueryMatcher(Scan scan, ScanInfo scanInfo, NavigableSet&lt;byte[]&gt; columns,<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      long readPointToUse, long earliestPutTs, long oldestUnexpiredTS, long now,<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      byte[] dropDeletesFromRow, byte[] dropDeletesToRow,<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      RegionCoprocessorHost regionCoprocessorHost) throws IOException {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    this(scan, scanInfo, columns, ScanType.COMPACT_RETAIN_DELETES, readPointToUse, earliestPutTs,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>        oldestUnexpiredTS, now, regionCoprocessorHost);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    Preconditions.checkArgument((dropDeletesFromRow != null) &amp;&amp; (dropDeletesToRow != null));<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    this.dropDeletesFromRow = dropDeletesFromRow;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    this.dropDeletesToRow = dropDeletesToRow;<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>   * Constructor for tests<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  ScanQueryMatcher(Scan scan, ScanInfo scanInfo,<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      NavigableSet&lt;byte[]&gt; columns, long oldestUnexpiredTS, long now) throws IOException {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    this(scan, scanInfo, columns, ScanType.USER_SCAN,<a name="line.256"></a>
-<span class="sourceLineNo">257</span>          Long.MAX_VALUE, /* max Readpoint to track versions */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        HConstants.LATEST_TIMESTAMP, oldestUnexpiredTS, now, null);<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>   * @return  whether there is an null column in the query<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public boolean hasNullColumnInQuery() {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    return hasNullColumn;<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>   * Determines if the caller should do one of several things:<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * - seek/skip to the next row (MatchCode.SEEK_NEXT_ROW)<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * - seek/skip to the next column (MatchCode.SEEK_NEXT_COL)<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   * - include the current KeyValue (MatchCode.INCLUDE)<a name="line.273"></a>
-<span class="sourceLineNo">274</span>   * - ignore the current KeyValue (MatchCode.SKIP)<a name="line.274"></a>
-<span class="sourceLineNo">275</span>   * - got to the next row (MatchCode.DONE)<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   *<a name="line.276"></a>
-<span class="sourceLineNo">277</span>   * @param cell KeyValue to check<a name="line.277"></a>
-<span class="sourceLineNo">278</span>   * @return The match code instance.<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   * @throws IOException in case there is an internal consistency problem<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   *      caused by a data corruption.<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   */<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  public MatchCode match(Cell cell) throws IOException {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      if (filter != null &amp;&amp; filter.filterAllRemaining()) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      return MatchCode.DONE_SCAN;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    }<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    if (curCell != null) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      int ret = this.rowComparator.compareRows(curCell, cell);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      if (!this.isReversed) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        if (ret &lt;= -1) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          return MatchCode.DONE;<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        } else if (ret &gt;= 1) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          // could optimize this, if necessary?<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          // Could also be called SEEK_TO_CURRENT_ROW, but this<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          // should be rare/never happens.<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          return MatchCode.SEEK_NEXT_ROW;<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      } else {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        if (ret &lt;= -1) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          return MatchCode.SEEK_NEXT_ROW;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        } else if (ret &gt;= 1) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>          return MatchCode.DONE;<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>    } else {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      // Since the curCell is null it means we are already sure that we have moved over to the next row<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      return MatchCode.DONE;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>    // optimize case.<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    if (this.stickyNextRow) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      return MatchCode.SEEK_NEXT_ROW;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>    if (this.columns.done()) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      stickyNextRow = true;<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      return MatchCode.SEEK_NEXT_ROW;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>    long timestamp = cell.getTimestamp();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    // check for early out based on timestamp alone<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (columns.isDone(timestamp)) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      return columns.getNextRowOrNextColumn(cell);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    // check if the cell is expired by cell TTL<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    if (HStore.isCellTTLExpired(cell, this.oldestUnexpiredTS, this.now)) {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      return MatchCode.SKIP;<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">330</span>     * The delete logic is pretty complicated now.<a name="line.330"></a>
-<span class="sourceLineNo">331</span>     * This is corroborated by the following:<a name="line.331"></a>
-<span class="sourceLineNo">332</span>     * 1. The store might be instructed to keep deleted rows around.<a name="line.332"></a>
-<span class="sourceLineNo">333</span>     * 2. A scan can optionally see past a delete marker now.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>     * 3. If deleted rows are kept, we have to find out when we can<a name="line.334"></a>
-<span class="sourceLineNo">335</span>     *    remove the delete markers.<a name="line.335"></a>
-<span class="sourceLineNo">336</span>     * 4. Family delete markers are always first (regardless of their TS)<a name="line.336"></a>
-<span class="sourceLineNo">337</span>     * 5. Delete markers should not be counted as version<a name="line.337"></a>
-<span class="sourceLineNo">338</span>     * 6. Delete markers affect puts of the *same* TS<a name="line.338"></a>
-<span class="sourceLineNo">339</span>     * 7. Delete marker need to be version counted together with puts<a name="line.339"></a>
-<span class="sourceLineNo">340</span>     *    they affect<a name="line.340"></a>
-<span class="sourceLineNo">341</span>     */<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    byte typeByte = cell.getTypeByte();<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    long mvccVersion = cell.getSequenceId();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    if (CellUtil.isDelete(cell)) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      if (keepDeletedCells == KeepDeletedCells.FALSE<a name="line.345"></a>
-<span class="sourceLineNo">346</span>          || (keepDeletedCells == KeepDeletedCells.TTL &amp;&amp; timestamp &lt; ttl)) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        // first ignore delete markers if the scanner can do so, and the<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        // range does not include the marker<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        //<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        // during flushes and compactions also ignore delete markers newer<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        // than the readpoint of any open scanner, this prevents deleted<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        // rows that could still be seen by a scanner from being collected<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        boolean includeDeleteMarker = seePastDeleteMarkers ?<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            tr.withinTimeRange(timestamp) :<a name="line.354"></a>
-<span class="sourceLineNo">355</span>            tr.withinOrAfterTimeRange(timestamp);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        if (includeDeleteMarker<a name="line.356"></a>
-<span class="sourceLineNo">357</span>            &amp;&amp; mvccVersion &lt;= maxReadPointToTrackVersions) {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>          this.deletes.add(cell);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        // Can't early out now, because DelFam come before any other keys<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      }<a name="line.361"></a>
-<span class="sourceLineNo">362</span>     <a name="line.362"></a>
-<span class="sourceLineNo">363</span>      if ((!isUserScan)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          &amp;&amp; timeToPurgeDeletes &gt; 0<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          &amp;&amp; (EnvironmentEdgeManager.currentTime() - timestamp) <a name="line.365"></a>
-<span class="sourceLineNo">366</span>            &lt;= timeToPurgeDeletes) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        return MatchCode.INCLUDE;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      } else if (retainDeletesInOutput || mvccVersion &gt; maxReadPointToTrackVersions) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        // always include or it is not time yet to check whether it is OK<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        // to purge deltes or not<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        if (!isUserScan) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          // if this is not a user scan (compaction), we can filter this deletemarker right here<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          // otherwise (i.e. a "raw" scan) we fall through to normal version and timerange checking<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          return MatchCode.INCLUDE;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        }<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      } else if (keepDeletedCells == KeepDeletedCells.TRUE<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          || (keepDeletedCells == KeepDeletedCells.TTL &amp;&amp; timestamp &gt;= ttl)) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        if (timestamp &lt; earliestPutTs) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>          // keeping delete rows, but there are no puts older than<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          // this delete in the store files.<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          return columns.getNextRowOrNextColumn(cell);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        }<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        // else: fall through and do version counting on the<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        // delete markers<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      } else {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        return MatchCode.SKIP;<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      // note the following next else if...<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      // delete marker are not subject to other delete markers<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    } else if (!this.deletes.isEmpty()) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      DeleteResult deleteResult = deletes.isDeleted(cell);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      switch (deleteResult) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        case FAMILY_DELETED:<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        case COLUMN_DELETED:<a name="line.394"></a>
-<span class="sourceLineNo">395</span>          return columns.getNextRowOrNextColumn(cell);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        case VERSION_DELETED:<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        case FAMILY_VERSION_DELETED:<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          return MatchCode.SKIP;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>        case NOT_DELETED:<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          break;<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        default:<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          throw new RuntimeException("UNEXPECTED");<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>    int timestampComparison = tr.compare(timestamp);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (timestampComparison &gt;= 1) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      return MatchCode.SKIP;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    } else if (timestampComparison &lt;= -1) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      return columns.getNextRowOrNextColumn(cell);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>    // STEP 1: Check if the column is part of the requested columns<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    MatchCode colChecker = columns.checkColumn(cell, typeByte);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    if (colChecker == MatchCode.INCLUDE) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      ReturnCode filterResponse = ReturnCode.SKIP;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      // STEP 2: Yes, the column is part of the requested columns. Check if filter is present<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      if (filter != null) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        // STEP 3: Filter the key value and return if it filters out<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        filterResponse = filter.filterKeyValue(cell);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        switch (filterResponse) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        case SKIP:<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          return MatchCode.SKIP;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        case NEXT_COL:<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          return columns.getNextRowOrNextColumn(cell);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        case NEXT_ROW:<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          stickyNextRow = true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          return MatchCode.SEEK_NEXT_ROW;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        case SEEK_NEXT_USING_HINT:<a name="line.429"></a>
-<span class="sourceLineNo">430</span>          return MatchCode.SEEK_NEXT_USING_HINT;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        default:<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          //It means it is either include or include and seek next<a name="line.432"></a>
-<span class="sourceLineNo">433</span>          break;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      }<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      /*<a name="line.436"></a>
-<span class="sourceLineNo">437</span>       * STEP 4: Reaching this step means the column is part of the requested columns and either<a name="line.437"></a>
-<span class="sourceLineNo">438</span>       * the filter is null or the filter has returned INCLUDE or INCLUDE_AND_NEXT_COL response.<a name="line.438"></a>
-<span class="sourceLineNo">439</span>       * Now check the number of versions needed. This method call returns SKIP, INCLUDE,<a name="line.439"></a>
-<span class="sourceLineNo">440</span>       * INCLUDE_AND_SEEK_NEXT_ROW, INCLUDE_AND_SEEK_NEXT_COL.<a name="line.440"></a>
-<span class="sourceLineNo">441</span>       *<a name="line.441"></a>
-<span class="sourceLineNo">442</span>       * FilterResponse            ColumnChecker               Desired behavior<a name="line.442"></a>
-<span class="sourceLineNo">443</span>       * INCLUDE                   SKIP                        row has already been included, SKIP.<a name="line.443"></a>
-<span class="sourceLineNo">444</span>       * INCLUDE                   INCLUDE                     INCLUDE<a name="line.444"></a>
-<span class="sourceLineNo">445</span>       * INCLUDE                   INCLUDE_AND_SEEK_NEXT_COL   INCLUDE_AND_SEEK_NEXT_COL<a name="line.445"></a>
-<span class="sourceLineNo">446</span>       * INCLUDE                   INCLUDE_AND_SEEK_NEXT_ROW   INCLUDE_AND_SEEK_NEXT_ROW<a name="line.446"></a>
-<span class="sourceLineNo">447</span>       * INCLUDE_AND_SEEK_NEXT_COL SKIP                        row has already been included, SKIP.<a name="line.447"></a>
-<span class="sourceLineNo">448</span>       * INCLUDE_AND_SEEK_NEXT_COL INCLUDE                     INCLUDE_AND_SEEK_NEXT_COL<a name="line.448"></a>
-<span class="sourceLineNo">449</span>       * INCLUDE_AND_SEEK_NEXT_COL INCLUDE_AND_SEEK_NEXT_COL   INCLUDE_AND_SEEK_NEXT_COL<a name="line.449"></a>
-<span class="sourceLineNo">450</span>       * INCLUDE_AND_SEEK_NEXT_COL INCLUDE_AND_SEEK_NEXT_ROW   INCLUDE_AND_SEEK_NEXT_ROW<a name="line.450"></a>
-<span class="sourceLineNo">451</span>       *<a name="line.451"></a>
-<span class="sourceLineNo">452</span>       * In all the above scenarios, we return the column checker return value except for<a name="line.452"></a>
-<span class="sourceLineNo">453</span>       * FilterResponse (INCLUDE_AND_SEEK_NEXT_COL) and ColumnChecker(INCLUDE)<a name="line.453"></a>
-<span class="sourceLineNo">454</span>       */<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      colChecker = columns.checkVersions(cell, timestamp, typeByte,<a name="line.455"></a>
-<span class="sourceLineNo">456</span>          mvccVersion &gt; maxReadPointToTrackVersions);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      //Optimize with stickyNextRow<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      boolean seekNextRowFromEssential = filterResponse == ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW &amp;&amp;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          filter.isFamilyEssential(cell.getFamilyArray());<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      if (colChecker == MatchCode.INCLUDE_AND_SEEK_NEXT_ROW || seekNextRowFromEssential) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        stickyNextRow = true;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      if (filterResponse == ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        if (colChecker != MatchCode.SKIP) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          return MatchCode.INCLUDE_AND_SEEK_NEXT_ROW;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        }<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        return MatchCode.SEEK_NEXT_ROW;<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      return (filterResponse == ReturnCode.INCLUDE_AND_NEXT_COL &amp;&amp;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          colChecker == MatchCode.INCLUDE) ? MatchCode.INCLUDE_AND_SEEK_NEXT_COL<a name="line.470"></a>
-<span class="sourceLineNo">471</span>          : colChecker;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    stickyNextRow = (colChecker == MatchCode.SEEK_NEXT_ROW) ? true<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        : stickyNextRow;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    return colChecker;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
-<span class="sourceLineNo">477</span><a name="line.477"></a>
-<span class="sourceLineNo">478</span>  /** Handle partial-drop-deletes. As we match keys in order, when we have a range from which<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * we can drop deletes, we can set retainDeletesInOutput to false for the duration of this<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   * range only, and maintain consistency. */<a name="line.480"></a>
-<span class="sourceLineNo">481</span>  private void checkPartialDropDeleteRange(Cell curCell) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    // If partial-drop-deletes are used, initially, dropDeletesFromRow and dropDeletesToRow<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    // are both set, and the matcher is set to retain deletes. We assume ordered keys. When<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    // dropDeletesFromRow is leq current kv, we start dropping deletes and reset<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    // dropDeletesFromRow; thus the 2nd "if" starts to apply.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    if ((dropDeletesFromRow != null)<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        &amp;&amp; (Arrays.equals(dropDeletesFromRow, HConstants.EMPTY_START_ROW) ||<a name="line.487"></a>
-<span class="sourceLineNo">488</span>            (CellComparator.COMPARATOR.compareRows(curCell, dropDeletesFromRow, 0,<a name="line.488"></a>
-<span class="sourceLineNo">489</span>                dropDeletesFromRow.length) &gt;= 0))) {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      retainDeletesInOutput = false;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      dropDeletesFromRow = null;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    // If dropDeletesFromRow is null and dropDeletesToRow is set, we are inside the partial-<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    // drop-deletes range. When dropDeletesToRow is leq current kv, we stop dropping deletes,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    // and reset dropDeletesToRow so that we don't do any more compares.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    if ((dropDeletesFromRow == null)<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        &amp;&amp; (dropDeletesToRow != null)<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        &amp;&amp; !Arrays.equals(dropDeletesToRow, HConstants.EMPTY_END_ROW)<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        &amp;&amp; (CellComparator.COMPARATOR<a name="line.499"></a>
-<span class="sourceLineNo">500</span>            .compareRows(curCell, dropDeletesToRow, 0, dropDeletesToRow.length) &gt;= 0)) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      retainDeletesInOutput = true;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      dropDeletesToRow = null;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    }<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  public boolean moreRowsMayExistAfter(Cell kv) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    if (this.isReversed) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      if (rowComparator.compareRows(kv, stopRow, 0, stopRow.length) &lt;= 0) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        return false;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      } else {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        return true;<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      }<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    if (!Bytes.equals(stopRow , HConstants.EMPTY_END_ROW) &amp;&amp;<a name="line.514"></a>
-<span class="sourceLineNo">515</span>        rowComparator.compareRows(kv, stopRow, 0, stopRow.length) &gt;= 0) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      // KV &gt;= STOPROW<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      // then NO there is nothing left.<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      return false;<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    } else {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      return true;<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
-<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
-<span class="sourceLineNo">525</span>   * Set the row when there is change in row<a name="line.525"></a>
-<span class="sourceLineNo">526</span>   * @param curCell<a name="line.526"></a>
-<span class="sourceLineNo">527</span>   */<a name="line.527"></a>
-<span class="sourceLineNo">528</span>  public void setToNewRow(Cell curCell) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    checkPartialDropDeleteRange(curCell);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    this.curCell = curCell;<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    reset();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>  }<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>  public void reset() {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    this.deletes.reset();<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    this.columns.reset();<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>    stickyNextRow = false;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   *<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   * @return the start key<a name="line.543"></a>
-<span class="sourceLineNo">544</span>   */<a name="line.544"></a>
-<span class="sourceLineNo">545</span>  public Cell getStartKey() {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    return this.startKey;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  /**<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   *<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @return the Filter<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  Filter getFilter() {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return this.filter;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  public Cell getNextKeyHint(Cell kv) throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    if (filter == null) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      return null;<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    } else {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      return filter.getNextCellHint(kv);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  }<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public Cell getKeyForNextColumn(Cell kv) {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    ColumnCount nextColumn = columns.getColumnHint();<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    if (nextColumn == null) {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      return CellUtil.createLastOnRowCol(kv);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    } else {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      return CellUtil.createFirstOnRowCol(kv, nextColumn.getBuffer(), nextColumn.getOffset(),<a name="line.570"></a>
-<span class="sourceLineNo">571</span>          nextColumn.getLength());<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    }<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  }<a name="line.573"></a>
-<span class="sourceLineNo">574</span><a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public Cell getKeyForNextRow(Cell c) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    return CellUtil.createLastOnRow(c);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>  }<a name="line.577"></a>
-<span class="sourceLineNo">578</span><a name="line.578"></a>
-<span class="sourceLineNo">579</span>  /**<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param nextIndexed the key of the next entry in the block index (if any)<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param kv The Cell we're using to calculate the seek key<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return result of the compare between the indexed key and the key portion of the passed cell<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   */<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  public int compareKeyForNextRow(Cell nextIndexed, Cell kv) {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return rowComparator.compareKeyBasedOnColHint(nextIndexed, kv, 0, 0, null, 0, 0,<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        HConstants.OLDEST_TIMESTAMP, Type.Minimum.getCode());<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
-<span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  /**<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * @param nextIndexed the key of the next entry in the block index (if any)<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   * @param currentCell The Cell we're using to calculate the seek key<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @return result of the compare between the indexed key and the key portion of the passed cell<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  public int compareKeyForNextColumn(Cell nextIndexed, Cell currentCell) {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    ColumnCount nextColumn = columns.getColumnHint();<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    if (nextColumn == null) {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      return rowComparator.compareKeyBasedOnColHint(nextIndexed, currentCell, 0, 0, null, 0, 0,<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          HConstants.OLDEST_TIMESTAMP, Type.Minimum.getCode());<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    } else {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      return rowComparator.compareKeyBasedOnColHint(nextIndexed, currentCell,<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          currentCell.getFamilyOffset(), currentCell.getFamilyLength(), nextColumn.getBuffer(),<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          nextColumn.getOffset(), nextColumn.getLength(), HConstants.LATEST_TIMESTAMP,<a name="line.602"></a>
-<span class="sourceLineNo">603</span>          Type.Maximum.getCode());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  //Used only for testing purposes<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  static MatchCode checkColumn(ColumnTracker columnTracker, byte[] bytes, int offset,<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      int length, long ttl, byte type, boolean ignoreCount) throws IOException {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    KeyValue kv = KeyValueUtil.createFirstOnRow(HConstants.EMPTY_BYTE_ARRAY, 0, 0,<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        HConstants.EMPTY_BYTE_ARRAY, 0, 0, bytes, offset, length);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    MatchCode matchCode = columnTracker.checkColumn(kv, type);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    if (matchCode == MatchCode.INCLUDE) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return columnTracker.checkVersions(kv, ttl, type, ignoreCount);<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    }<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    return matchCode;<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * {@link #match} return codes.  These instruct the scanner moving through<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * memstores and StoreFiles what to do with the current KeyValue.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * &lt;p&gt;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * Additionally, this contains "early-out" language to tell the scanner to<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * move on to the next File (memstore or Storefile), or to return immediately.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  public static enum MatchCode {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    /**<a name="line.627"></a>
-<span class="sourceLineNo">628</span>     * Include KeyValue in the returned result<a name="line.628"></a>
-<span class="sourceLineNo">629</span>     */<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    INCLUDE,<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    /**<a name="line.632"></a>
-<span class="sourceLineNo">633</span>     * Do not include KeyValue in the returned result<a name="line.633"></a>
-<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    SKIP,<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>    /**<a name="line.637"></a>
-<span class="sourceLineNo">638</span>     * Do not include, jump to next StoreFile or memstore (in time order)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>     */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    NEXT,<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>    /**<a name="line.642"></a>
-<span class="sourceLineNo">643</span>     * Do not include, return current result<a name="line.643"></a>
-<span class="sourceLineNo">644</span>     */<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    DONE,<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    /**<a name="line.647"></a>
-<span class="sourceLineNo">648</span>     * These codes are used by the ScanQueryMatcher<a name="line.648"></a>
-<span class="sourceLineNo">649</span>     */<a name="line.649"></a>
-<span class="sourceLineNo">650</span><a name="line.650"></a>
-<span class="sourceLineNo">651</span>    /**<a name="line.651"></a>
-<span class="sourceLineNo">652</span>     * Done with the row, seek there.<a name="line.652"></a>
-<span class="sourceLineNo">653</span>     */<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    SEEK_NEXT_ROW,<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    /**<a name="line.655"></a>
-<span class="sourceLineNo">656</span>     * Done with column, seek to next.<a name="line.656"></a>
-<span class="sourceLineNo">657</span>     */<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    SEEK_NEXT_COL,<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>    /**<a name="line.660"></a>
-<span class="sourceLineNo">661</span>     * Done with scan, thanks to the row filter.<a name="line.661"></a>
-<span class="sourceLineNo">662</span>     */<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    DONE_SCAN,<a name="line.663"></a>
-<span class="sourceLineNo">664</span><a name="line.664"></a>
-<span class="sourceLineNo">665</span>    /*<a name="line.665"></a>
-<span class="sourceLineNo">666</span>     * Seek to next key which is given as hint.<a name="line.666"></a>
-<span class="sourceLineNo">667</span>     */<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    SEEK_NEXT_USING_HINT,<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    /**<a name="line.670"></a>
-<span class="sourceLineNo">671</span>     * Include KeyValue and done with column, seek to next.<a name="line.671"></a>
-<span class="sourceLineNo">672</span>     */<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    INCLUDE_AND_SEEK_NEXT_COL,<a name="line.673"></a>
-<span class="sourceLineNo">674</span><a name="line.674"></a>
-<span class="sourceLineNo">675</span>    /**<a name="line.675"></a>
-<span class="sourceLineNo">676</span>     * Include KeyValue and done with row, seek to next.<a name="line.676"></a>
-<span class="sourceLineNo">677</span>     */<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    INCLUDE_AND_SEEK_NEXT_ROW,<a name="line.678"></a>
-<span class="sourceLineNo">679</span>  }<a name="line.679"></a>
-<span class="sourceLineNo">680</span>}<a name="line.680"></a>
+<span class="sourceLineNo">169</span>    this.get = scan.isGetScan();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    this.rowComparator = scanInfo.getComparator();<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    this.regionCoprocessorHost = regionCoprocessorHost;<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    this.deletes =  instantiateDeleteTracker();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    this.stopRow = scan.getStopRow();<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    this.startKey = CellUtil.createFirstDeleteFamilyCellOnRow(scan.getStartRow(),<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        scanInfo.getFamily());<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    this.filter = scan.getFilter();<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    this.earliestPutTs = earliestPutTs;<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    this.oldestUnexpiredTS = oldestUnexpiredTS;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    this.now = now;<a name="line.179"></a>
+<span class="sourceLineNo">180</span><a name="line.180"></a>
+<span class="sourceLineNo">181</span>    this.maxReadPointToTrackVersions = readPointToUse;<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    this.timeToPurgeDeletes = scanInfo.getTimeToPurgeDeletes();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    this.ttl = oldestUnexpiredTS;<a name="line.183"></a>
+<span class="sourceLineNo">184</span><a name="line.184"></a>
+<span class="sourceLineNo">185</span>    /* how to deal with deletes */<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    this.isUserScan = scanType == ScanType.USER_SCAN;<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    // keep deleted cells: if compaction or raw scan<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    this.keepDeletedCells = scan.isRaw() ? KeepDeletedCells.TRUE :<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      isUserScan ? KeepDeletedCells.FALSE : scanInfo.getKeepDeletedCells();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    // retain deletes: if minor compaction or raw scanisDone<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    this.retainDeletesInOutput = scanType == ScanType.COMPACT_RETAIN_DELETES || scan.isRaw();<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    // seePastDeleteMarker: user initiated scans<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    this.seePastDeleteMarkers =<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        scanInfo.getKeepDeletedCells() != KeepDeletedCells.FALSE &amp;&amp; isUserScan;<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    int maxVersions =<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        scan.isRaw() ? scan.getMaxVersions() : Math.min(scan.getMaxVersions(),<a name="line.197"></a>
+<span class="sourceLineNo">198</span>          scanInfo.getMaxVersions());<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>    // Single branch to deal with two types of reads (columns vs all in family)<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    if (columns == null || columns.size() == 0) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      // there is always a null column in the wildcard column query.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      hasNullColumn = true;<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>      // use a specialized scan for wildcard column tracker.<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      this.columns = new ScanWildcardColumnTracker(<a name="line.206"></a>
+<span class="sourceLineNo">207</span>          scanInfo.getMinVersions(), maxVersions, oldestUnexpiredTS);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    } else {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      // whether there is null column in the explicit column query<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      hasNullColumn = (columns.first().length == 0);<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>      // We can share the ExplicitColumnTracker, diff is we reset<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      // between rows, not between storefiles.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      this.columns = new ExplicitColumnTracker(columns, scanInfo.getMinVersions(), maxVersions,<a name="line.214"></a>
+<span class="sourceLineNo">215</span>          oldestUnexpiredTS);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    }<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    this.isReversed = scan.isReversed();<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>  private DeleteTracker instantiateDeleteTracker() throws IOException {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    DeleteTracker tracker = new ScanDeleteTracker();<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    if (regionCoprocessorHost != null) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      tracker = regionCoprocessorHost.postInstantiateDeleteTracker(tracker);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    return tracker;<a name="line.225"></a>
+<span class="sourceLineNo">226</span>  }<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>   * Construct a QueryMatcher for a scan that drop deletes from a limited range of rows.<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * @param scan<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * @param scanInfo The store's immutable scan info<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   * @param columns<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * @param earliestPutTs Earliest put seen in any of the store files.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @param oldestUnexpiredTS the oldest timestamp we are interested in, based on TTL<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @param now the current server time<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   * @param dropDeletesFromRow The inclusive left bound of the range; can be EMPTY_START_ROW.<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * @param dropDeletesToRow The exclusive right bound of the range; can be EMPTY_END_ROW.<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param regionCoprocessorHost<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @throws IOException<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public ScanQueryMatcher(Scan scan, ScanInfo scanInfo, NavigableSet&lt;byte[]&gt; columns,<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      long readPointToUse, long earliestPutTs, long oldestUnexpiredTS, long now,<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      byte[] dropDeletesFromRow, byte[] dropDeletesToRow,<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      RegionCoprocessorHost regionCoprocessorHost) throws IOException {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    this(scan, scanInfo, columns, ScanType.COMPACT_RETAIN_DELETES, readPointToUse, earliestPutTs,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        oldestUnexpiredTS, now, regionCoprocessorHost);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    Preconditions.checkArgument((dropDeletesFromRow != null) &amp;&amp; (dropDeletesToRow != null));<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    this.dropDeletesFromRow = dropDeletesFromRow;<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    this.dropDeletesToRow = dropDeletesToRow;<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>   * Constructor for tests<a name="line.253"></a>
+<span class="sourceLineNo">254</span>   */<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  ScanQueryMatcher(Scan scan, ScanInfo scanInfo,<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      NavigableSet&lt;byte[]&gt; columns, long oldestUnexpiredTS, long now) throws IOException {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    this(scan, scanInfo, columns, ScanType.USER_SCAN,<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          Long.MAX_VALUE, /* max Readpoint to track versions */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        HConstants.LATEST_TIMESTAMP, oldestUnexpiredTS, now, null);<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>   *<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * @return  whether there is an null column in the query<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public boolean hasNullColumnInQuery() {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    return hasNullColumn;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Determines if the caller should do one of several things:<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * - seek/skip to the next row (MatchCode.SEEK_NEXT_ROW)<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * - seek/skip to the next column (MatchCode.SEEK_NEXT_COL)<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * - include the current KeyValue (MatchCode.INCLUDE)<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   * - ignore the current KeyValue (MatchCode.SKIP)<a name="line.275"></a>
+<span class="sourceLineNo">276</span>   * - got to the next row (MatchCode.DONE)<a name="line.276"></a>
+<span class="sourceLineNo">277</span>   *<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   * @param cell KeyValue to check<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * @return The match code instance.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   * @throws IOException in case there is an internal consistency problem<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   *      caused by a data corruption.<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   */<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public MatchCode match(Cell cell) throws IOException {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    if (filter != null &amp;&amp; filter.filterAllRemaining()) {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      return MatchCode.DONE_SCAN;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    if (curCell != null) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      int ret = this.rowComparator.compareRows(curCell, cell);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      if (!this.isReversed) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        if (ret &lt;= -1) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>          return MatchCode.DONE;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        } else if (ret &gt;= 1) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>          // could optimize this, if necessary?<a name="line.293"></a>
+<span class="sourceLineNo">294</span>          // Could also be called SEEK_TO_CURRENT_ROW, but this<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          // should be rare/never happens.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          return MatchCode.SEEK_NEXT_ROW;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>        }<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      } else {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>        if (ret &lt;= -1) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>          return MatchCode.SEEK_NEXT_ROW;<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        } else if (ret &gt;= 1) {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          return MatchCode.DONE;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    } else {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      // Since the curCell is null it means we are already sure that we have moved over to the next row<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      return MatchCode.DONE;<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>    // optimize case.<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    if (this.stickyNextRow) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      return MatchCode.SEEK_NEXT_ROW;<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>    if (this.columns.done()) {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      stickyNextRow = true;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      return MatchCode.SEEK_NEXT_ROW;<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>    long timestamp = cell.getTimestamp();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    // check for early out based on timestamp alone<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    if (columns.isDone(timestamp)) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      return columns.getNextRowOrNextColumn(cell);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    }<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    // check if the cell is expired by cell TTL<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    if (HStore.isCellTTLExpired(cell, this.oldestUnexpiredTS, this.now)) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      return MatchCode.SKIP;<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">330</span>    /*<a name="line.330"></a>
+<span class="sourceLineNo">331</span>     * The delete logic is pretty complicated now.<a name="line.331"></a>
+<span class="sourceLineNo">332</span>     * This is corroborated by the following:<a name="line.332"></a>
+<span class="sourceLineNo">333</span>     * 1. The store might be instructed to keep deleted rows around.<a name="line.333"></a>
+<span class="sourceLineNo">334</span>     * 2. A scan can optionally see past a delete marker now.<a name="line.334"></a>
+<span class="sourceLineNo">335</span>     * 3. If deleted rows are kept, we have to find out when we can<a name="line.335"></a>
+<span class="sourceLineNo">336</span>     *    remove the delete markers.<a name="line.336"></a>
+<span class="sourceLineNo">337</span>     * 4. Family delete markers are always first (regardless of their TS)<a name="line.337"></a>
+<span class="sourceLineNo">338</span>     * 5. Delete markers should not be counted as version<a name="line.338"></a>
+<span class="sourceLineNo">339</span>     * 6. Delete markers affect puts of the *same* TS<a name="line.339"></a>
+<span class="sourceLineNo">340</span>     * 7. Delete marker need to be version counted together with puts<a name="line.340"></a>
+<span class="sourceLineNo">341</span>     *    they affect<a name="line.341"></a>
+<span class="sourceLineNo">342</span>     */<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    byte typeByte = cell.getTypeByte();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    long mvccVersion = cell.getSequenceId();<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    if (CellUtil.isDelete(cell)) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (keepDeletedCells == KeepDeletedCells.FALSE<a name="line.346"></a>
+<span class="sourceLineNo">347</span>          || (keepDeletedCells == KeepDeletedCells.TTL &amp;&amp; timestamp &lt; ttl)) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        // first ignore delete markers if the scanner can do so, and the<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        // range does not include the marker<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        //<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        // during flushes and compactions also ignore delete markers newer<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        // than the readpoint of any open scanner, this prevents deleted<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        // rows that could still be seen by a scanner from being collected<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        boolean includeDeleteMarker = seePastDeleteMarkers ?<a name="line.354"></a>
+<span class="sourceLineNo">355</span>            tr.withinTimeRange(timestamp) :<a name="line.355"></a>
+<span class="sourceLineNo">356</span>            tr.withinOrAfterTimeRange(timestamp);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        if (includeDeleteMarker<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            &amp;&amp; mvccVersion &lt;= maxReadPointToTrackVersions) {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>          this.deletes.add(cell);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        }<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        // Can't early out now, because DelFam come before any other keys<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>      if ((!isUserScan)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>          &amp;&amp; timeToPurgeDeletes &gt; 0<a name="line.365"></a>
+<span class="sourceLineNo">366</span>          &amp;&amp; (EnvironmentEdgeManager.currentTime() - timestamp)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>            &lt;= timeToPurgeDeletes) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        return MatchCode.INCLUDE;<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      } else if (retainDeletesInOutput || mvccVersion &gt; maxReadPointToTrackVersions) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        // always include or it is not time yet to check whether it is OK<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        // to purge deltes or not<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        if (!isUserScan) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>          // if this is not a user scan (compaction), we can filter this deletemarker right here<a name="line.373"></a>
+<span class="sourceLineNo">374</span>          // otherwise (i.e. a "raw" scan) we fall through to normal version and timerange checking<a name="line.374"></a>
+<span class="sourceLineNo">375</span>          return MatchCode.INCLUDE;<a name="line.375"></a>
+<span class="sourceLineNo">376</span>        }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      } else if (keepDeletedCells == KeepDeletedCells.TRUE<a name="line.377"></a>
+<span class="sourceLineNo">378</span>          || (keepDeletedCells == KeepDeletedCells.TTL &amp;&amp; timestamp &gt;= ttl)) {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        if (timestamp &lt; earliestPutTs) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>          // keeping delete rows, but there are no puts older than<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          // this delete in the store files.<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          return columns.getNextRowOrNextColumn(cell);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        }<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        // else: fall through and do version counting on the<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        // delete markers<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      } else {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        return MatchCode.SKIP;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      // note the following next else if...<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      // delete marker are not subject to other delete markers<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    } else if (!this.deletes.isEmpty()) {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      DeleteResult deleteResult = deletes.isDeleted(cell);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      switch (deleteResult) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        case FAMILY_DELETED:<a name="line.394"></a>
+<span class="sourceLineNo">395</span>        case COLUMN_DELETED:<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          return columns.getNextRowOrNextColumn(cell);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        case VERSION_DELETED:<a name="line.397"></a>
+<span class="sourceLineNo">398</span>        case FAMILY_VERSION_DELETED:<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          return MatchCode.SKIP;<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        case NOT_DELETED:<a name="line.400"></a>
+<span class="sourceLineNo">401</span>          break;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        default:<a name="line.402"></a>
+<span class="sourceLineNo">403</span>          throw new RuntimeException("UNEXPECTED");<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    int timestampComparison = tr.compare(timestamp);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    if (timestampComparison &gt;= 1) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      return MatchCode.SKIP;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    } else if (timestampComparison &lt;= -1) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      return columns.getNextRowOrNextColumn(cell);<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>    // STEP 1: Check if the column is part of the requested columns<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    MatchCode colChecker = columns.checkColumn(cell, typeByte);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (colChecker == MatchCode.INCLUDE) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      ReturnCode filterResponse = ReturnCode.SKIP;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      // STEP 2: Yes, the column is part of the requested columns. Check if filter is present<a name="line.418"></a>
+<span class="sourceLineNo">419</span>      if (filter != null) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        // STEP 3: Filter the key value and return if it filters out<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        filterResponse = filter.filterKeyValue(cell);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        switch (filterResponse) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        case SKIP:<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          return MatchCode.SKIP;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        case NEXT_COL:<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          return columns.getNextRowOrNextColumn(cell);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        case NEXT_ROW:<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          stickyNextRow = true;<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          return MatchCode.SEEK_NEXT_ROW;<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        case SEEK_NEXT_USING_HINT:<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          return MatchCode.SEEK_NEXT_USING_HINT;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>        default:<a name="line.432"></a>
+<span class="sourceLineNo">433</span>          //It means it is either include or include and seek next<a name="line.433"></a>
+<span class="sourceLineNo">434</span>          break;<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        }<a name="line.435"></a>
+<span class="sourceLineNo">436</span>      }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      /*<a name="line.437"></a>
+<span class="sourceLineNo">438</span>       * STEP 4: Reaching this step means the column is part of the requested columns and either<a name="line.438"></a>
+<span class="sourceLineNo">439</span>       * the filter is null or the filter has returned INCLUDE or INCLUDE_AND_NEXT_COL response.<a name="line.439"></a>
+<span class="sourceLineNo">440</span>       * Now check the number of versions needed. This method call returns SKIP, INCLUDE,<a name="line.440"></a>
+<span class="sourceLineNo">441</span>       * INCLUDE_AND_SEEK_NEXT_ROW, INCLUDE_AND_SEEK_NEXT_COL.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>       *<a name="line.442"></a>
+<span class="sourceLineNo">443</span>       * FilterResponse            ColumnChecker               Desired behavior<a name="line.443"></a>
+<span class="sourceLineNo">444</span>       * INCLUDE                   SKIP                        row has already been included, SKIP.<a name="line.444"></a>
+<span class="sourceLineNo">445</span>       * INCLUDE                   INCLUDE                     INCLUDE<a name="line.445"></a>
+<span class="sourceLineNo">446</span>       * INCLUDE                   INCLUDE_AND_SEEK_NEXT_COL   INCLUDE_AND_SEEK_NEXT_COL<a name="line.446"></a>
+<span class="sourceLineNo">447</span>       * INCLUDE                   INCLUDE_AND_SEEK_NEXT_ROW   INCLUDE_AND_SEEK_NEXT_ROW<a name="line.447"></a>
+<span class="sourceLineNo">448</span>       * INCLUDE_AND_SEEK_NEXT_COL SKIP                        row has already been included, SKIP.<a name="line.448"></a>
+<span class="sourceLineNo">449</span>       * INCLUDE_AND_SEEK_NEXT_COL INCLUDE                     INCLUDE_AND_SEEK_NEXT_COL<a name="line.449"></a>
+<span class="sourceLineNo">450</span>       * INCLUDE_AND_SEEK_NEXT_COL INCLUDE_AND_SEEK_NEXT_COL   INCLUDE_AND_SEEK_NEXT_COL<a name="line.450"></a>
+<span class="sourceLineNo">451</span>       * INCLUDE_AND_SEEK_NEXT_COL INCLUDE_AND_SEEK_NEXT_ROW   INCLUDE_AND_SEEK_NEXT_ROW<a name="line.451"></a>
+<span class="sourceLineNo">452</span>       *<a name="line.452"></a>
+<span class="sourceLineNo">453</span>       * In all the above scenarios, we return the column checker return value except for<a name="line.453"></a>
+<span class="sourceLineNo">454</span>       * FilterResponse (INCLUDE_AND_SEEK_NEXT_COL) and ColumnChecker(INCLUDE)<a name="line.454"></a>
+<span class="sourceLineNo">455</span>       */<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      colChecker = columns.checkVersions(cell, timestamp, typeByte,<a name="line.456"></a>
+<span class="sourceLineNo">457</span>          mvccVersion &gt; maxReadPointToTrackVersions);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      //Optimize with stickyNextRow<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      boolean seekNextRowFromEssential = filterResponse == ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW &amp;&amp;<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          filter.isFamilyEssential(cell.getFamilyArray());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      if (colChecker == MatchCode.INCLUDE_AND_SEEK_NEXT_ROW || seekNextRowFromEssential) {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>        stickyNextRow = true;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      if (filterResponse == ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW) {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>        if (colChecker != MatchCode.SKIP) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          return MatchCode.INCLUDE_AND_SEEK_NEXT_ROW;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        return MatchCode.SEEK_NEXT_ROW;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      return (filterResponse == ReturnCode.INCLUDE_AND_NEXT_COL &amp;&amp;<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          colChecker == MatchCode.INCLUDE) ? MatchCode.INCLUDE_AND_SEEK_NEXT_COL<a name="line.471"></a>
+<span class="sourceLineNo">472</span>          : colChecker;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    stickyNextRow = (colChecker == MatchCode.SEEK_NEXT_ROW) ? true<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        : stickyNextRow;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    return colChecker;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>  }<a name="line.477"></a>
+<span class="sourceLineNo">478</span><a name="line.478"></a>
+<span class="sourceLineNo">479</span>  /** Handle partial-drop-deletes. As we match keys in order, when we have a range from which<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * we can drop deletes, we can set retainDeletesInOutput to false for the duration of this<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * range only, and maintain consistency. */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  private void checkPartialDropDeleteRange(Cell curCell) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    // If partial-drop-deletes are used, initially, dropDeletesFromRow and dropDeletesToRow<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // are both set, and the matcher is set to retain deletes. We assume ordered keys. When<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // dropDeletesFromRow is leq current kv, we start dropping deletes and reset<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    // dr

<TRUNCATED>

[04/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html
new file mode 100644
index 0000000..a8cacf0
--- /dev/null
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html
@@ -0,0 +1,178 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+<title>Source code</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<div class="sourceContainer">
+<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
+<span class="sourceLineNo">002</span> *<a name="line.2"></a>
+<span class="sourceLineNo">003</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.3"></a>
+<span class="sourceLineNo">004</span> * or more contributor license agreements.  See the NOTICE file<a name="line.4"></a>
+<span class="sourceLineNo">005</span> * distributed with this work for additional information<a name="line.5"></a>
+<span class="sourceLineNo">006</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.6"></a>
+<span class="sourceLineNo">007</span> * to you under the Apache License, Version 2.0 (the<a name="line.7"></a>
+<span class="sourceLineNo">008</span> * "License"); you may not use this file except in compliance<a name="line.8"></a>
+<span class="sourceLineNo">009</span> * with the License.  You may obtain a copy of the License at<a name="line.9"></a>
+<span class="sourceLineNo">010</span> *<a name="line.10"></a>
+<span class="sourceLineNo">011</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.11"></a>
+<span class="sourceLineNo">012</span> *<a name="line.12"></a>
+<span class="sourceLineNo">013</span> * Unless required by applicable law or agreed to in writing, software<a name="line.13"></a>
+<span class="sourceLineNo">014</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.14"></a>
+<span class="sourceLineNo">015</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.15"></a>
+<span class="sourceLineNo">016</span> * See the License for the specific language governing permissions and<a name="line.16"></a>
+<span class="sourceLineNo">017</span> * limitations under the License.<a name="line.17"></a>
+<span class="sourceLineNo">018</span> */<a name="line.18"></a>
+<span class="sourceLineNo">019</span>package org.apache.hadoop.hbase.regionserver;<a name="line.19"></a>
+<span class="sourceLineNo">020</span><a name="line.20"></a>
+<span class="sourceLineNo">021</span>import java.io.IOException;<a name="line.21"></a>
+<span class="sourceLineNo">022</span><a name="line.22"></a>
+<span class="sourceLineNo">023</span>import com.google.common.collect.ImmutableList;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import org.apache.commons.lang.RandomStringUtils;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.client.Get;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.client.Put;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.filter.TimestampsFilter;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.testclassification.RegionServerTests;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.junit.Before;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.junit.Test;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.junit.experimental.categories.Category;<a name="line.35"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>import static org.junit.Assert.assertTrue;<a name="line.37"></a>
+<span class="sourceLineNo">038</span><a name="line.38"></a>
+<span class="sourceLineNo">039</span>@Category({RegionServerTests.class, LargeTests.class})<a name="line.39"></a>
+<span class="sourceLineNo">040</span>public class TestTimestampFilterSeekHint {<a name="line.40"></a>
+<span class="sourceLineNo">041</span><a name="line.41"></a>
+<span class="sourceLineNo">042</span>  private final static HBaseTestingUtility TEST_UTIL = HBaseTestingUtility.createLocalHTU();<a name="line.42"></a>
+<span class="sourceLineNo">043</span>  private final static String RK = "myRK";<a name="line.43"></a>
+<span class="sourceLineNo">044</span>  private final static byte[] RK_BYTES = Bytes.toBytes(RK);<a name="line.44"></a>
+<span class="sourceLineNo">045</span><a name="line.45"></a>
+<span class="sourceLineNo">046</span>  private final static String FAMILY = "D";<a name="line.46"></a>
+<span class="sourceLineNo">047</span>  private final static byte[] FAMILY_BYTES = Bytes.toBytes(FAMILY);<a name="line.47"></a>
+<span class="sourceLineNo">048</span><a name="line.48"></a>
+<span class="sourceLineNo">049</span>  private final static String QUAL = "0";<a name="line.49"></a>
+<span class="sourceLineNo">050</span>  private final static byte[] QUAL_BYTES = Bytes.toBytes(QUAL);<a name="line.50"></a>
+<span class="sourceLineNo">051</span><a name="line.51"></a>
+<span class="sourceLineNo">052</span>  public static final int MAX_VERSIONS = 50000;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>  private HRegion region;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>  private int regionCount = 0;<a name="line.54"></a>
+<span class="sourceLineNo">055</span><a name="line.55"></a>
+<span class="sourceLineNo">056</span>  @Test<a name="line.56"></a>
+<span class="sourceLineNo">057</span>  public void testGetSeek() throws IOException {<a name="line.57"></a>
+<span class="sourceLineNo">058</span>    StoreFileScanner.instrument();<a name="line.58"></a>
+<span class="sourceLineNo">059</span>    prepareRegion();<a name="line.59"></a>
+<span class="sourceLineNo">060</span><a name="line.60"></a>
+<span class="sourceLineNo">061</span>    Get g = new Get(RK_BYTES);<a name="line.61"></a>
+<span class="sourceLineNo">062</span>    final TimestampsFilter timestampsFilter = new TimestampsFilter(ImmutableList.of(5L), true);<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    g.setFilter(timestampsFilter);<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    final long initialSeekCount = StoreFileScanner.getSeekCount();<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    region.get(g);<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    final long finalSeekCount = StoreFileScanner.getSeekCount();<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>      Make sure there's more than one.<a name="line.69"></a>
+<span class="sourceLineNo">070</span>      Aka one seek to get to the row, and one to get to the time.<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    */<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    assertTrue(finalSeekCount &gt;= initialSeekCount + 3 );<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>  @Test<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  public void testGetDoesntSeekWithNoHint() throws IOException {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>    StoreFileScanner.instrument();<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    prepareRegion();<a name="line.78"></a>
+<span class="sourceLineNo">079</span><a name="line.79"></a>
+<span class="sourceLineNo">080</span>    Get g = new Get(RK_BYTES);<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    g.setFilter(new TimestampsFilter(ImmutableList.of(5L)));<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    final long initialSeekCount = StoreFileScanner.getSeekCount();<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    region.get(g);<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    final long finalSeekCount = StoreFileScanner.getSeekCount();<a name="line.84"></a>
+<span class="sourceLineNo">085</span><a name="line.85"></a>
+<span class="sourceLineNo">086</span>    assertTrue(finalSeekCount &gt;= initialSeekCount );<a name="line.86"></a>
+<span class="sourceLineNo">087</span>    assertTrue(finalSeekCount &lt; initialSeekCount + 3);<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>  @Before<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  public void prepareRegion() throws IOException {<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    region =<a name="line.92"></a>
+<span class="sourceLineNo">093</span>        TEST_UTIL.createTestRegion("TestTimestampFilterSeekHint" + regionCount++,<a name="line.93"></a>
+<span class="sourceLineNo">094</span>            new HColumnDescriptor(FAMILY)<a name="line.94"></a>
+<span class="sourceLineNo">095</span>                .setBlocksize(1024)<a name="line.95"></a>
+<span class="sourceLineNo">096</span>                .setMaxVersions(MAX_VERSIONS)<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>    for (long i = 0; i &lt;MAX_VERSIONS - 2; i++) {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      Put p = new Put(RK_BYTES, i);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      p.addColumn(FAMILY_BYTES, QUAL_BYTES, Bytes.toBytes(RandomStringUtils.randomAlphabetic(255)));<a name="line.101"></a>
+<span class="sourceLineNo">102</span>      region.put(p);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    }<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    region.flush(true);<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>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/xref-test/allclasses-frame.html
----------------------------------------------------------------------
diff --git a/xref-test/allclasses-frame.html b/xref-test/allclasses-frame.html
index df3cf49..8436de0 100644
--- a/xref-test/allclasses-frame.html
+++ b/xref-test/allclasses-frame.html
@@ -261,6 +261,9 @@
 				<a href="org/apache/hadoop/hbase/CategoryBasedTimeout.html" target="classFrame">CategoryBasedTimeout</a>
 			</li>
 						<li>
+				<a href="org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" target="classFrame">CellGridStoreScanner</a>
+			</li>
+						<li>
 				<a href="org/apache/hadoop/hbase/chaos/actions/ChangeBloomFilterAction.html" target="classFrame">ChangeBloomFilterAction</a>
 			</li>
 						<li>
@@ -4863,6 +4866,9 @@
 				<a href="org/apache/hadoop/hbase/codec/prefixtree/timestamp/TestTimestampEncoder.html" target="classFrame">TestTimestampEncoder</a>
 			</li>
 						<li>
+				<a href="org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" target="classFrame">TestTimestampFilterSeekHint</a>
+			</li>
+						<li>
 				<a href="org/apache/hadoop/hbase/client/TestTimestampsFilter.html" target="classFrame">TestTimestampsFilter</a>
 			</li>
 						<li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/xref-test/org/apache/hadoop/hbase/io/hfile/TestHFile.html
----------------------------------------------------------------------
diff --git a/xref-test/org/apache/hadoop/hbase/io/hfile/TestHFile.html b/xref-test/org/apache/hadoop/hbase/io/hfile/TestHFile.html
index 1ef6cd4..99167e8 100644
--- a/xref-test/org/apache/hadoop/hbase/io/hfile/TestHFile.html
+++ b/xref-test/org/apache/hadoop/hbase/io/hfile/TestHFile.html
@@ -407,155 +407,175 @@
 <a class="jxr_linenumber" name="397" href="#397">397</a>   <em class="jxr_javadoccomment">/**</em>
 <a class="jxr_linenumber" name="398" href="#398">398</a> <em class="jxr_javadoccomment">   * Make sure the ordinals for our compression algorithms do not change on us.</em>
 <a class="jxr_linenumber" name="399" href="#399">399</a> <em class="jxr_javadoccomment">   */</em>
-<a class="jxr_linenumber" name="400" href="#400">400</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testCompressionOrdinance() {
-<a class="jxr_linenumber" name="401" href="#401">401</a>     assertTrue(Compression.Algorithm.LZO.ordinal() == 0);
-<a class="jxr_linenumber" name="402" href="#402">402</a>     assertTrue(Compression.Algorithm.GZ.ordinal() == 1);
-<a class="jxr_linenumber" name="403" href="#403">403</a>     assertTrue(Compression.Algorithm.NONE.ordinal() == 2);
-<a class="jxr_linenumber" name="404" href="#404">404</a>     assertTrue(Compression.Algorithm.SNAPPY.ordinal() == 3);
-<a class="jxr_linenumber" name="405" href="#405">405</a>     assertTrue(Compression.Algorithm.LZ4.ordinal() == 4);
-<a class="jxr_linenumber" name="406" href="#406">406</a>   }
-<a class="jxr_linenumber" name="407" href="#407">407</a> 
-<a class="jxr_linenumber" name="408" href="#408">408</a>   @Test
-<a class="jxr_linenumber" name="409" href="#409">409</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testGetShortMidpoint() {
-<a class="jxr_linenumber" name="410" href="#410">410</a>     Cell left = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="411" href="#411">411</a>     Cell right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="412" href="#412">412</a>     Cell mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);
-<a class="jxr_linenumber" name="413" href="#413">413</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt;= 0);
-<a class="jxr_linenumber" name="414" href="#414">414</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt;= 0);
-<a class="jxr_linenumber" name="415" href="#415">415</a> 
-<a class="jxr_linenumber" name="416" href="#416">416</a>     left = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="417" href="#417">417</a>     right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"b"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="418" href="#418">418</a>     mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);
-<a class="jxr_linenumber" name="419" href="#419">419</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);
-<a class="jxr_linenumber" name="420" href="#420">420</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt;= 0);
-<a class="jxr_linenumber" name="421" href="#421">421</a> 
-<a class="jxr_linenumber" name="422" href="#422">422</a>     left = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"g"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="423" href="#423">423</a>     right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"i"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="424" href="#424">424</a>     mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);
-<a class="jxr_linenumber" name="425" href="#425">425</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);
-<a class="jxr_linenumber" name="426" href="#426">426</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt;= 0);
+<a class="jxr_linenumber" name="400" href="#400">400</a>   @Test
+<a class="jxr_linenumber" name="401" href="#401">401</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testCompressionOrdinance() {
+<a class="jxr_linenumber" name="402" href="#402">402</a>     assertTrue(Compression.Algorithm.LZO.ordinal() == 0);
+<a class="jxr_linenumber" name="403" href="#403">403</a>     assertTrue(Compression.Algorithm.GZ.ordinal() == 1);
+<a class="jxr_linenumber" name="404" href="#404">404</a>     assertTrue(Compression.Algorithm.NONE.ordinal() == 2);
+<a class="jxr_linenumber" name="405" href="#405">405</a>     assertTrue(Compression.Algorithm.SNAPPY.ordinal() == 3);
+<a class="jxr_linenumber" name="406" href="#406">406</a>     assertTrue(Compression.Algorithm.LZ4.ordinal() == 4);
+<a class="jxr_linenumber" name="407" href="#407">407</a>   }
+<a class="jxr_linenumber" name="408" href="#408">408</a> 
+<a class="jxr_linenumber" name="409" href="#409">409</a>   @Test
+<a class="jxr_linenumber" name="410" href="#410">410</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testShortMidpointSameQual() {
+<a class="jxr_linenumber" name="411" href="#411">411</a>     Cell left = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>),
+<a class="jxr_linenumber" name="412" href="#412">412</a>         Bytes.toBytes(<span class="jxr_string">"a"</span>),
+<a class="jxr_linenumber" name="413" href="#413">413</a>         Bytes.toBytes(<span class="jxr_string">"a"</span>),
+<a class="jxr_linenumber" name="414" href="#414">414</a>         9,
+<a class="jxr_linenumber" name="415" href="#415">415</a>         KeyValue.Type.Maximum.getCode(),
+<a class="jxr_linenumber" name="416" href="#416">416</a>         HConstants.EMPTY_BYTE_ARRAY);
+<a class="jxr_linenumber" name="417" href="#417">417</a>     Cell right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>),
+<a class="jxr_linenumber" name="418" href="#418">418</a>         Bytes.toBytes(<span class="jxr_string">"a"</span>),
+<a class="jxr_linenumber" name="419" href="#419">419</a>         Bytes.toBytes(<span class="jxr_string">"a"</span>),
+<a class="jxr_linenumber" name="420" href="#420">420</a>         11,
+<a class="jxr_linenumber" name="421" href="#421">421</a>         KeyValue.Type.Maximum.getCode(),
+<a class="jxr_linenumber" name="422" href="#422">422</a>         HConstants.EMPTY_BYTE_ARRAY);
+<a class="jxr_linenumber" name="423" href="#423">423</a>     Cell mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);
+<a class="jxr_linenumber" name="424" href="#424">424</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt;= 0);
+<a class="jxr_linenumber" name="425" href="#425">425</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) == 0);
+<a class="jxr_linenumber" name="426" href="#426">426</a>   }
 <a class="jxr_linenumber" name="427" href="#427">427</a> 
-<a class="jxr_linenumber" name="428" href="#428">428</a>     left = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="429" href="#429">429</a>     right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"bbbbbbb"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="430" href="#430">430</a>     mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);
-<a class="jxr_linenumber" name="431" href="#431">431</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);
-<a class="jxr_linenumber" name="432" href="#432">432</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt; 0);
-<a class="jxr_linenumber" name="433" href="#433">433</a>     assertEquals(1, (<strong class="jxr_keyword">int</strong>) mid.getRowLength());
-<a class="jxr_linenumber" name="434" href="#434">434</a> 
-<a class="jxr_linenumber" name="435" href="#435">435</a>     left = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="436" href="#436">436</a>     right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"b"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="437" href="#437">437</a>     mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);
-<a class="jxr_linenumber" name="438" href="#438">438</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);
-<a class="jxr_linenumber" name="439" href="#439">439</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt;= 0);
-<a class="jxr_linenumber" name="440" href="#440">440</a> 
-<a class="jxr_linenumber" name="441" href="#441">441</a>     left = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="442" href="#442">442</a>     right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"aaaaaaaa"</span>), Bytes.toBytes(<span class="jxr_string">"b"</span>));
-<a class="jxr_linenumber" name="443" href="#443">443</a>     mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);
-<a class="jxr_linenumber" name="444" href="#444">444</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);
-<a class="jxr_linenumber" name="445" href="#445">445</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt; 0);
-<a class="jxr_linenumber" name="446" href="#446">446</a>     assertEquals(2, (<strong class="jxr_keyword">int</strong>) mid.getFamilyLength());
+<a class="jxr_linenumber" name="428" href="#428">428</a>   @Test
+<a class="jxr_linenumber" name="429" href="#429">429</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testGetShortMidpoint() {
+<a class="jxr_linenumber" name="430" href="#430">430</a>     Cell left = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="431" href="#431">431</a>     Cell right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="432" href="#432">432</a>     Cell mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);
+<a class="jxr_linenumber" name="433" href="#433">433</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt;= 0);
+<a class="jxr_linenumber" name="434" href="#434">434</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt;= 0);
+<a class="jxr_linenumber" name="435" href="#435">435</a> 
+<a class="jxr_linenumber" name="436" href="#436">436</a>     left = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="437" href="#437">437</a>     right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"b"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="438" href="#438">438</a>     mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);
+<a class="jxr_linenumber" name="439" href="#439">439</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);
+<a class="jxr_linenumber" name="440" href="#440">440</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt;= 0);
+<a class="jxr_linenumber" name="441" href="#441">441</a> 
+<a class="jxr_linenumber" name="442" href="#442">442</a>     left = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"g"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="443" href="#443">443</a>     right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"i"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="444" href="#444">444</a>     mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);
+<a class="jxr_linenumber" name="445" href="#445">445</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);
+<a class="jxr_linenumber" name="446" href="#446">446</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt;= 0);
 <a class="jxr_linenumber" name="447" href="#447">447</a> 
 <a class="jxr_linenumber" name="448" href="#448">448</a>     left = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="449" href="#449">449</a>     right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"aaaaaaaaa"</span>));
+<a class="jxr_linenumber" name="449" href="#449">449</a>     right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"bbbbbbb"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
 <a class="jxr_linenumber" name="450" href="#450">450</a>     mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);
 <a class="jxr_linenumber" name="451" href="#451">451</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);
 <a class="jxr_linenumber" name="452" href="#452">452</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt; 0);
-<a class="jxr_linenumber" name="453" href="#453">453</a>     assertEquals(2, (<strong class="jxr_keyword">int</strong>) mid.getQualifierLength());
+<a class="jxr_linenumber" name="453" href="#453">453</a>     assertEquals(1, (<strong class="jxr_keyword">int</strong>) mid.getRowLength());
 <a class="jxr_linenumber" name="454" href="#454">454</a> 
 <a class="jxr_linenumber" name="455" href="#455">455</a>     left = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="456" href="#456">456</a>     right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"b"</span>));
+<a class="jxr_linenumber" name="456" href="#456">456</a>     right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"b"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
 <a class="jxr_linenumber" name="457" href="#457">457</a>     mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);
 <a class="jxr_linenumber" name="458" href="#458">458</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);
 <a class="jxr_linenumber" name="459" href="#459">459</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt;= 0);
-<a class="jxr_linenumber" name="460" href="#460">460</a>     assertEquals(1, (<strong class="jxr_keyword">int</strong>) mid.getQualifierLength());
-<a class="jxr_linenumber" name="461" href="#461">461</a> 
-<a class="jxr_linenumber" name="462" href="#462">462</a>     <em class="jxr_comment">// Assert that if meta comparator, it returns the right cell -- i.e. no</em>
-<a class="jxr_linenumber" name="463" href="#463">463</a>     <em class="jxr_comment">// optimization done.</em>
-<a class="jxr_linenumber" name="464" href="#464">464</a>     left = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"g"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="465" href="#465">465</a>     right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"i"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
-<a class="jxr_linenumber" name="466" href="#466">466</a>     mid = HFileWriterImpl.getMidpoint(CellComparator.META_COMPARATOR, left, right);
-<a class="jxr_linenumber" name="467" href="#467">467</a>     assertTrue(CellComparator.META_COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);
-<a class="jxr_linenumber" name="468" href="#468">468</a>     assertTrue(CellComparator.META_COMPARATOR.compareKeyIgnoresMvcc(mid, right) == 0);
-<a class="jxr_linenumber" name="469" href="#469">469</a> 
-<a class="jxr_linenumber" name="470" href="#470">470</a>     <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="471" href="#471">471</a> <em class="jxr_javadoccomment">     * See HBASE-7845</em>
-<a class="jxr_linenumber" name="472" href="#472">472</a> <em class="jxr_javadoccomment">     */</em>
-<a class="jxr_linenumber" name="473" href="#473">473</a>     byte[] rowA = Bytes.toBytes(<span class="jxr_string">"rowA"</span>);
-<a class="jxr_linenumber" name="474" href="#474">474</a>     byte[] rowB = Bytes.toBytes(<span class="jxr_string">"rowB"</span>);
-<a class="jxr_linenumber" name="475" href="#475">475</a> 
-<a class="jxr_linenumber" name="476" href="#476">476</a>     byte[] family = Bytes.toBytes(<span class="jxr_string">"family"</span>);
-<a class="jxr_linenumber" name="477" href="#477">477</a>     byte[] qualA = Bytes.toBytes(<span class="jxr_string">"qfA"</span>);
-<a class="jxr_linenumber" name="478" href="#478">478</a>     byte[] qualB = Bytes.toBytes(<span class="jxr_string">"qfB"</span>);
-<a class="jxr_linenumber" name="479" href="#479">479</a>     <strong class="jxr_keyword">final</strong> CellComparator keyComparator = CellComparator.COMPARATOR;
-<a class="jxr_linenumber" name="480" href="#480">480</a>     <em class="jxr_comment">// verify that faked shorter rowkey could be generated</em>
-<a class="jxr_linenumber" name="481" href="#481">481</a>     <strong class="jxr_keyword">long</strong> ts = 5;
-<a class="jxr_linenumber" name="482" href="#482">482</a>     KeyValue kv1 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"the quick brown fox"</span>), family, qualA, ts, Type.Put);
-<a class="jxr_linenumber" name="483" href="#483">483</a>     KeyValue kv2 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"the who test text"</span>), family, qualA, ts, Type.Put);
-<a class="jxr_linenumber" name="484" href="#484">484</a>     Cell newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);
-<a class="jxr_linenumber" name="485" href="#485">485</a>     assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);
-<a class="jxr_linenumber" name="486" href="#486">486</a>     assertTrue((keyComparator.compare(kv2, newKey)) &gt; 0);
-<a class="jxr_linenumber" name="487" href="#487">487</a>     byte[] expectedArray = Bytes.toBytes(<span class="jxr_string">"the r"</span>);
-<a class="jxr_linenumber" name="488" href="#488">488</a>     Bytes.equals(newKey.getRowArray(), newKey.getRowOffset(), newKey.getRowLength(), expectedArray,
-<a class="jxr_linenumber" name="489" href="#489">489</a>         0, expectedArray.length);
-<a class="jxr_linenumber" name="490" href="#490">490</a> 
-<a class="jxr_linenumber" name="491" href="#491">491</a>     <em class="jxr_comment">// verify: same with "row + family + qualifier", return rightKey directly</em>
-<a class="jxr_linenumber" name="492" href="#492">492</a>     kv1 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbase"</span>), family, qualA, 5, Type.Put);
-<a class="jxr_linenumber" name="493" href="#493">493</a>     kv2 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbase"</span>), family, qualA, 0, Type.Put);
-<a class="jxr_linenumber" name="494" href="#494">494</a>     assertTrue(keyComparator.compare(kv1, kv2) &lt; 0);
-<a class="jxr_linenumber" name="495" href="#495">495</a>     newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);
-<a class="jxr_linenumber" name="496" href="#496">496</a>     assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);
-<a class="jxr_linenumber" name="497" href="#497">497</a>     assertTrue((keyComparator.compare(kv2, newKey)) == 0);
-<a class="jxr_linenumber" name="498" href="#498">498</a>     kv1 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbase"</span>), family, qualA, -5, Type.Put);
-<a class="jxr_linenumber" name="499" href="#499">499</a>     kv2 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbase"</span>), family, qualA, -10, Type.Put);
-<a class="jxr_linenumber" name="500" href="#500">500</a>     assertTrue(keyComparator.compare(kv1, kv2) &lt; 0);
-<a class="jxr_linenumber" name="501" href="#501">501</a>     newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);
-<a class="jxr_linenumber" name="502" href="#502">502</a>     assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);
-<a class="jxr_linenumber" name="503" href="#503">503</a>     assertTrue((keyComparator.compare(kv2, newKey)) == 0);
-<a class="jxr_linenumber" name="504" href="#504">504</a> 
-<a class="jxr_linenumber" name="505" href="#505">505</a>     <em class="jxr_comment">// verify: same with row, different with qualifier</em>
-<a class="jxr_linenumber" name="506" href="#506">506</a>     kv1 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbase"</span>), family, qualA, 5, Type.Put);
-<a class="jxr_linenumber" name="507" href="#507">507</a>     kv2 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbase"</span>), family, qualB, 5, Type.Put);
-<a class="jxr_linenumber" name="508" href="#508">508</a>     assertTrue(keyComparator.compare(kv1, kv2) &lt; 0);
-<a class="jxr_linenumber" name="509" href="#509">509</a>     newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);
-<a class="jxr_linenumber" name="510" href="#510">510</a>     assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);
-<a class="jxr_linenumber" name="511" href="#511">511</a>     assertTrue((keyComparator.compare(kv2, newKey)) &gt; 0);
-<a class="jxr_linenumber" name="512" href="#512">512</a>     assertTrue(Arrays.equals(CellUtil.cloneFamily(newKey), family));
-<a class="jxr_linenumber" name="513" href="#513">513</a>     assertTrue(Arrays.equals(CellUtil.cloneQualifier(newKey), qualB));
-<a class="jxr_linenumber" name="514" href="#514">514</a>     assertTrue(newKey.getTimestamp() == HConstants.LATEST_TIMESTAMP);
-<a class="jxr_linenumber" name="515" href="#515">515</a>     assertTrue(newKey.getTypeByte() == Type.Maximum.getCode());
-<a class="jxr_linenumber" name="516" href="#516">516</a> 
-<a class="jxr_linenumber" name="517" href="#517">517</a>     <em class="jxr_comment">// verify metaKeyComparator's getShortMidpointKey output</em>
-<a class="jxr_linenumber" name="518" href="#518">518</a>     <strong class="jxr_keyword">final</strong> CellComparator metaKeyComparator = CellComparator.META_COMPARATOR;
-<a class="jxr_linenumber" name="519" href="#519">519</a>     kv1 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbase123"</span>), family, qualA, 5, Type.Put);
-<a class="jxr_linenumber" name="520" href="#520">520</a>     kv2 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbase234"</span>), family, qualA, 0, Type.Put);
-<a class="jxr_linenumber" name="521" href="#521">521</a>     newKey = HFileWriterImpl.getMidpoint(metaKeyComparator, kv1, kv2);
-<a class="jxr_linenumber" name="522" href="#522">522</a>     assertTrue(metaKeyComparator.compare(kv1, newKey) &lt; 0);
-<a class="jxr_linenumber" name="523" href="#523">523</a>     assertTrue((metaKeyComparator.compare(kv2, newKey) == 0));
+<a class="jxr_linenumber" name="460" href="#460">460</a> 
+<a class="jxr_linenumber" name="461" href="#461">461</a>     left = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="462" href="#462">462</a>     right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"aaaaaaaa"</span>), Bytes.toBytes(<span class="jxr_string">"b"</span>));
+<a class="jxr_linenumber" name="463" href="#463">463</a>     mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);
+<a class="jxr_linenumber" name="464" href="#464">464</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);
+<a class="jxr_linenumber" name="465" href="#465">465</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt; 0);
+<a class="jxr_linenumber" name="466" href="#466">466</a>     assertEquals(2, (<strong class="jxr_keyword">int</strong>) mid.getFamilyLength());
+<a class="jxr_linenumber" name="467" href="#467">467</a> 
+<a class="jxr_linenumber" name="468" href="#468">468</a>     left = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="469" href="#469">469</a>     right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"aaaaaaaaa"</span>));
+<a class="jxr_linenumber" name="470" href="#470">470</a>     mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);
+<a class="jxr_linenumber" name="471" href="#471">471</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);
+<a class="jxr_linenumber" name="472" href="#472">472</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt; 0);
+<a class="jxr_linenumber" name="473" href="#473">473</a>     assertEquals(2, (<strong class="jxr_keyword">int</strong>) mid.getQualifierLength());
+<a class="jxr_linenumber" name="474" href="#474">474</a> 
+<a class="jxr_linenumber" name="475" href="#475">475</a>     left = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="476" href="#476">476</a>     right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"b"</span>));
+<a class="jxr_linenumber" name="477" href="#477">477</a>     mid = HFileWriterImpl.getMidpoint(CellComparator.COMPARATOR, left, right);
+<a class="jxr_linenumber" name="478" href="#478">478</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);
+<a class="jxr_linenumber" name="479" href="#479">479</a>     assertTrue(CellComparator.COMPARATOR.compareKeyIgnoresMvcc(mid, right) &lt;= 0);
+<a class="jxr_linenumber" name="480" href="#480">480</a>     assertEquals(1, (<strong class="jxr_keyword">int</strong>) mid.getQualifierLength());
+<a class="jxr_linenumber" name="481" href="#481">481</a> 
+<a class="jxr_linenumber" name="482" href="#482">482</a>     <em class="jxr_comment">// Assert that if meta comparator, it returns the right cell -- i.e. no</em>
+<a class="jxr_linenumber" name="483" href="#483">483</a>     <em class="jxr_comment">// optimization done.</em>
+<a class="jxr_linenumber" name="484" href="#484">484</a>     left = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"g"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="485" href="#485">485</a>     right = CellUtil.createCell(Bytes.toBytes(<span class="jxr_string">"i"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>), Bytes.toBytes(<span class="jxr_string">"a"</span>));
+<a class="jxr_linenumber" name="486" href="#486">486</a>     mid = HFileWriterImpl.getMidpoint(CellComparator.META_COMPARATOR, left, right);
+<a class="jxr_linenumber" name="487" href="#487">487</a>     assertTrue(CellComparator.META_COMPARATOR.compareKeyIgnoresMvcc(left, mid) &lt; 0);
+<a class="jxr_linenumber" name="488" href="#488">488</a>     assertTrue(CellComparator.META_COMPARATOR.compareKeyIgnoresMvcc(mid, right) == 0);
+<a class="jxr_linenumber" name="489" href="#489">489</a> 
+<a class="jxr_linenumber" name="490" href="#490">490</a>     <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="491" href="#491">491</a> <em class="jxr_javadoccomment">     * See HBASE-7845</em>
+<a class="jxr_linenumber" name="492" href="#492">492</a> <em class="jxr_javadoccomment">     */</em>
+<a class="jxr_linenumber" name="493" href="#493">493</a>     byte[] rowA = Bytes.toBytes(<span class="jxr_string">"rowA"</span>);
+<a class="jxr_linenumber" name="494" href="#494">494</a>     byte[] rowB = Bytes.toBytes(<span class="jxr_string">"rowB"</span>);
+<a class="jxr_linenumber" name="495" href="#495">495</a> 
+<a class="jxr_linenumber" name="496" href="#496">496</a>     byte[] family = Bytes.toBytes(<span class="jxr_string">"family"</span>);
+<a class="jxr_linenumber" name="497" href="#497">497</a>     byte[] qualA = Bytes.toBytes(<span class="jxr_string">"qfA"</span>);
+<a class="jxr_linenumber" name="498" href="#498">498</a>     byte[] qualB = Bytes.toBytes(<span class="jxr_string">"qfB"</span>);
+<a class="jxr_linenumber" name="499" href="#499">499</a>     <strong class="jxr_keyword">final</strong> CellComparator keyComparator = CellComparator.COMPARATOR;
+<a class="jxr_linenumber" name="500" href="#500">500</a>     <em class="jxr_comment">// verify that faked shorter rowkey could be generated</em>
+<a class="jxr_linenumber" name="501" href="#501">501</a>     <strong class="jxr_keyword">long</strong> ts = 5;
+<a class="jxr_linenumber" name="502" href="#502">502</a>     KeyValue kv1 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"the quick brown fox"</span>), family, qualA, ts, Type.Put);
+<a class="jxr_linenumber" name="503" href="#503">503</a>     KeyValue kv2 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"the who test text"</span>), family, qualA, ts, Type.Put);
+<a class="jxr_linenumber" name="504" href="#504">504</a>     Cell newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);
+<a class="jxr_linenumber" name="505" href="#505">505</a>     assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);
+<a class="jxr_linenumber" name="506" href="#506">506</a>     assertTrue((keyComparator.compare(kv2, newKey)) &gt; 0);
+<a class="jxr_linenumber" name="507" href="#507">507</a>     byte[] expectedArray = Bytes.toBytes(<span class="jxr_string">"the r"</span>);
+<a class="jxr_linenumber" name="508" href="#508">508</a>     Bytes.equals(newKey.getRowArray(), newKey.getRowOffset(), newKey.getRowLength(), expectedArray,
+<a class="jxr_linenumber" name="509" href="#509">509</a>         0, expectedArray.length);
+<a class="jxr_linenumber" name="510" href="#510">510</a> 
+<a class="jxr_linenumber" name="511" href="#511">511</a>     <em class="jxr_comment">// verify: same with "row + family + qualifier", return rightKey directly</em>
+<a class="jxr_linenumber" name="512" href="#512">512</a>     kv1 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbase"</span>), family, qualA, 5, Type.Put);
+<a class="jxr_linenumber" name="513" href="#513">513</a>     kv2 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbase"</span>), family, qualA, 0, Type.Put);
+<a class="jxr_linenumber" name="514" href="#514">514</a>     assertTrue(keyComparator.compare(kv1, kv2) &lt; 0);
+<a class="jxr_linenumber" name="515" href="#515">515</a>     newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);
+<a class="jxr_linenumber" name="516" href="#516">516</a>     assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);
+<a class="jxr_linenumber" name="517" href="#517">517</a>     assertTrue((keyComparator.compare(kv2, newKey)) == 0);
+<a class="jxr_linenumber" name="518" href="#518">518</a>     kv1 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbase"</span>), family, qualA, -5, Type.Put);
+<a class="jxr_linenumber" name="519" href="#519">519</a>     kv2 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbase"</span>), family, qualA, -10, Type.Put);
+<a class="jxr_linenumber" name="520" href="#520">520</a>     assertTrue(keyComparator.compare(kv1, kv2) &lt; 0);
+<a class="jxr_linenumber" name="521" href="#521">521</a>     newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);
+<a class="jxr_linenumber" name="522" href="#522">522</a>     assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);
+<a class="jxr_linenumber" name="523" href="#523">523</a>     assertTrue((keyComparator.compare(kv2, newKey)) == 0);
 <a class="jxr_linenumber" name="524" href="#524">524</a> 
-<a class="jxr_linenumber" name="525" href="#525">525</a>     <em class="jxr_comment">// verify common fix scenario</em>
-<a class="jxr_linenumber" name="526" href="#526">526</a>     kv1 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbase"</span>), family, qualA, ts, Type.Put);
-<a class="jxr_linenumber" name="527" href="#527">527</a>     kv2 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbaseandhdfs"</span>), family, qualA, ts, Type.Put);
+<a class="jxr_linenumber" name="525" href="#525">525</a>     <em class="jxr_comment">// verify: same with row, different with qualifier</em>
+<a class="jxr_linenumber" name="526" href="#526">526</a>     kv1 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbase"</span>), family, qualA, 5, Type.Put);
+<a class="jxr_linenumber" name="527" href="#527">527</a>     kv2 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbase"</span>), family, qualB, 5, Type.Put);
 <a class="jxr_linenumber" name="528" href="#528">528</a>     assertTrue(keyComparator.compare(kv1, kv2) &lt; 0);
 <a class="jxr_linenumber" name="529" href="#529">529</a>     newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);
 <a class="jxr_linenumber" name="530" href="#530">530</a>     assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);
 <a class="jxr_linenumber" name="531" href="#531">531</a>     assertTrue((keyComparator.compare(kv2, newKey)) &gt; 0);
-<a class="jxr_linenumber" name="532" href="#532">532</a>     expectedArray = Bytes.toBytes(<span class="jxr_string">"ilovehbasea"</span>);
-<a class="jxr_linenumber" name="533" href="#533">533</a>     Bytes.equals(newKey.getRowArray(), newKey.getRowOffset(), newKey.getRowLength(), expectedArray,
-<a class="jxr_linenumber" name="534" href="#534">534</a>         0, expectedArray.length);
-<a class="jxr_linenumber" name="535" href="#535">535</a>     <em class="jxr_comment">// verify only 1 offset scenario</em>
-<a class="jxr_linenumber" name="536" href="#536">536</a>     kv1 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"100abcdefg"</span>), family, qualA, ts, Type.Put);
-<a class="jxr_linenumber" name="537" href="#537">537</a>     kv2 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"101abcdefg"</span>), family, qualA, ts, Type.Put);
-<a class="jxr_linenumber" name="538" href="#538">538</a>     assertTrue(keyComparator.compare(kv1, kv2) &lt; 0);
-<a class="jxr_linenumber" name="539" href="#539">539</a>     newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);
-<a class="jxr_linenumber" name="540" href="#540">540</a>     assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);
-<a class="jxr_linenumber" name="541" href="#541">541</a>     assertTrue((keyComparator.compare(kv2, newKey)) &gt; 0);
-<a class="jxr_linenumber" name="542" href="#542">542</a>     expectedArray = Bytes.toBytes(<span class="jxr_string">"101"</span>);
-<a class="jxr_linenumber" name="543" href="#543">543</a>     Bytes.equals(newKey.getRowArray(), newKey.getRowOffset(), newKey.getRowLength(), expectedArray,
-<a class="jxr_linenumber" name="544" href="#544">544</a>         0, expectedArray.length);
-<a class="jxr_linenumber" name="545" href="#545">545</a>   }
-<a class="jxr_linenumber" name="546" href="#546">546</a> 
-<a class="jxr_linenumber" name="547" href="#547">547</a> }
-<a class="jxr_linenumber" name="548" href="#548">548</a> 
+<a class="jxr_linenumber" name="532" href="#532">532</a>     assertTrue(Arrays.equals(CellUtil.cloneFamily(newKey), family));
+<a class="jxr_linenumber" name="533" href="#533">533</a>     assertTrue(Arrays.equals(CellUtil.cloneQualifier(newKey), qualB));
+<a class="jxr_linenumber" name="534" href="#534">534</a>     assertTrue(newKey.getTimestamp() == HConstants.LATEST_TIMESTAMP);
+<a class="jxr_linenumber" name="535" href="#535">535</a>     assertTrue(newKey.getTypeByte() == Type.Maximum.getCode());
+<a class="jxr_linenumber" name="536" href="#536">536</a> 
+<a class="jxr_linenumber" name="537" href="#537">537</a>     <em class="jxr_comment">// verify metaKeyComparator's getShortMidpointKey output</em>
+<a class="jxr_linenumber" name="538" href="#538">538</a>     <strong class="jxr_keyword">final</strong> CellComparator metaKeyComparator = CellComparator.META_COMPARATOR;
+<a class="jxr_linenumber" name="539" href="#539">539</a>     kv1 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbase123"</span>), family, qualA, 5, Type.Put);
+<a class="jxr_linenumber" name="540" href="#540">540</a>     kv2 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbase234"</span>), family, qualA, 0, Type.Put);
+<a class="jxr_linenumber" name="541" href="#541">541</a>     newKey = HFileWriterImpl.getMidpoint(metaKeyComparator, kv1, kv2);
+<a class="jxr_linenumber" name="542" href="#542">542</a>     assertTrue(metaKeyComparator.compare(kv1, newKey) &lt; 0);
+<a class="jxr_linenumber" name="543" href="#543">543</a>     assertTrue((metaKeyComparator.compare(kv2, newKey) == 0));
+<a class="jxr_linenumber" name="544" href="#544">544</a> 
+<a class="jxr_linenumber" name="545" href="#545">545</a>     <em class="jxr_comment">// verify common fix scenario</em>
+<a class="jxr_linenumber" name="546" href="#546">546</a>     kv1 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbase"</span>), family, qualA, ts, Type.Put);
+<a class="jxr_linenumber" name="547" href="#547">547</a>     kv2 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"ilovehbaseandhdfs"</span>), family, qualA, ts, Type.Put);
+<a class="jxr_linenumber" name="548" href="#548">548</a>     assertTrue(keyComparator.compare(kv1, kv2) &lt; 0);
+<a class="jxr_linenumber" name="549" href="#549">549</a>     newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);
+<a class="jxr_linenumber" name="550" href="#550">550</a>     assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);
+<a class="jxr_linenumber" name="551" href="#551">551</a>     assertTrue((keyComparator.compare(kv2, newKey)) &gt; 0);
+<a class="jxr_linenumber" name="552" href="#552">552</a>     expectedArray = Bytes.toBytes(<span class="jxr_string">"ilovehbasea"</span>);
+<a class="jxr_linenumber" name="553" href="#553">553</a>     Bytes.equals(newKey.getRowArray(), newKey.getRowOffset(), newKey.getRowLength(), expectedArray,
+<a class="jxr_linenumber" name="554" href="#554">554</a>         0, expectedArray.length);
+<a class="jxr_linenumber" name="555" href="#555">555</a>     <em class="jxr_comment">// verify only 1 offset scenario</em>
+<a class="jxr_linenumber" name="556" href="#556">556</a>     kv1 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"100abcdefg"</span>), family, qualA, ts, Type.Put);
+<a class="jxr_linenumber" name="557" href="#557">557</a>     kv2 = <strong class="jxr_keyword">new</strong> KeyValue(Bytes.toBytes(<span class="jxr_string">"101abcdefg"</span>), family, qualA, ts, Type.Put);
+<a class="jxr_linenumber" name="558" href="#558">558</a>     assertTrue(keyComparator.compare(kv1, kv2) &lt; 0);
+<a class="jxr_linenumber" name="559" href="#559">559</a>     newKey = HFileWriterImpl.getMidpoint(keyComparator, kv1, kv2);
+<a class="jxr_linenumber" name="560" href="#560">560</a>     assertTrue(keyComparator.compare(kv1, newKey) &lt; 0);
+<a class="jxr_linenumber" name="561" href="#561">561</a>     assertTrue((keyComparator.compare(kv2, newKey)) &gt; 0);
+<a class="jxr_linenumber" name="562" href="#562">562</a>     expectedArray = Bytes.toBytes(<span class="jxr_string">"101"</span>);
+<a class="jxr_linenumber" name="563" href="#563">563</a>     Bytes.equals(newKey.getRowArray(), newKey.getRowOffset(), newKey.getRowLength(), expectedArray,
+<a class="jxr_linenumber" name="564" href="#564">564</a>         0, expectedArray.length);
+<a class="jxr_linenumber" name="565" href="#565">565</a>   }
+<a class="jxr_linenumber" name="566" href="#566">566</a> 
+<a class="jxr_linenumber" name="567" href="#567">567</a> }
+<a class="jxr_linenumber" name="568" href="#568">568</a> 
 </pre>
 <hr/><div id="footer">This page was automatically generated by <a href="http://maven.apache.org/">Maven</a></div></body>
 </html>


[33/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html
index 9e42ac9..054df6f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.CallStats.html
@@ -71,411 +71,413 @@
 <span class="sourceLineNo">063</span>  private static final String MEMLOAD_BASE = "memstoreLoad_";<a name="line.63"></a>
 <span class="sourceLineNo">064</span>  private static final String HEAP_BASE = "heapOccupancy_";<a name="line.64"></a>
 <span class="sourceLineNo">065</span>  private static final String CACHE_BASE = "cacheDroppingExceptions_";<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  private static final String CLIENT_SVC = ClientService.getDescriptor().getName();<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  /** A container class for collecting details about the RPC call as it percolates. */<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  public static class CallStats {<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    private long requestSizeBytes = 0;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    private long responseSizeBytes = 0;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    private long startTime = 0;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    private long callTimeMs = 0;<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>    public long getRequestSizeBytes() {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      return requestSizeBytes;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    }<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public void setRequestSizeBytes(long requestSizeBytes) {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      this.requestSizeBytes = requestSizeBytes;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    }<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>    public long getResponseSizeBytes() {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      return responseSizeBytes;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    }<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>    public void setResponseSizeBytes(long responseSizeBytes) {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      this.responseSizeBytes = responseSizeBytes;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    }<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>    public long getStartTime() {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      return startTime;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>    public void setStartTime(long startTime) {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>      this.startTime = startTime;<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>    public long getCallTimeMs() {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      return callTimeMs;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    }<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>    public void setCallTimeMs(long callTimeMs) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      this.callTimeMs = callTimeMs;<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><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @VisibleForTesting<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  protected static final class CallTracker {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    private final String name;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    @VisibleForTesting final Timer callTimer;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    @VisibleForTesting final Histogram reqHist;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    @VisibleForTesting final Histogram respHist;<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    private CallTracker(MetricRegistry registry, String name, String subName, String scope) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      StringBuilder sb = new StringBuilder(CLIENT_SVC).append("_").append(name);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      if (subName != null) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        sb.append("(").append(subName).append(")");<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      }<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      this.name = sb.toString();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      this.callTimer = registry.timer(name(MetricsConnection.class,<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        DRTN_BASE + this.name, scope));<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      this.reqHist = registry.histogram(name(MetricsConnection.class,<a name="line.123"></a>
-<span class="sourceLineNo">124</span>        REQ_BASE + this.name, scope));<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      this.respHist = registry.histogram(name(MetricsConnection.class,<a name="line.125"></a>
-<span class="sourceLineNo">126</span>        RESP_BASE + this.name, scope));<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>    private CallTracker(MetricRegistry registry, String name, String scope) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      this(registry, name, null, scope);<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>    public void updateRpc(CallStats stats) {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      this.callTimer.update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      this.reqHist.update(stats.getRequestSizeBytes());<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      this.respHist.update(stats.getResponseSizeBytes());<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>    @Override<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    public String toString() {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      return "CallTracker:" + name;<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>  protected static class RegionStats {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    final String name;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    final Histogram memstoreLoadHist;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    final Histogram heapOccupancyHist;<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    public RegionStats(MetricRegistry registry, String name) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      this.name = name;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      this.memstoreLoadHist = registry.histogram(name(MetricsConnection.class,<a name="line.152"></a>
-<span class="sourceLineNo">153</span>          MEMLOAD_BASE + this.name));<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      this.heapOccupancyHist = registry.histogram(name(MetricsConnection.class,<a name="line.154"></a>
-<span class="sourceLineNo">155</span>          HEAP_BASE + this.name));<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>    public void update(ClientProtos.RegionLoadStats regionStatistics) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      this.memstoreLoadHist.update(regionStatistics.getMemstoreLoad());<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      this.heapOccupancyHist.update(regionStatistics.getHeapOccupancy());<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    }<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>  protected static class RunnerStats {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    final Counter normalRunners;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    final Counter delayRunners;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    final Histogram delayIntevalHist;<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    public RunnerStats(MetricRegistry registry) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      this.normalRunners = registry.counter(<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        name(MetricsConnection.class, "normalRunnersCount"));<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      this.delayRunners = registry.counter(<a name="line.173"></a>
-<span class="sourceLineNo">174</span>        name(MetricsConnection.class, "delayRunnersCount"));<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      this.delayIntevalHist = registry.histogram(<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        name(MetricsConnection.class, "delayIntervalHist"));<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    public void incrNormalRunners() {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      this.normalRunners.inc();<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>    public void incrDelayRunners() {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      this.delayRunners.inc();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    public void updateDelayInterval(long interval) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      this.delayIntevalHist.update(interval);<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><a name="line.191"></a>
-<span class="sourceLineNo">192</span>  @VisibleForTesting<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  protected ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt; serverStats<a name="line.193"></a>
-<span class="sourceLineNo">194</span>          = new ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt;();<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>  public void updateServerStats(ServerName serverName, byte[] regionName,<a name="line.196"></a>
-<span class="sourceLineNo">197</span>                                Object r) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    if (!(r instanceof Result)) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      return;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    Result result = (Result) r;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    ClientProtos.RegionLoadStats stats = result.getStats();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    if (stats == null) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      return;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    updateRegionStats(serverName, regionName, stats);<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>  @Override<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  public void updateRegionStats(ServerName serverName, byte[] regionName,<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ClientProtos.RegionLoadStats stats) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    String name = serverName.getServerName() + "," + Bytes.toStringBinary(regionName);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ConcurrentMap&lt;byte[], RegionStats&gt; rsStats = null;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    if (serverStats.containsKey(serverName)) {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      rsStats = serverStats.get(serverName);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    } else {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      rsStats = serverStats.putIfAbsent(serverName,<a name="line.217"></a>
-<span class="sourceLineNo">218</span>          new ConcurrentSkipListMap&lt;byte[], RegionStats&gt;(Bytes.BYTES_COMPARATOR));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      if (rsStats == null) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        rsStats = serverStats.get(serverName);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    RegionStats regionStats = null;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    if (rsStats.containsKey(regionName)) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      regionStats = rsStats.get(regionName);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    } else {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      regionStats = rsStats.putIfAbsent(regionName, new RegionStats(this.registry, name));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      if (regionStats == null) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>        regionStats = rsStats.get(regionName);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      }<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    regionStats.update(stats);<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">066</span>  private static final String UNKNOWN_EXCEPTION = "UnknownException";<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  private static final String CLIENT_SVC = ClientService.getDescriptor().getName();<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>  /** A container class for collecting details about the RPC call as it percolates. */<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  public static class CallStats {<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    private long requestSizeBytes = 0;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    private long responseSizeBytes = 0;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    private long startTime = 0;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    private long callTimeMs = 0;<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>    public long getRequestSizeBytes() {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      return requestSizeBytes;<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>    public void setRequestSizeBytes(long requestSizeBytes) {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>      this.requestSizeBytes = requestSizeBytes;<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>    public long getResponseSizeBytes() {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      return responseSizeBytes;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    }<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>    public void setResponseSizeBytes(long responseSizeBytes) {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      this.responseSizeBytes = responseSizeBytes;<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">092</span>    public long getStartTime() {<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      return startTime;<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>    public void setStartTime(long startTime) {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      this.startTime = startTime;<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>    public long getCallTimeMs() {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      return callTimeMs;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>    public void setCallTimeMs(long callTimeMs) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      this.callTimeMs = callTimeMs;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    }<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  }<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  @VisibleForTesting<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  protected static final class CallTracker {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    private final String name;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    @VisibleForTesting final Timer callTimer;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    @VisibleForTesting final Histogram reqHist;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    @VisibleForTesting final Histogram respHist;<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>    private CallTracker(MetricRegistry registry, String name, String subName, String scope) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      StringBuilder sb = new StringBuilder(CLIENT_SVC).append("_").append(name);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      if (subName != null) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        sb.append("(").append(subName).append(")");<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      }<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      this.name = sb.toString();<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      this.callTimer = registry.timer(name(MetricsConnection.class,<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        DRTN_BASE + this.name, scope));<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      this.reqHist = registry.histogram(name(MetricsConnection.class,<a name="line.124"></a>
+<span class="sourceLineNo">125</span>        REQ_BASE + this.name, scope));<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      this.respHist = registry.histogram(name(MetricsConnection.class,<a name="line.126"></a>
+<span class="sourceLineNo">127</span>        RESP_BASE + this.name, scope));<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>    private CallTracker(MetricRegistry registry, String name, String scope) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      this(registry, name, null, scope);<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>    public void updateRpc(CallStats stats) {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      this.callTimer.update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      this.reqHist.update(stats.getRequestSizeBytes());<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      this.respHist.update(stats.getResponseSizeBytes());<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>    @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    public String toString() {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      return "CallTracker:" + name;<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><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  protected static class RegionStats {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    final String name;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    final Histogram memstoreLoadHist;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    final Histogram heapOccupancyHist;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>    public RegionStats(MetricRegistry registry, String name) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      this.name = name;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      this.memstoreLoadHist = registry.histogram(name(MetricsConnection.class,<a name="line.153"></a>
+<span class="sourceLineNo">154</span>          MEMLOAD_BASE + this.name));<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      this.heapOccupancyHist = registry.histogram(name(MetricsConnection.class,<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          HEAP_BASE + this.name));<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>    public void update(ClientProtos.RegionLoadStats regionStatistics) {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      this.memstoreLoadHist.update(regionStatistics.getMemstoreLoad());<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      this.heapOccupancyHist.update(regionStatistics.getHeapOccupancy());<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><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  @VisibleForTesting<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  protected static class RunnerStats {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    final Counter normalRunners;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    final Counter delayRunners;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    final Histogram delayIntevalHist;<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    public RunnerStats(MetricRegistry registry) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      this.normalRunners = registry.counter(<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        name(MetricsConnection.class, "normalRunnersCount"));<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      this.delayRunners = registry.counter(<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        name(MetricsConnection.class, "delayRunnersCount"));<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      this.delayIntevalHist = registry.histogram(<a name="line.176"></a>
+<span class="sourceLineNo">177</span>        name(MetricsConnection.class, "delayIntervalHist"));<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
+<span class="sourceLineNo">179</span><a name="line.179"></a>
+<span class="sourceLineNo">180</span>    public void incrNormalRunners() {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      this.normalRunners.inc();<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
+<span class="sourceLineNo">183</span><a name="line.183"></a>
+<span class="sourceLineNo">184</span>    public void incrDelayRunners() {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      this.delayRunners.inc();<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public void updateDelayInterval(long interval) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      this.delayIntevalHist.update(interval);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  }<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>  @VisibleForTesting<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  protected ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt; serverStats<a name="line.194"></a>
+<span class="sourceLineNo">195</span>          = new ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt;();<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>  public void updateServerStats(ServerName serverName, byte[] regionName,<a name="line.197"></a>
+<span class="sourceLineNo">198</span>                                Object r) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    if (!(r instanceof Result)) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      return;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    Result result = (Result) r;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    ClientProtos.RegionLoadStats stats = result.getStats();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    if (stats == null) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      return;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    updateRegionStats(serverName, regionName, stats);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  @Override<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public void updateRegionStats(ServerName serverName, byte[] regionName,<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ClientProtos.RegionLoadStats stats) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    String name = serverName.getServerName() + "," + Bytes.toStringBinary(regionName);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ConcurrentMap&lt;byte[], RegionStats&gt; rsStats = null;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    if (serverStats.containsKey(serverName)) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      rsStats = serverStats.get(serverName);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    } else {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      rsStats = serverStats.putIfAbsent(serverName,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>          new ConcurrentSkipListMap&lt;byte[], RegionStats&gt;(Bytes.BYTES_COMPARATOR));<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      if (rsStats == null) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        rsStats = serverStats.get(serverName);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    RegionStats regionStats = null;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    if (rsStats.containsKey(regionName)) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      regionStats = rsStats.get(regionName);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    } else {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      regionStats = rsStats.putIfAbsent(regionName, new RegionStats(this.registry, name));<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      if (regionStats == null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        regionStats = rsStats.get(regionName);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      }<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    regionStats.update(stats);<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>  /** A lambda for dispatching to the appropriate metric factory method */<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  private static interface NewMetric&lt;T&gt; {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    T newMetric(Class&lt;?&gt; clazz, String name, String scope);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>  /** Anticipated number of metric entries */<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  private static final int CAPACITY = 50;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>  /** Default load factor from {@link java.util.HashMap#DEFAULT_LOAD_FACTOR} */<a name="line.243"></a>
-<span class="sourceLineNo">244</span>  private static final float LOAD_FACTOR = 0.75f;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /**<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * Anticipated number of concurrent accessor threads, from<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * {@link ConnectionImplementation#getBatchPool()}<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   */<a name="line.248"></a>
-<span class="sourceLineNo">249</span>  private static final int CONCURRENCY_LEVEL = 256;<a name="line.249"></a>
-<span class="sourceLineNo">250</span><a name="line.250"></a>
-<span class="sourceLineNo">251</span>  private final MetricRegistry registry;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  private final JmxReporter reporter;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  private final String scope;<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private final NewMetric&lt;Timer&gt; timerFactory = new NewMetric&lt;Timer&gt;() {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    @Override public Timer newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      return registry.timer(name(clazz, name, scope));<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>  private final NewMetric&lt;Histogram&gt; histogramFactory = new NewMetric&lt;Histogram&gt;() {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    @Override public Histogram newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return registry.histogram(name(clazz, name, scope));<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  };<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  private final NewMetric&lt;Counter&gt; counterFactory = new NewMetric&lt;Counter&gt;() {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    @Override public Counter newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      return registry.counter(name(clazz, name, scope));<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  };<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  // static metrics<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>  @VisibleForTesting protected final Counter metaCacheHits;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  @VisibleForTesting protected final Counter metaCacheMisses;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  @VisibleForTesting protected final CallTracker getTracker;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @VisibleForTesting protected final CallTracker scanTracker;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  @VisibleForTesting protected final CallTracker appendTracker;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  @VisibleForTesting protected final CallTracker deleteTracker;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  @VisibleForTesting protected final CallTracker incrementTracker;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  @VisibleForTesting protected final CallTracker putTracker;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @VisibleForTesting protected final CallTracker multiTracker;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  @VisibleForTesting protected final RunnerStats runnerStats;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  private final Counter metaCacheNumClearServer;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  private final Counter metaCacheNumClearRegion;<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // dynamic metrics<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>  // These maps are used to cache references to the metric instances that are managed by the<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // registry. I don't think their use perfectly removes redundant allocations, but it's<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  // a big improvement over calling registry.newMetric each time.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Timer&gt; rpcTimers =<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Histogram&gt; rpcHistograms =<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY * 2 /* tracking both request and response sizes */,<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  private final ConcurrentMap&lt;String, Counter&gt; cacheDroppingExceptions =<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>  public MetricsConnection(final ConnectionImplementation conn) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    this.scope = conn.toString();<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    this.registry = new MetricRegistry();<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    final ThreadPoolExecutor batchPool = (ThreadPoolExecutor) conn.getCurrentBatchPool();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    final ThreadPoolExecutor metaPool = (ThreadPoolExecutor) conn.getCurrentMetaLookupPool();<a name="line.305"></a>
-<span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>    this.registry.register(name(this.getClass(), "executorPoolActiveThreads", scope),<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        new RatioGauge() {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>          @Override<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          protected Ratio getRatio() {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>            return Ratio.of(batchPool.getActiveCount(), batchPool.getMaximumPoolSize());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          }<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        });<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    this.registry.register(name(this.getClass(), "metaPoolActiveThreads", scope),<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        new RatioGauge() {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>          @Override<a name="line.316"></a>
-<span class="sourceLineNo">317</span>          protected Ratio getRatio() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>            return Ratio.of(metaPool.getActiveCount(), metaPool.getMaximumPoolSize());<a name="line.318"></a>
-<span class="sourceLineNo">319</span>          }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        });<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    this.metaCacheHits = registry.counter(name(this.getClass(), "metaCacheHits", scope));<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    this.metaCacheMisses = registry.counter(name(this.getClass(), "metaCacheMisses", scope));<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    this.metaCacheNumClearServer = registry.counter(name(this.getClass(),<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      "metaCacheNumClearServer", scope));<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    this.metaCacheNumClearRegion = registry.counter(name(this.getClass(),<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      "metaCacheNumClearRegion", scope));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    this.getTracker = new CallTracker(this.registry, "Get", scope);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    this.scanTracker = new CallTracker(this.registry, "Scan", scope);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    this.appendTracker = new CallTracker(this.registry, "Mutate", "Append", scope);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    this.deleteTracker = new CallTracker(this.registry, "Mutate", "Delete", scope);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    this.incrementTracker = new CallTracker(this.registry, "Mutate", "Increment", scope);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    this.putTracker = new CallTracker(this.registry, "Mutate", "Put", scope);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    this.multiTracker = new CallTracker(this.registry, "Multi", scope);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    this.runnerStats = new RunnerStats(this.registry);<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    this.reporter = JmxReporter.forRegistry(this.registry).build();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    this.reporter.start();<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>  public void shutdown() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    this.reporter.stop();<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>  /** Produce an instance of {@link CallStats} for clients to attach to RPCs. */<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  public static CallStats newCallStats() {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    // TODO: instance pool to reduce GC?<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    return new CallStats();<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">350</span>  /** Increment the number of meta cache hits. */<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  public void incrMetaCacheHit() {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    metaCacheHits.inc();<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>  /** Increment the number of meta cache misses. */<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  public void incrMetaCacheMiss() {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    metaCacheMisses.inc();<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>  /** Increment the number of meta cache drops requested for entire RegionServer. */<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  public void incrMetaCacheNumClearServer() {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    metaCacheNumClearServer.inc();<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>  /** Increment the number of meta cache drops requested for individual region. */<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  public void incrMetaCacheNumClearRegion() {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    metaCacheNumClearRegion.inc();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  /** Increment the number of normal runner counts. */<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  public void incrNormalRunners() {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    this.runnerStats.incrNormalRunners();<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  /** Increment the number of delay runner counts. */<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  public void incrDelayRunners() {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    this.runnerStats.incrDelayRunners();<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>  /** Update delay interval of delay runner. */<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public void updateDelayInterval(long interval) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    this.runnerStats.updateDelayInterval(interval);<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>   * Get a metric for {@code key} from {@code map}, or create it with {@code factory}.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   */<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  private &lt;T&gt; T getMetric(String key, ConcurrentMap&lt;String, T&gt; map, NewMetric&lt;T&gt; factory) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    T t = map.get(key);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    if (t == null) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      t = factory.newMetric(this.getClass(), key, scope);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      T tmp = map.putIfAbsent(key, t);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      t = (tmp == null) ? t : tmp;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    }<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    return t;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  }<a name="line.396"></a>
-<span class="sourceLineNo">397</span><a name="line.397"></a>
-<span class="sourceLineNo">398</span>  /** Update call stats for non-critical-path methods */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>  private void updateRpcGeneric(MethodDescriptor method, CallStats stats) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    final String methodName = method.getService().getName() + "_" + method.getName();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    getMetric(DRTN_BASE + methodName, rpcTimers, timerFactory)<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        .update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    getMetric(REQ_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        .update(stats.getRequestSizeBytes());<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    getMetric(RESP_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        .update(stats.getResponseSizeBytes());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>  /** Report RPC context to metrics system. */<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  public void updateRpc(MethodDescriptor method, Message param, CallStats stats) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // this implementation is tied directly to protobuf implementation details. would be better<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // if we could dispatch based on something static, ie, request Message type.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    if (method.getService() == ClientService.getDescriptor()) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      switch(method.getIndex()) {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      case 0:<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        assert "Get".equals(method.getName());<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        getTracker.updateRpc(stats);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        return;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      case 1:<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        assert "Mutate".equals(method.getName());<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        final MutationType mutationType = ((MutateRequest) param).getMutation().getMutateType();<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        switch(mutationType) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        case APPEND:<a name="line.423"></a>
-<span class="sourceLineNo">424</span>          appendTracker.updateRpc(stats);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          return;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        case DELETE:<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          deleteTracker.updateRpc(stats);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          return;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        case INCREMENT:<a name="line.429"></a>
-<span class="sourceLineNo">430</span>          incrementTracker.updateRpc(stats);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>          return;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        case PUT:<a name="line.432"></a>
-<span class="sourceLineNo">433</span>          putTracker.updateRpc(stats);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>          return;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        default:<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          throw new RuntimeException("Unrecognized mutation type " + mutationType);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        }<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      case 2:<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        assert "Scan".equals(method.getName());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        scanTracker.updateRpc(stats);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        return;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      case 3:<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        assert "BulkLoadHFile".equals(method.getName());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        // use generic implementation<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        break;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      case 4:<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        assert "ExecService".equals(method.getName());<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        // use generic implementation<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        break;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      case 5:<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        assert "ExecRegionServerService".equals(method.getName());<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        // use generic implementation<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        break;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      case 6:<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        assert "Multi".equals(method.getName());<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        multiTracker.updateRpc(stats);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        return;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      default:<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        throw new RuntimeException("Unrecognized ClientService RPC type " + method.getFullName());<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      }<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    }<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // Fallback to dynamic registry lookup for DDL methods.<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    updateRpcGeneric(method, stats);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  }<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>  public void incrCacheDroppingExceptions(Object exception) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    getMetric(CACHE_BASE + exception.getClass().getSimpleName(),<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      cacheDroppingExceptions, counterFactory).inc();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>  }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>}<a name="line.470"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /** A lambda for dispatching to the appropriate metric factory method */<a name="line.237"></a>
+<span class="sourceLineNo">238</span>  private static interface NewMetric&lt;T&gt; {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    T newMetric(Class&lt;?&gt; clazz, String name, String scope);<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>  /** Anticipated number of metric entries */<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  private static final int CAPACITY = 50;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  /** Default load factor from {@link java.util.HashMap#DEFAULT_LOAD_FACTOR} */<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  private static final float LOAD_FACTOR = 0.75f;<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  /**<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * Anticipated number of concurrent accessor threads, from<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * {@link ConnectionImplementation#getBatchPool()}<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  private static final int CONCURRENCY_LEVEL = 256;<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  private final MetricRegistry registry;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  private final JmxReporter reporter;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  private final String scope;<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  private final NewMetric&lt;Timer&gt; timerFactory = new NewMetric&lt;Timer&gt;() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    @Override public Timer newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      return registry.timer(name(clazz, name, scope));<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>  private final NewMetric&lt;Histogram&gt; histogramFactory = new NewMetric&lt;Histogram&gt;() {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    @Override public Histogram newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      return registry.histogram(name(clazz, name, scope));<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  };<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  private final NewMetric&lt;Counter&gt; counterFactory = new NewMetric&lt;Counter&gt;() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    @Override public Counter newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      return registry.counter(name(clazz, name, scope));<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span>  };<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>  // static metrics<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @VisibleForTesting protected final Counter metaCacheHits;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @VisibleForTesting protected final Counter metaCacheMisses;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  @VisibleForTesting protected final CallTracker getTracker;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  @VisibleForTesting protected final CallTracker scanTracker;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  @VisibleForTesting protected final CallTracker appendTracker;<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  @VisibleForTesting protected final CallTracker deleteTracker;<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @VisibleForTesting protected final CallTracker incrementTracker;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  @VisibleForTesting protected final CallTracker putTracker;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  @VisibleForTesting protected final CallTracker multiTracker;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  @VisibleForTesting protected final RunnerStats runnerStats;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  private final Counter metaCacheNumClearServer;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  private final Counter metaCacheNumClearRegion;<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>  // dynamic metrics<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>  // These maps are used to cache references to the metric instances that are managed by the<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  // registry. I don't think their use perfectly removes redundant allocations, but it's<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  // a big improvement over calling registry.newMetric each time.<a name="line.293"></a>
+<span class="sourceLineNo">294</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Timer&gt; rpcTimers =<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Histogram&gt; rpcHistograms =<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY * 2 /* tracking both request and response sizes */,<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  private final ConcurrentMap&lt;String, Counter&gt; cacheDroppingExceptions =<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  public MetricsConnection(final ConnectionImplementation conn) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    this.scope = conn.toString();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    this.registry = new MetricRegistry();<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    final ThreadPoolExecutor batchPool = (ThreadPoolExecutor) conn.getCurrentBatchPool();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    final ThreadPoolExecutor metaPool = (ThreadPoolExecutor) conn.getCurrentMetaLookupPool();<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>    this.registry.register(name(this.getClass(), "executorPoolActiveThreads", scope),<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        new RatioGauge() {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>          @Override<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          protected Ratio getRatio() {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            return Ratio.of(batchPool.getActiveCount(), batchPool.getMaximumPoolSize());<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>    this.registry.register(name(this.getClass(), "metaPoolActiveThreads", scope),<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        new RatioGauge() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          @Override<a name="line.317"></a>
+<span class="sourceLineNo">318</span>          protected Ratio getRatio() {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>            return Ratio.of(metaPool.getActiveCount(), metaPool.getMaximumPoolSize());<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>    this.metaCacheHits = registry.counter(name(this.getClass(), "metaCacheHits", scope));<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    this.metaCacheMisses = registry.counter(name(this.getClass(), "metaCacheMisses", scope));<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    this.metaCacheNumClearServer = registry.counter(name(this.getClass(),<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      "metaCacheNumClearServer", scope));<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    this.metaCacheNumClearRegion = registry.counter(name(this.getClass(),<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      "metaCacheNumClearRegion", scope));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    this.getTracker = new CallTracker(this.registry, "Get", scope);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    this.scanTracker = new CallTracker(this.registry, "Scan", scope);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    this.appendTracker = new CallTracker(this.registry, "Mutate", "Append", scope);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    this.deleteTracker = new CallTracker(this.registry, "Mutate", "Delete", scope);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    this.incrementTracker = new CallTracker(this.registry, "Mutate", "Increment", scope);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    this.putTracker = new CallTracker(this.registry, "Mutate", "Put", scope);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    this.multiTracker = new CallTracker(this.registry, "Multi", scope);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    this.runnerStats = new RunnerStats(this.registry);<a name="line.335"></a>
+<span class="sourceLineNo">336</span><a name="line.336"></a>
+<span class="sourceLineNo">337</span>    this.reporter = JmxReporter.forRegistry(this.registry).build();<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    this.reporter.start();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  public void shutdown() {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    this.reporter.stop();<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  /** Produce an instance of {@link CallStats} for clients to attach to RPCs. */<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  public static CallStats newCallStats() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    // TODO: instance pool to reduce GC?<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    return new CallStats();<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>  /** Increment the number of meta cache hits. */<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  public void incrMetaCacheHit() {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    metaCacheHits.inc();<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>  /** Increment the number of meta cache misses. */<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  public void incrMetaCacheMiss() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    metaCacheMisses.inc();<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  }<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span>  /** Increment the number of meta cache drops requested for entire RegionServer. */<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  public void incrMetaCacheNumClearServer() {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    metaCacheNumClearServer.inc();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>  }<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span>  /** Increment the number of meta cache drops requested for individual region. */<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  public void incrMetaCacheNumClearRegion() {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    metaCacheNumClearRegion.inc();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  }<a name="line.369"></a>
+<span class="sourceLineNo">370</span><a name="line.370"></a>
+<span class="sourceLineNo">371</span>  /** Increment the number of normal runner counts. */<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  public void incrNormalRunners() {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    this.runnerStats.incrNormalRunners();<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>  /** Increment the number of delay runner counts. */<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void incrDelayRunners() {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    this.runnerStats.incrDelayRunners();<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>  /** Update delay interval of delay runner. */<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public void updateDelayInterval(long interval) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    this.runnerStats.updateDelayInterval(interval);<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>  /**<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   * Get a metric for {@code key} from {@code map}, or create it with {@code factory}.<a name="line.387"></a>
+<span class="sourceLineNo">388</span>   */<a name="line.388"></a>
+<span class="sourceLineNo">389</span>  private &lt;T&gt; T getMetric(String key, ConcurrentMap&lt;String, T&gt; map, NewMetric&lt;T&gt; factory) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    T t = map.get(key);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    if (t == null) {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      t = factory.newMetric(this.getClass(), key, scope);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      T tmp = map.putIfAbsent(key, t);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      t = (tmp == null) ? t : tmp;<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    return t;<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>  /** Update call stats for non-critical-path methods */<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  private void updateRpcGeneric(MethodDescriptor method, CallStats stats) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    final String methodName = method.getService().getName() + "_" + method.getName();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    getMetric(DRTN_BASE + methodName, rpcTimers, timerFactory)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        .update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    getMetric(REQ_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        .update(stats.getRequestSizeBytes());<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    getMetric(RESP_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        .update(stats.getResponseSizeBytes());<a name="line.407"></a>
+<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
+<span class="sourceLineNo">410</span>  /** Report RPC context to metrics system. */<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public void updateRpc(MethodDescriptor method, Message param, CallStats stats) {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    // this implementation is tied directly to protobuf implementation details. would be better<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    // if we could dispatch based on something static, ie, request Message type.<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (method.getService() == ClientService.getDescriptor()) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      switch(method.getIndex()) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      case 0:<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        assert "Get".equals(method.getName());<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        getTracker.updateRpc(stats);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        return;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      case 1:<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        assert "Mutate".equals(method.getName());<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        final MutationType mutationType = ((MutateRequest) param).getMutation().getMutateType();<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        switch(mutationType) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        case APPEND:<a name="line.424"></a>
+<span class="sourceLineNo">425</span>          appendTracker.updateRpc(stats);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          return;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        case DELETE:<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          deleteTracker.updateRpc(stats);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          return;<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        case INCREMENT:<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          incrementTracker.updateRpc(stats);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          return;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>        case PUT:<a name="line.433"></a>
+<span class="sourceLineNo">434</span>          putTracker.updateRpc(stats);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>          return;<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        default:<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          throw new RuntimeException("Unrecognized mutation type " + mutationType);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        }<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      case 2:<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        assert "Scan".equals(method.getName());<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        scanTracker.updateRpc(stats);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        return;<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      case 3:<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        assert "BulkLoadHFile".equals(method.getName());<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        // use generic implementation<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        break;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      case 4:<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        assert "ExecService".equals(method.getName());<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        // use generic implementation<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        break;<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      case 5:<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        assert "ExecRegionServerService".equals(method.getName());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        // use generic implementation<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        break;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      case 6:<a name="line.455"></a>
+<span class="sourceLineNo">456</span>        assert "Multi".equals(method.getName());<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        multiTracker.updateRpc(stats);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        return;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      default:<a name="line.459"></a>
+<span class="sourceLineNo">460</span>        throw new RuntimeException("Unrecognized ClientService RPC type " + method.getFullName());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      }<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    // Fallback to dynamic registry lookup for DDL methods.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    updateRpcGeneric(method, stats);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  public void incrCacheDroppingExceptions(Object exception) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    getMetric(CACHE_BASE +<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      (exception == null? UNKNOWN_EXCEPTION : exception.getClass().getSimpleName()),<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      cacheDroppingExceptions, counterFactory).inc();<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>}<a name="line.472"></a>
 
 
 


[13/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index 4d12487..64f2300 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -2486,6 +2486,19 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/ipc/TestRpcHandlerException.html#CELL_BYTES">CELL_BYTES</a></span> - Static variable in class org.apache.hadoop.hbase.ipc.<a href="./org/apache/hadoop/hbase/ipc/TestRpcHandlerException.html" title="class in org.apache.hadoop.hbase.ipc">TestRpcHandlerException</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CELL_GRID">CELL_GRID</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>
+<div class="block">Five rows by four columns distinguished by column qualifier (column qualifier is one of the
+ four rows...</div>
+</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CELL_GRID_BLOCK2_BOUNDARY">CELL_GRID_BLOCK2_BOUNDARY</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CELL_GRID_BLOCK3_BOUNDARY">CELL_GRID_BLOCK3_BOUNDARY</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CELL_GRID_BLOCK4_BOUNDARY">CELL_GRID_BLOCK4_BOUNDARY</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CELL_GRID_BLOCK5_BOUNDARY">CELL_GRID_BLOCK5_BOUNDARY</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/TestPartialResultsFromClientSide.html#CELL_HEAP_SIZE">CELL_HEAP_SIZE</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="./org/apache/hadoop/hbase/TestPartialResultsFromClientSide.html" title="class in org.apache.hadoop.hbase">TestPartialResultsFromClientSide</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/TestServerSideScanMetricsFromClientSide.html#CELL_HEAP_SIZE">CELL_HEAP_SIZE</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="./org/apache/hadoop/hbase/TestServerSideScanMetricsFromClientSide.html" title="class in org.apache.hadoop.hbase">TestServerSideScanMetricsFromClientSide</a></dt>
@@ -2530,7 +2543,7 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestSplitTransaction.html#CF">CF</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestSplitTransaction.html" title="class in org.apache.hadoop.hbase.regionserver">TestSplitTransaction</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CF">CF</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CF">CF</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/visibility/TestDefaultScanLabelGeneratorStack.html#CF">CF</a></span> - Static variable in class org.apache.hadoop.hbase.security.visibility.<a href="./org/apache/hadoop/hbase/security/visibility/TestDefaultScanLabelGeneratorStack.html" title="class in org.apache.hadoop.hbase.security.visibility">TestDefaultScanLabelGeneratorStack</a></dt>
 <dd>&nbsp;</dd>
@@ -4901,6 +4914,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestServerCustomProtocol.PingHandler.html#count(com.google.protobuf.RpcController,%20org.apache.hadoop.hbase.coprocessor.protobuf.generated.PingProtos.CountRequest,%20com.google.protobuf.RpcCallback)">count(RpcController, PingProtos.CountRequest, RpcCallback&lt;PingProtos.CountResponse&gt;)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestServerCustomProtocol.PingHandler.html" title="class in org.apache.hadoop.hbase.regionserver">TestServerCustomProtocol.PingHandler</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html#count">count</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner.CellGridStoreScanner</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.Appender.html#count">count</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="./org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.Appender.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestLogRollingNoCluster.Appender</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/replication/TestMasterReplication.html#count">count</a></span> - Static variable in class org.apache.hadoop.hbase.replication.<a href="./org/apache/hadoop/hbase/replication/TestMasterReplication.html" title="class in org.apache.hadoop.hbase.replication">TestMasterReplication</a></dt>
@@ -8633,6 +8648,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStore.html#family">family</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStore.html" title="class in org.apache.hadoop.hbase.regionserver">TestStore</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#FAMILY">FAMILY</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">TestTimestampFilterSeekHint</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/throttle/TestCompactionWithThroughputController.html#family">family</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.throttle.<a href="./org/apache/hadoop/hbase/regionserver/throttle/TestCompactionWithThroughputController.html" title="class in org.apache.hadoop.hbase.regionserver.throttle">TestCompactionWithThroughputController</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/throttle/TestFlushWithThroughputController.html#family">family</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.throttle.<a href="./org/apache/hadoop/hbase/regionserver/throttle/TestFlushWithThroughputController.html" title="class in org.apache.hadoop.hbase.regionserver.throttle">TestFlushWithThroughputController</a></dt>
@@ -8733,6 +8750,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestSeekOptimizations.html#FAMILY_BYTES">FAMILY_BYTES</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestSeekOptimizations.html" title="class in org.apache.hadoop.hbase.regionserver">TestSeekOptimizations</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#FAMILY_BYTES">FAMILY_BYTES</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">TestTimestampFilterSeekHint</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/trace/TestHTraceHooks.html#FAMILY_BYTES">FAMILY_BYTES</a></span> - Static variable in class org.apache.hadoop.hbase.trace.<a href="./org/apache/hadoop/hbase/trace/TestHTraceHooks.html" title="class in org.apache.hadoop.hbase.trace">TestHTraceHooks</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/TestAcidGuarantees.html#FAMILY_C">FAMILY_C</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="./org/apache/hadoop/hbase/TestAcidGuarantees.html" title="class in org.apache.hadoop.hbase">TestAcidGuarantees</a></dt>
@@ -9085,6 +9104,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestRSKilledWhenInitializing.html#firstRS">firstRS</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestRSKilledWhenInitializing.html" title="class in org.apache.hadoop.hbase.regionserver">TestRSKilledWhenInitializing</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#FIVE">FIVE</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/chaos/monkies/PolicyBasedChaosMonkey.html#FIVE_SEC">FIVE_SEC</a></span> - Static variable in class org.apache.hadoop.hbase.chaos.monkies.<a href="./org/apache/hadoop/hbase/chaos/monkies/PolicyBasedChaosMonkey.html" title="class in org.apache.hadoop.hbase.chaos.monkies">PolicyBasedChaosMonkey</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestJoinedScanners.html#flag_no">flag_no</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestJoinedScanners.html" title="class in org.apache.hadoop.hbase.regionserver">TestJoinedScanners</a></dt>
@@ -9274,6 +9295,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.html#FOUND_GROUP_KEY">FOUND_GROUP_KEY</a></span> - Static variable in class org.apache.hadoop.hbase.test.<a href="./org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.html" title="class in org.apache.hadoop.hbase.test">IntegrationTestLoadAndVerify</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#FOUR">FOUR</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/mapreduce/TestCellCounter.html#FQ_OUTPUT_DIR">FQ_OUTPUT_DIR</a></span> - Static variable in class org.apache.hadoop.hbase.mapreduce.<a href="./org/apache/hadoop/hbase/mapreduce/TestCellCounter.html" title="class in org.apache.hadoop.hbase.mapreduce">TestCellCounter</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/mapreduce/TestImportExport.html#FQ_OUTPUT_DIR">FQ_OUTPUT_DIR</a></span> - Static variable in class org.apache.hadoop.hbase.mapreduce.<a href="./org/apache/hadoop/hbase/mapreduce/TestImportExport.html" title="class in org.apache.hadoop.hbase.mapreduce">TestImportExport</a></dt>
@@ -11319,6 +11342,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.LinkChain.html#getNext()">getNext()</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="./org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.LinkChain.html" title="class in org.apache.hadoop.hbase.mapreduce">IntegrationTestBulkLoad.LinkChain</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html#getNextIndexedKey()">getNextIndexedKey()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner.CellGridStoreScanner</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedRequestsWithRegionReplicas.TimeBoundedMultiThreadedReader.TimeBoundedMultiThreadedReaderThread.html#getNextKeyToRead()">getNextKeyToRead()</a></span> - Method in class org.apache.hadoop.hbase.test.<a href="./org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedRequestsWithRegionReplicas.TimeBoundedMultiThreadedReader.TimeBoundedMultiThreadedReaderThread.html" title="class in org.apache.hadoop.hbase.test">IntegrationTestTimeBoundedRequestsWithRegionReplicas.TimeBoundedMultiThreadedReader.TimeBoundedMultiThreadedReaderThread</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/util/MultiThreadedReader.HBaseReaderThread.html#getNextKeyToRead()">getNextKeyToRead()</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="./org/apache/hadoop/hbase/util/MultiThreadedReader.HBaseReaderThread.html" title="class in org.apache.hadoop.hbase.util">MultiThreadedReader.HBaseReaderThread</a></dt>
@@ -15350,7 +15375,7 @@
 <dd>
 <div class="block">A fixture that implements and presents a KeyValueScanner.</div>
 </dd>
-<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html#KeyValueScanFixture(org.apache.hadoop.hbase.CellComparator,%20org.apache.hadoop.hbase.KeyValue...)">KeyValueScanFixture(CellComparator, KeyValue...)</a></span> - Constructor for class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueScanFixture</a></dt>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html#KeyValueScanFixture(org.apache.hadoop.hbase.CellComparator,%20org.apache.hadoop.hbase.Cell...)">KeyValueScanFixture(CellComparator, Cell...)</a></span> - Constructor for class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueScanFixture</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/util/LoadTestTool.html#keyWindow">keyWindow</a></span> - Variable in class org.apache.hadoop.hbase.util.<a href="./org/apache/hadoop/hbase/util/LoadTestTool.html" title="class in org.apache.hadoop.hbase.util">LoadTestTool</a></dt>
 <dd>&nbsp;</dd>
@@ -16514,6 +16539,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreFile.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreFile</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestWALLockup.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestWALLockup.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALLockup</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestWideScanner.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestWideScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestWideScanner</a></dt>
@@ -17450,6 +17477,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestMultiColumnScanner.html#MAX_VERSIONS">MAX_VERSIONS</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestMultiColumnScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestMultiColumnScanner</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#MAX_VERSIONS">MAX_VERSIONS</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">TestTimestampFilterSeekHint</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/client/TestSnapshotMetadata.html#MAX_VERSIONS_FAM">MAX_VERSIONS_FAM</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="./org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotMetadata</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/client/TestSnapshotMetadata.html#MAX_VERSIONS_FAM_STR">MAX_VERSIONS_FAM_STR</a></span> - Static variable in class org.apache.hadoop.hbase.client.<a href="./org/apache/hadoop/hbase/client/TestSnapshotMetadata.html" title="class in org.apache.hadoop.hbase.client">TestSnapshotMetadata</a></dt>
@@ -19420,6 +19449,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#ONE">ONE</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html" title="class in org.apache.hadoop.hbase.regionserver">TestHRegion.Incrementer</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#ONE">ONE</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/access/TestCellACLs.html#ONE">ONE</a></span> - Static variable in class org.apache.hadoop.hbase.security.access.<a href="./org/apache/hadoop/hbase/security/access/TestCellACLs.html" title="class in org.apache.hadoop.hbase.security.access">TestCellACLs</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#ONE">ONE</a></span> - Static variable in class org.apache.hadoop.hbase.security.access.<a href="./org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html" title="class in org.apache.hadoop.hbase.security.access">TestCellACLWithMultipleVersions</a></dt>
@@ -19644,6 +19675,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/util/LoadTestTool.html#OPT_ZK_QUORUM">OPT_ZK_QUORUM</a></span> - Static variable in class org.apache.hadoop.hbase.util.<a href="./org/apache/hadoop/hbase/util/LoadTestTool.html" title="class in org.apache.hadoop.hbase.util">LoadTestTool</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html#optimization">optimization</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner.CellGridStoreScanner</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html#optimize(org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode,%20org.apache.hadoop.hbase.Cell)">optimize(ScanQueryMatcher.MatchCode, Cell)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner.CellGridStoreScanner</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/hfile/TestHFileSeek.html#options">options</a></span> - Variable in class org.apache.hadoop.hbase.io.hfile.<a href="./org/apache/hadoop/hbase/io/hfile/TestHFileSeek.html" title="class in org.apache.hadoop.hbase.io.hfile">TestHFileSeek</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/CreateRandomStoreFile.html#options">options</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/CreateRandomStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">CreateRandomStoreFile</a></dt>
@@ -21469,6 +21504,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/util/TestMiniClusterLoadSequential.html#prepareReaderThreads(org.apache.hadoop.hbase.util.test.LoadTestDataGenerator,%20org.apache.hadoop.conf.Configuration,%20org.apache.hadoop.hbase.TableName,%20double)">prepareReaderThreads(LoadTestDataGenerator, Configuration, TableName, double)</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="./org/apache/hadoop/hbase/util/TestMiniClusterLoadSequential.html" title="class in org.apache.hadoop.hbase.util">TestMiniClusterLoadSequential</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#prepareRegion()">prepareRegion()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">TestTimestampFilterSeekHint</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html#prepareTest(java.lang.String)">prepareTest(String)</a></span> - Method in class org.apache.hadoop.hbase.io.encoding.<a href="./org/apache/hadoop/hbase/io/encoding/TestChangingEncoding.html" title="class in org.apache.hadoop.hbase.io.encoding">TestChangingEncoding</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/coprocessor/TestRowProcessorEndpoint.html#prepareTestData()">prepareTestData()</a></span> - Method in class org.apache.hadoop.hbase.coprocessor.<a href="./org/apache/hadoop/hbase/coprocessor/TestRowProcessorEndpoint.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRowProcessorEndpoint</a></dt>
@@ -22242,6 +22279,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestReversibleScanners.html#QUAL">QUAL</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestReversibleScanners.html" title="class in org.apache.hadoop.hbase.regionserver">TestReversibleScanners</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#QUAL">QUAL</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">TestTimestampFilterSeekHint</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/visibility/TestVisibilityLabels.html#qual">qual</a></span> - Static variable in class org.apache.hadoop.hbase.security.visibility.<a href="./org/apache/hadoop/hbase/security/visibility/TestVisibilityLabels.html" title="class in org.apache.hadoop.hbase.security.visibility">TestVisibilityLabels</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.html#qual">qual</a></span> - Static variable in class org.apache.hadoop.hbase.security.visibility.<a href="./org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.html" title="class in org.apache.hadoop.hbase.security.visibility">TestVisibilityLabelsReplication</a></dt>
@@ -22298,6 +22337,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestParallelPut.html#qual3">qual3</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestParallelPut.html" title="class in org.apache.hadoop.hbase.regionserver">TestParallelPut</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#QUAL_BYTES">QUAL_BYTES</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">TestTimestampFilterSeekHint</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/TestKeyValue.html#qualA">qualA</a></span> - Variable in class org.apache.hadoop.hbase.<a href="./org/apache/hadoop/hbase/TestKeyValue.html" title="class in org.apache.hadoop.hbase">TestKeyValue</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/TestKeyValue.html#qualB">qualB</a></span> - Variable in class org.apache.hadoop.hbase.<a href="./org/apache/hadoop/hbase/TestKeyValue.html" title="class in org.apache.hadoop.hbase">TestKeyValue</a></dt>
@@ -23058,6 +23099,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestSeekOptimizations.html#region">region</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestSeekOptimizations.html" title="class in org.apache.hadoop.hbase.regionserver">TestSeekOptimizations</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#region">region</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">TestTimestampFilterSeekHint</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestWALLockup.html#region">region</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestWALLockup.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALLockup</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/wal/TestWALSplit.ZombieLastLogWriterRegionServer.html#region">region</a></span> - Variable in class org.apache.hadoop.hbase.wal.<a href="./org/apache/hadoop/hbase/wal/TestWALSplit.ZombieLastLogWriterRegionServer.html" title="class in org.apache.hadoop.hbase.wal">TestWALSplit.ZombieLastLogWriterRegionServer</a></dt>
@@ -23109,6 +23152,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/coprocessor/TestClassLoading.html#regionCoprocessor2">regionCoprocessor2</a></span> - Static variable in class org.apache.hadoop.hbase.coprocessor.<a href="./org/apache/hadoop/hbase/coprocessor/TestClassLoading.html" title="class in org.apache.hadoop.hbase.coprocessor">TestClassLoading</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#regionCount">regionCount</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">TestTimestampFilterSeekHint</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/master/balancer/BalancerTestBase.html#regionId">regionId</a></span> - Static variable in class org.apache.hadoop.hbase.master.balancer.<a href="./org/apache/hadoop/hbase/master/balancer/BalancerTestBase.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerTestBase</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/master/balancer/TestRSGroupBasedLoadBalancer.html#regionId">regionId</a></span> - Static variable in class org.apache.hadoop.hbase.master.balancer.<a href="./org/apache/hadoop/hbase/master/balancer/TestRSGroupBasedLoadBalancer.html" title="class in org.apache.hadoop.hbase.master.balancer">TestRSGroupBasedLoadBalancer</a></dt>
@@ -23822,6 +23867,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.LinkChain.html#rk">rk</a></span> - Variable in class org.apache.hadoop.hbase.mapreduce.<a href="./org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.LinkChain.html" title="class in org.apache.hadoop.hbase.mapreduce">IntegrationTestBulkLoad.LinkChain</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#RK">RK</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">TestTimestampFilterSeekHint</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#RK_BYTES">RK_BYTES</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">TestTimestampFilterSeekHint</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/coprocessor/TestRegionServerObserver.CPRegionServerObserver.html#rmt">rmt</a></span> - Variable in class org.apache.hadoop.hbase.coprocessor.<a href="./org/apache/hadoop/hbase/coprocessor/TestRegionServerObserver.CPRegionServerObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionServerObserver.CPRegionServerObserver</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestMultiVersionConcurrencyControl.Writer.html#rnd">rnd</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestMultiVersionConcurrencyControl.Writer.html" title="class in org.apache.hadoop.hbase.regionserver">TestMultiVersionConcurrencyControl.Writer</a></dt>
@@ -31308,6 +31357,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestTags.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestTags.html" title="class in org.apache.hadoop.hbase.regionserver">TestTags</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">TestTimestampFilterSeekHint</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestWALLockup.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestWALLockup.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALLockup</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/throttle/TestCompactionWithThroughputController.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.throttle.<a href="./org/apache/hadoop/hbase/regionserver/throttle/TestCompactionWithThroughputController.html" title="class in org.apache.hadoop.hbase.regionserver.throttle">TestCompactionWithThroughputController</a></dt>
@@ -36335,6 +36386,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/TestFullLogReconstruction.html#TestFullLogReconstruction()">TestFullLogReconstruction()</a></span> - Constructor for class org.apache.hadoop.hbase.<a href="./org/apache/hadoop/hbase/TestFullLogReconstruction.html" title="class in org.apache.hadoop.hbase">TestFullLogReconstruction</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testFullRowGetDoesNotOverreadWhenRowInsideOneBlock()">testFullRowGetDoesNotOverreadWhenRowInsideOneBlock()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testFullRowSpansBlocks()">testFullRowSpansBlocks()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestFSErrorsExposed.html#testFullSystemBubblesFSErrors()">testFullSystemBubblesFSErrors()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestFSErrorsExposed.html" title="class in org.apache.hadoop.hbase.regionserver">TestFSErrorsExposed</a></dt>
 <dd>
 <div class="block">Cluster test which starts a region server with a region, then
@@ -36483,6 +36538,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/master/cleaner/TestReplicationHFileCleaner.html#testGetDeletableFiles()">testGetDeletableFiles()</a></span> - Method in class org.apache.hadoop.hbase.master.cleaner.<a href="./org/apache/hadoop/hbase/master/cleaner/TestReplicationHFileCleaner.html" title="class in org.apache.hadoop.hbase.master.cleaner">TestReplicationHFileCleaner</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#testGetDoesntSeekWithNoHint()">testGetDoesntSeekWithNoHint()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">TestTimestampFilterSeekHint</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/client/TestFromClientSide3.html#testGetEmptyRow()">testGetEmptyRow()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="./org/apache/hadoop/hbase/client/TestFromClientSide3.html" title="class in org.apache.hadoop.hbase.client">TestFromClientSide3</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStripeStoreFileManager.html#testGetFilesForGetAndScan()">testGetFilesForGetAndScan()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStripeStoreFileManager.html" title="class in org.apache.hadoop.hbase.regionserver">TestStripeStoreFileManager</a></dt>
@@ -36657,6 +36714,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandlerWithLabels.html#testGetScannerResultsWithAuthorizations()">testGetScannerResultsWithAuthorizations()</a></span> - Method in class org.apache.hadoop.hbase.thrift2.<a href="./org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandlerWithLabels.html" title="class in org.apache.hadoop.hbase.thrift2">TestThriftHBaseServiceHandlerWithLabels</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#testGetSeek()">testGetSeek()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">TestTimestampFilterSeekHint</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/wal/TestDefaultWALProvider.html#testGetServerNameFromWALDirectoryName()">testGetServerNameFromWALDirectoryName()</a></span> - Method in class org.apache.hadoop.hbase.wal.<a href="./org/apache/hadoop/hbase/wal/TestDefaultWALProvider.html" title="class in org.apache.hadoop.hbase.wal">TestDefaultWALProvider</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/TestHTableDescriptor.html#testGetSetRemoveCP()">testGetSetRemoveCP()</a></span> - Method in class org.apache.hadoop.hbase.<a href="./org/apache/hadoop/hbase/TestHTableDescriptor.html" title="class in org.apache.hadoop.hbase">TestHTableDescriptor</a></dt>
@@ -40852,6 +40911,19 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/filter/TestBitComparator.html#testOperationWithOffset(java.nio.ByteBuffer,%20byte[],%20org.apache.hadoop.hbase.filter.BitComparator.BitwiseOp,%20int)">testOperationWithOffset(ByteBuffer, byte[], BitComparator.BitwiseOp, int)</a></span> - Method in class org.apache.hadoop.hbase.filter.<a href="./org/apache/hadoop/hbase/filter/TestBitComparator.html" title="class in org.apache.hadoop.hbase.filter">TestBitComparator</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testOptimize()">testOptimize()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>
+<div class="block">Test optimize in StoreScanner.</div>
+</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testOptimizeAndGet()">testOptimizeAndGet()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>
+<div class="block">Ensure the optimize Scan method in StoreScanner does not get in the way of a Get doing minimum
+ work...</div>
+</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testOptimizeAndGetWithFakedNextBlockIndexStart()">testOptimizeAndGetWithFakedNextBlockIndexStart()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>
+<div class="block">Ensure that optimize does not cause the Get to do more seeking than required.</div>
+</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/master/TestClusterStatusPublisher.html#testOrder()">testOrder()</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="./org/apache/hadoop/hbase/master/TestClusterStatusPublisher.html" title="class in org.apache.hadoop.hbase.master">TestClusterStatusPublisher</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/procedure2/util/TestTimeoutBlockingQueue.html#testOrder()">testOrder()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.util.<a href="./org/apache/hadoop/hbase/procedure2/util/TestTimeoutBlockingQueue.html" title="class in org.apache.hadoop.hbase.procedure2.util">TestTimeoutBlockingQueue</a></dt>
@@ -44757,6 +44829,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/client/TestShortCircuitConnection.html#testShortCircuitConnection()">testShortCircuitConnection()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="./org/apache/hadoop/hbase/client/TestShortCircuitConnection.html" title="class in org.apache.hadoop.hbase.client">TestShortCircuitConnection</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/io/hfile/TestHFile.html#testShortMidpointSameQual()">testShortMidpointSameQual()</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.<a href="./org/apache/hadoop/hbase/io/hfile/TestHFile.html" title="class in org.apache.hadoop.hbase.io.hfile">TestHFile</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/TestServerName.html#testShortString()">testShortString()</a></span> - Method in class org.apache.hadoop.hbase.<a href="./org/apache/hadoop/hbase/TestServerName.html" title="class in org.apache.hadoop.hbase">TestServerName</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/TestFSTableDescriptorForceCreation.html#testShouldAllowForcefulCreationOfAlreadyExistingTableDescriptor()">testShouldAllowForcefulCreationOfAlreadyExistingTableDescriptor()</a></span> - Method in class org.apache.hadoop.hbase.<a href="./org/apache/hadoop/hbase/TestFSTableDescriptorForceCreation.html" title="class in org.apache.hadoop.hbase">TestFSTableDescriptorForceCreation</a></dt>
@@ -45850,6 +45924,12 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#TestStoreScanner()">TestStoreScanner()</a></span> - Constructor for class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">TestStoreScanner.CellGridStoreScanner</span></a> - Class in <a href="./org/apache/hadoop/hbase/regionserver/package-summary.html">org.apache.hadoop.hbase.regionserver</a></dt>
+<dd>
+<div class="block">A StoreScanner for our CELL_GRID above.</div>
+</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html#TestStoreScanner.CellGridStoreScanner(org.apache.hadoop.hbase.client.Scan,%20org.apache.hadoop.hbase.regionserver.ScanInfo,%20org.apache.hadoop.hbase.regionserver.ScanType)">TestStoreScanner.CellGridStoreScanner(Scan, ScanInfo, ScanType)</a></span> - Constructor for class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner.CellGridStoreScanner</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStore.html#testStoreUsesConfigurationFromHcdAndHtd()">testStoreUsesConfigurationFromHcdAndHtd()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStore.html" title="class in org.apache.hadoop.hbase.regionserver">TestStore</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStore.html#testStoreUsesSearchEngineOverride()">testStoreUsesSearchEngineOverride()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStore.html" title="class in org.apache.hadoop.hbase.regionserver">TestStore</a></dt>
@@ -46717,6 +46797,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/codec/prefixtree/timestamp/TestTimestampEncoder.html#TestTimestampEncoder(org.apache.hadoop.hbase.codec.prefixtree.timestamp.TestTimestampData)">TestTimestampEncoder(TestTimestampData)</a></span> - Constructor for class org.apache.hadoop.hbase.codec.prefixtree.timestamp.<a href="./org/apache/hadoop/hbase/codec/prefixtree/timestamp/TestTimestampEncoder.html" title="class in org.apache.hadoop.hbase.codec.prefixtree.timestamp">TestTimestampEncoder</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">TestTimestampFilterSeekHint</span></a> - Class in <a href="./org/apache/hadoop/hbase/regionserver/package-summary.html">org.apache.hadoop.hbase.regionserver</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#TestTimestampFilterSeekHint()">TestTimestampFilterSeekHint()</a></span> - Constructor for class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver">TestTimestampFilterSeekHint</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/TestMultiVersions.html#testTimestamps()">testTimestamps()</a></span> - Method in class org.apache.hadoop.hbase.<a href="./org/apache/hadoop/hbase/TestMultiVersions.html" title="class in org.apache.hadoop.hbase">TestMultiVersions</a></dt>
 <dd>
 <div class="block">Tests user specifiable time stamps putting, getting and scanning.</div>
@@ -48092,6 +48176,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestParallelPut.html#THREADS100">THREADS100</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestParallelPut.html" title="class in org.apache.hadoop.hbase.regionserver">TestParallelPut</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#THREE">THREE</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/IntegrationTestIngestWithMOB.html#THRESHOLD">THRESHOLD</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="./org/apache/hadoop/hbase/IntegrationTestIngestWithMOB.html" title="class in org.apache.hadoop.hbase">IntegrationTestIngestWithMOB</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/IntegrationTestIngestWithMOB.html#threshold">threshold</a></span> - Variable in class org.apache.hadoop.hbase.<a href="./org/apache/hadoop/hbase/IntegrationTestIngestWithMOB.html" title="class in org.apache.hadoop.hbase">IntegrationTestIngestWithMOB</a></dt>
@@ -48574,8 +48660,12 @@
 <dd>
 <div class="block">Start archiving table for given hfile cleaner</div>
 </dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#TWO">TWO</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#TWO">TWO</a></span> - Static variable in class org.apache.hadoop.hbase.security.access.<a href="./org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html" title="class in org.apache.hadoop.hbase.security.access">TestCellACLWithMultipleVersions</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#TWO_POINT_TWO">TWO_POINT_TWO</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="./org/apache/hadoop/hbase/chaos/policies/TwoConcurrentActionPolicy.html" title="class in org.apache.hadoop.hbase.chaos.policies"><span class="strong">TwoConcurrentActionPolicy</span></a> - Class in <a href="./org/apache/hadoop/hbase/chaos/policies/package-summary.html">org.apache.hadoop.hbase.chaos.policies</a></dt>
 <dd>
 <div class="block">Chaos Monkey policy that will run two different actions at the same time.</div>
@@ -49471,6 +49561,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.html#VALUE">VALUE</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.html" title="class in org.apache.hadoop.hbase.regionserver">TestScannerHeartbeatMessages</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#VALUE">VALUE</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/wal/TestKeyValueCompression.html#VALUE">VALUE</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="./org/apache/hadoop/hbase/regionserver/wal/TestKeyValueCompression.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestKeyValueCompression</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.html#value">value</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="./org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestLogRolling</a></dt>
@@ -51358,6 +51450,10 @@ the order they are declared.</div>
 </a>
 <h2 class="title">Z</h2>
 <dl>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#ZERO">ZERO</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>
+<div class="block">From here on down, we have a bunch of defines and specific CELL_GRID of Cells.</div>
+</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/access/TestCellACLs.html#ZERO">ZERO</a></span> - Static variable in class org.apache.hadoop.hbase.security.access.<a href="./org/apache/hadoop/hbase/security/access/TestCellACLs.html" title="class in org.apache.hadoop.hbase.security.access">TestCellACLs</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html#ZERO">ZERO</a></span> - Static variable in class org.apache.hadoop.hbase.security.access.<a href="./org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.html" title="class in org.apache.hadoop.hbase.security.access">TestCellACLWithMultipleVersions</a></dt>
@@ -51368,6 +51464,8 @@ the order they are declared.</div>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/security/visibility/TestWithDisabledAuthorization.html#ZERO">ZERO</a></span> - Static variable in class org.apache.hadoop.hbase.security.visibility.<a href="./org/apache/hadoop/hbase/security/visibility/TestWithDisabledAuthorization.html" title="class in org.apache.hadoop.hbase.security.visibility">TestWithDisabledAuthorization</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#ZERO_POINT_ZERO">ZERO_POINT_ZERO</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="./org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/filter/TestBitComparator.html#zeros">zeros</a></span> - Static variable in class org.apache.hadoop.hbase.filter.<a href="./org/apache/hadoop/hbase/filter/TestBitComparator.html" title="class in org.apache.hadoop.hbase.filter">TestBitComparator</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/filter/TestBitComparator.html#zeros_bb">zeros_bb</a></span> - Static variable in class org.apache.hadoop.hbase.filter.<a href="./org/apache/hadoop/hbase/filter/TestBitComparator.html" title="class in org.apache.hadoop.hbase.filter">TestBitComparator</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
index 0f9914d..6e8bed8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
@@ -2315,93 +2315,97 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
-<td class="colLast"><span class="strong">TestHRegionReplayEvents.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestHRegionReplayEvents.html#TEST_UTIL">TEST_UTIL</a></strong></code>&nbsp;</td>
+<td class="colLast"><span class="strong">TestTimestampFilterSeekHint.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#TEST_UTIL">TEST_UTIL</a></strong></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
-<td class="colLast"><span class="strong">TestScannerHeartbeatMessages.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.html#TEST_UTIL">TEST_UTIL</a></strong></code>&nbsp;</td>
+<td class="colLast"><span class="strong">TestHRegionReplayEvents.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestHRegionReplayEvents.html#TEST_UTIL">TEST_UTIL</a></strong></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
-<td class="colLast"><span class="strong">TestBlocksScanned.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestBlocksScanned.html#TEST_UTIL">TEST_UTIL</a></strong></code>&nbsp;</td>
+<td class="colLast"><span class="strong">TestScannerHeartbeatMessages.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.html#TEST_UTIL">TEST_UTIL</a></strong></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
-<td class="colLast"><span class="strong">TestCompoundBloomFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCompoundBloomFilter.html#TEST_UTIL">TEST_UTIL</a></strong></code>&nbsp;</td>
+<td class="colLast"><span class="strong">TestBlocksScanned.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestBlocksScanned.html#TEST_UTIL">TEST_UTIL</a></strong></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
-<td class="colLast"><span class="strong">TestStoreFile.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreFile.html#TEST_UTIL">TEST_UTIL</a></strong></code>&nbsp;</td>
+<td class="colLast"><span class="strong">TestCompoundBloomFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCompoundBloomFilter.html#TEST_UTIL">TEST_UTIL</a></strong></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
-<td class="colLast"><span class="strong">TestScannerWithBulkload.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestScannerWithBulkload.html#TEST_UTIL">TEST_UTIL</a></strong></code>&nbsp;</td>
+<td class="colLast"><span class="strong">TestStoreFile.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreFile.html#TEST_UTIL">TEST_UTIL</a></strong></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
-<td class="colLast"><span class="strong">TestEncryptionRandomKeying.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestEncryptionRandomKeying.html#TEST_UTIL">TEST_UTIL</a></strong></code>&nbsp;</td>
+<td class="colLast"><span class="strong">TestScannerWithBulkload.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestScannerWithBulkload.html#TEST_UTIL">TEST_UTIL</a></strong></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
-<td class="colLast"><span class="strong">TestDeleteMobTable.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestDeleteMobTable.html#TEST_UTIL">TEST_UTIL</a></strong></code>&nbsp;</td>
+<td class="colLast"><span class="strong">TestEncryptionRandomKeying.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestEncryptionRandomKeying.html#TEST_UTIL">TEST_UTIL</a></strong></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
+<td class="colLast"><span class="strong">TestDeleteMobTable.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestDeleteMobTable.html#TEST_UTIL">TEST_UTIL</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>(package private) static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="strong">TestSplitTransactionOnCluster.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.html#TESTING_UTIL">TESTING_UTIL</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="strong">EncodedSeekPerformanceTest.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/EncodedSeekPerformanceTest.html#testingUtility">testingUtility</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="strong">TestSplitWalDataLoss.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestSplitWalDataLoss.html#testUtil">testUtil</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="strong">TestRegionServerReportForDuty.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReportForDuty.html#testUtil">testUtil</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="strong">TestServerCustomProtocol.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestServerCustomProtocol.html#util">util</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="strong">TestFSErrorsExposed.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestFSErrorsExposed.html#util">util</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="strong">TestMinorCompaction.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMinorCompaction.html#UTIL">UTIL</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="strong">TestMajorCompaction.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMajorCompaction.html#UTIL">UTIL</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="strong">TestGetClosestAtOrBefore.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestGetClosestAtOrBefore.html#UTIL">UTIL</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="strong">TestCorruptedRegionStoreFile.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCorruptedRegionStoreFile.html#UTIL">UTIL</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="strong">TestScannerRetriableFailure.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html#UTIL">UTIL</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="strong">TestMobStoreCompaction.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMobStoreCompaction.html#UTIL">UTIL</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="strong">TestCompaction.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCompaction.html#UTIL">UTIL</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="strong">TestHRegionServerBulkLoad.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoad.html#UTIL">UTIL</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="strong">TestHeapMemoryManager.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestHeapMemoryManager.html#UTIL">UTIL</a></strong></code>&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestHFile.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestHFile.html b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestHFile.html
index c31fd36..225a112 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestHFile.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/TestHFile.html
@@ -276,25 +276,29 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestHFile.html#testTFileFeatures()">testTFileFeatures</a></strong>()</code>&nbsp;</td>
+<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestHFile.html#testShortMidpointSameQual()">testShortMidpointSameQual</a></strong>()</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestHFile.html#testTFileFeatures()">testTFileFeatures</a></strong>()</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestHFile.html#truncateFile(org.apache.hadoop.fs.FileSystem,%20org.apache.hadoop.fs.Path,%20org.apache.hadoop.fs.Path)">truncateFile</a></strong>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                         org.apache.hadoop.fs.Path&nbsp;src,
                         org.apache.hadoop.fs.Path&nbsp;dst)</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/io/hfile/TestHFile.html#writeNumMetablocks(org.apache.hadoop.hbase.io.hfile.HFile.Writer,%20int)">writeNumMetablocks</a></strong>(org.apache.hadoop.hbase.io.hfile.HFile.Writer&nbsp;writer,
                                     int&nbsp;n)</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/io/hfile/TestHFile.html#writeRecords(org.apache.hadoop.hbase.io.hfile.HFile.Writer,%20boolean)">writeRecords</a></strong>(org.apache.hadoop.hbase.io.hfile.HFile.Writer&nbsp;writer,
                         boolean&nbsp;useTags)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private int</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestHFile.html#writeSomeRecords(org.apache.hadoop.hbase.io.hfile.HFile.Writer,%20int,%20int,%20boolean)">writeSomeRecords</a></strong>(org.apache.hadoop.hbase.io.hfile.HFile.Writer&nbsp;writer,
                                 int&nbsp;start,
@@ -705,17 +709,26 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testCompressionOrdinance</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFile.html#line.400">testCompressionOrdinance</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFile.html#line.401">testCompressionOrdinance</a>()</pre>
 <div class="block">Make sure the ordinals for our compression algorithms do not change on us.</div>
 </li>
 </ul>
+<a name="testShortMidpointSameQual()">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testShortMidpointSameQual</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFile.html#line.410">testShortMidpointSameQual</a>()</pre>
+</li>
+</ul>
 <a name="testGetShortMidpoint()">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testGetShortMidpoint</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFile.html#line.409">testGetShortMidpoint</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/hfile/TestHFile.html#line.429">testGetShortMidpoint</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer.html b/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer.html
index 7448142..83eb0bd 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer.html
@@ -108,7 +108,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.138">AbstractTestIPC.TestRpcServer</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.137">AbstractTestIPC.TestRpcServer</a>
 extends org.apache.hadoop.hbase.ipc.RpcServer</pre>
 <div class="block">Instance of server. We actually don't do anything speical in here so could just use
  HBaseRpcServer directly.</div>
@@ -228,7 +228,7 @@ extends org.apache.hadoop.hbase.ipc.RpcServer</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>AbstractTestIPC.TestRpcServer</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer.html#line.140">AbstractTestIPC.TestRpcServer</a>()
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer.html#line.139">AbstractTestIPC.TestRpcServer</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>
@@ -240,7 +240,7 @@ extends org.apache.hadoop.hbase.ipc.RpcServer</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>AbstractTestIPC.TestRpcServer</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer.html#line.144">AbstractTestIPC.TestRpcServer</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer.html#line.143">AbstractTestIPC.TestRpcServer</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
                         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>
@@ -252,7 +252,7 @@ extends org.apache.hadoop.hbase.ipc.RpcServer</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AbstractTestIPC.TestRpcServer</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer.html#line.148">AbstractTestIPC.TestRpcServer</a>(org.apache.hadoop.hbase.ipc.RpcScheduler&nbsp;scheduler,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer.html#line.147">AbstractTestIPC.TestRpcServer</a>(org.apache.hadoop.hbase.ipc.RpcScheduler&nbsp;scheduler,
                              org.apache.hadoop.conf.Configuration&nbsp;conf)
                         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>
@@ -273,7 +273,7 @@ extends org.apache.hadoop.hbase.ipc.RpcServer</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>call</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.util.Pair&lt;com.google.protobuf.Message,org.apache.hadoop.hbase.CellScanner&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer.html#line.155">call</a>(com.google.protobuf.BlockingService&nbsp;service,
+<pre>public&nbsp;org.apache.hadoop.hbase.util.Pair&lt;com.google.protobuf.Message,org.apache.hadoop.hbase.CellScanner&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer.html#line.154">call</a>(com.google.protobuf.BlockingService&nbsp;service,
                                                                                                       com.google.protobuf.Descriptors.MethodDescriptor&nbsp;md,
                                                                                                       com.google.protobuf.Message&nbsp;param,
                                                                                                       org.apache.hadoop.hbase.CellScanner&nbsp;cellScanner,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer1.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer1.html b/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer1.html
index 0fac645..f804f07 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer1.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer1.html
@@ -108,7 +108,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.334">AbstractTestIPC.TestRpcServer1</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html#line.333">AbstractTestIPC.TestRpcServer1</a>
 extends org.apache.hadoop.hbase.ipc.RpcServer</pre>
 <div class="block">Instance of RpcServer that echoes client hostAddress back to client</div>
 </li>
@@ -218,7 +218,7 @@ extends org.apache.hadoop.hbase.ipc.RpcServer</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SERVICE1</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer1.html#line.336">SERVICE1</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.ipc.protobuf.generated.TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface <a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer1.html#line.335">SERVICE1</a></pre>
 </li>
 </ul>
 </li>
@@ -235,7 +235,7 @@ extends org.apache.hadoop.hbase.ipc.RpcServer</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>AbstractTestIPC.TestRpcServer1</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer1.html#line.359">AbstractTestIPC.TestRpcServer1</a>()
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer1.html#line.358">AbstractTestIPC.TestRpcServer1</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>
@@ -247,7 +247,7 @@ extends org.apache.hadoop.hbase.ipc.RpcServer</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AbstractTestIPC.TestRpcServer1</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer1.html#line.363">AbstractTestIPC.TestRpcServer1</a>(org.apache.hadoop.hbase.ipc.RpcScheduler&nbsp;scheduler)
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer1.html#line.362">AbstractTestIPC.TestRpcServer1</a>(org.apache.hadoop.hbase.ipc.RpcScheduler&nbsp;scheduler)
                          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>


[11/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html
index 05aa05b..a6aacde 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html
@@ -36,7 +36,7 @@
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreFileScannerWithTagCompression.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Prev Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStripeCompactor.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Next Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Next Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" target="_top">Frames</a></li>
@@ -60,7 +60,7 @@
 <div>
 <ul class="subNavList">
 <li>Summary:&nbsp;</li>
-<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#nested_class_summary">Nested</a>&nbsp;|&nbsp;</li>
 <li><a href="#field_summary">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor_summary">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method_summary">Method</a></li>
@@ -95,7 +95,7 @@
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.55">TestStoreScanner</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.61">TestStoreScanner</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>
@@ -103,6 +103,27 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <div class="summary">
 <ul class="blockList">
 <li class="blockList">
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="nested_class_summary">
+<!--   -->
+</a>
+<h3>Nested Class Summary</h3>
+<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Nested Class Summary table, listing nested classes, and an explanation">
+<caption><span>Nested Classes</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Class and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScanner.CellGridStoreScanner</a></strong></code>
+<div class="block">A StoreScanner for our CELL_GRID above.</div>
+</td>
+</tr>
+</table>
+</li>
+</ul>
 <!-- =========== FIELD SUMMARY =========== -->
 <ul class="blockList">
 <li class="blockList"><a name="field_summary">
@@ -116,37 +137,102 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <th class="colLast" scope="col">Field and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>(package private) byte[]</code></td>
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CF">CF</a></strong></code>&nbsp;</td>
+<td class="colFirst"><code>private static org.apache.hadoop.hbase.Cell[]</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CELL_GRID">CELL_GRID</a></strong></code>
+<div class="block">Five rows by four columns distinguished by column qualifier (column qualifier is one of the
+ four rows...</div>
+</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>private static int</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CELL_GRID_BLOCK2_BOUNDARY">CELL_GRID_BLOCK2_BOUNDARY</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static int</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CELL_GRID_BLOCK3_BOUNDARY">CELL_GRID_BLOCK3_BOUNDARY</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static int</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CELL_GRID_BLOCK4_BOUNDARY">CELL_GRID_BLOCK4_BOUNDARY</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static int</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CELL_GRID_BLOCK5_BOUNDARY">CELL_GRID_BLOCK5_BOUNDARY</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CF">CF</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>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="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CF_STR">CF_STR</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) static org.apache.hadoop.conf.Configuration</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#CONF">CONF</a></strong></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#FIVE">FIVE</a></strong></code>&nbsp;</td>
+</tr>
 <tr class="rowColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#FOUR">FOUR</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>private static org.apache.hadoop.hbase.KeyValue[]</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#kvs">kvs</a></strong></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static org.apache.commons.logging.Log</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#LOG">LOG</a></strong></code>&nbsp;</td>
+</tr>
 <tr class="altColor">
 <td class="colFirst"><code>org.junit.rules.TestName</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#name">name</a></strong></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#ONE">ONE</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>private org.apache.hadoop.hbase.regionserver.ScanInfo</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#scanInfo">scanInfo</a></strong></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private org.apache.hadoop.hbase.regionserver.ScanType</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#scanType">scanType</a></strong></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#THREE">THREE</a></strong></code>&nbsp;</td>
+</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>org.junit.rules.TestRule</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#timeout">timeout</a></strong></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#TWO">TWO</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#TWO_POINT_TWO">TWO_POINT_TWO</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#VALUE">VALUE</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#ZERO">ZERO</a></strong></code>
+<div class="block">From here on down, we have a bunch of defines and specific CELL_GRID of Cells.</div>
+</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#ZERO_POINT_ZERO">ZERO_POINT_ZERO</a></strong></code>&nbsp;</td>
+</tr>
 </table>
 </li>
 </ul>
@@ -225,34 +311,61 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testScannerReseekDoesntNPE()">testScannerReseekDoesntNPE</a></strong>()</code>&nbsp;</td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testFullRowGetDoesNotOverreadWhenRowInsideOneBlock()">testFullRowGetDoesNotOverreadWhenRowInsideOneBlock</a></strong>()</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testScanSameTimestamp()">testScanSameTimestamp</a></strong>()</code>&nbsp;</td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testFullRowSpansBlocks()">testFullRowSpansBlocks</a></strong>()</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testScanTimeRange()">testScanTimeRange</a></strong>()</code>&nbsp;</td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testOptimize()">testOptimize</a></strong>()</code>
+<div class="block">Test optimize in StoreScanner.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testSkipColumn()">testSkipColumn</a></strong>()</code>&nbsp;</td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testOptimizeAndGet()">testOptimizeAndGet</a></strong>()</code>
+<div class="block">Ensure the optimize Scan method in StoreScanner does not get in the way of a Get doing minimum
+ work...</div>
+</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testWildCardOneVersionScan()">testWildCardOneVersionScan</a></strong>()</code>&nbsp;</td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testOptimizeAndGetWithFakedNextBlockIndexStart()">testOptimizeAndGetWithFakedNextBlockIndexStart</a></strong>()</code>
+<div class="block">Ensure that optimize does not cause the Get to do more seeking than required.</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testWildCardScannerUnderDeletes()">testWildCardScannerUnderDeletes</a></strong>()</code>&nbsp;</td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testScannerReseekDoesntNPE()">testScannerReseekDoesntNPE</a></strong>()</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testWildCardTtlScan()">testWildCardTtlScan</a></strong>()</code>&nbsp;</td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testScanSameTimestamp()">testScanSameTimestamp</a></strong>()</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testScanTimeRange()">testScanTimeRange</a></strong>()</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testSkipColumn()">testSkipColumn</a></strong>()</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testWildCardOneVersionScan()">testWildCardOneVersionScan</a></strong>()</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testWildCardScannerUnderDeletes()">testWildCardScannerUnderDeletes</a></strong>()</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testWildCardTtlScan()">testWildCardTtlScan</a></strong>()</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#testWontNextToNext()">testWontNextToNext</a></strong>()</code>&nbsp;</td>
 </tr>
 </table>
@@ -277,13 +390,22 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <!--   -->
 </a>
 <h3>Field Detail</h3>
+<a name="LOG">
+<!--   -->
+</a>
+<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/regionserver/TestStoreScanner.html#line.62">LOG</a></pre>
+</li>
+</ul>
 <a name="name">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>name</h4>
-<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.56">name</a></pre>
+<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.63">name</a></pre>
 </li>
 </ul>
 <a name="timeout">
@@ -292,7 +414,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>timeout</h4>
-<pre>public final&nbsp;org.junit.rules.TestRule <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.57">timeout</a></pre>
+<pre>public final&nbsp;org.junit.rules.TestRule <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.64">timeout</a></pre>
 </li>
 </ul>
 <a name="CF_STR">
@@ -301,7 +423,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>CF_STR</h4>
-<pre>private static 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/regionserver/TestStoreScanner.html#line.59">CF_STR</a></pre>
+<pre>private static 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/regionserver/TestStoreScanner.html#line.66">CF_STR</a></pre>
 <dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestStoreScanner.CF_STR">Constant Field Values</a></dd></dl>
 </li>
 </ul>
@@ -311,7 +433,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>CF</h4>
-<pre>final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.60">CF</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.67">CF</a></pre>
 </li>
 </ul>
 <a name="CONF">
@@ -320,7 +442,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>CONF</h4>
-<pre>static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.61">CONF</a></pre>
+<pre>static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.68">CONF</a></pre>
 </li>
 </ul>
 <a name="scanInfo">
@@ -329,7 +451,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>scanInfo</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.ScanInfo <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.62">scanInfo</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.ScanInfo <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.69">scanInfo</a></pre>
 </li>
 </ul>
 <a name="scanType">
@@ -338,7 +460,147 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>scanType</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.ScanType <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.64">scanType</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.ScanType <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.71">scanType</a></pre>
+</li>
+</ul>
+<a name="ZERO">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>ZERO</h4>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.80">ZERO</a></pre>
+<div class="block">From here on down, we have a bunch of defines and specific CELL_GRID of Cells. The
+ CELL_GRID then has a Scanner that can fake out 'block' transitions. All this elaborate
+ setup is for tests that ensure we don't overread, and that the
+ <code>StoreScanner.optimize(org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode,
+ Cell)</code> is not overly enthusiastic.</div>
+</li>
+</ul>
+<a name="ZERO_POINT_ZERO">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>ZERO_POINT_ZERO</h4>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.81">ZERO_POINT_ZERO</a></pre>
+</li>
+</ul>
+<a name="ONE">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>ONE</h4>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.82">ONE</a></pre>
+</li>
+</ul>
+<a name="TWO">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>TWO</h4>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.83">TWO</a></pre>
+</li>
+</ul>
+<a name="TWO_POINT_TWO">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>TWO_POINT_TWO</h4>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.84">TWO_POINT_TWO</a></pre>
+</li>
+</ul>
+<a name="THREE">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>THREE</h4>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.85">THREE</a></pre>
+</li>
+</ul>
+<a name="FOUR">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>FOUR</h4>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.86">FOUR</a></pre>
+</li>
+</ul>
+<a name="FIVE">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>FIVE</h4>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.87">FIVE</a></pre>
+</li>
+</ul>
+<a name="VALUE">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>VALUE</h4>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.88">VALUE</a></pre>
+</li>
+</ul>
+<a name="CELL_GRID_BLOCK2_BOUNDARY">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>CELL_GRID_BLOCK2_BOUNDARY</h4>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.89">CELL_GRID_BLOCK2_BOUNDARY</a></pre>
+<dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestStoreScanner.CELL_GRID_BLOCK2_BOUNDARY">Constant Field Values</a></dd></dl>
+</li>
+</ul>
+<a name="CELL_GRID_BLOCK3_BOUNDARY">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>CELL_GRID_BLOCK3_BOUNDARY</h4>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.90">CELL_GRID_BLOCK3_BOUNDARY</a></pre>
+<dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestStoreScanner.CELL_GRID_BLOCK3_BOUNDARY">Constant Field Values</a></dd></dl>
+</li>
+</ul>
+<a name="CELL_GRID_BLOCK4_BOUNDARY">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>CELL_GRID_BLOCK4_BOUNDARY</h4>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.91">CELL_GRID_BLOCK4_BOUNDARY</a></pre>
+<dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestStoreScanner.CELL_GRID_BLOCK4_BOUNDARY">Constant Field Values</a></dd></dl>
+</li>
+</ul>
+<a name="CELL_GRID_BLOCK5_BOUNDARY">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>CELL_GRID_BLOCK5_BOUNDARY</h4>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.92">CELL_GRID_BLOCK5_BOUNDARY</a></pre>
+<dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestStoreScanner.CELL_GRID_BLOCK5_BOUNDARY">Constant Field Values</a></dd></dl>
+</li>
+</ul>
+<a name="CELL_GRID">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>CELL_GRID</h4>
+<pre>private static final&nbsp;org.apache.hadoop.hbase.Cell[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.101">CELL_GRID</a></pre>
+<div class="block">Five rows by four columns distinguished by column qualifier (column qualifier is one of the
+ four rows... ONE, TWO, etc.). Exceptions are a weird row after TWO; it is TWO_POINT_TWO.
+ And then row FOUR has five columns finishing w/ row FIVE having a single column.
+ We will use this to test scan does the right thing as it
+ we do Gets, StoreScanner#optimize, and what we do on (faked) block boundaries.</div>
 </li>
 </ul>
 <a name="kvs">
@@ -347,7 +609,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>kvs</h4>
-<pre>private static final&nbsp;org.apache.hadoop.hbase.KeyValue[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.394">kvs</a></pre>
+<pre>private static final&nbsp;org.apache.hadoop.hbase.KeyValue[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.636">kvs</a></pre>
 </li>
 </ul>
 </li>
@@ -364,7 +626,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestStoreScanner</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.55">TestStoreScanner</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.61">TestStoreScanner</a>()</pre>
 </li>
 </ul>
 </li>
@@ -381,7 +643,79 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getCols</h4>
-<pre><a href="http://docs.oracle.com/javase/7/docs/api/java/util/NavigableSet.html?is-external=true" title="class or interface in java.util">NavigableSet</a>&lt;byte[]&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.71">getCols</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;strCols)</pre>
+<pre><a href="http://docs.oracle.com/javase/7/docs/api/java/util/NavigableSet.html?is-external=true" title="class or interface in java.util">NavigableSet</a>&lt;byte[]&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.174">getCols</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;strCols)</pre>
+</li>
+</ul>
+<a name="testFullRowGetDoesNotOverreadWhenRowInsideOneBlock()">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testFullRowGetDoesNotOverreadWhenRowInsideOneBlock</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.184">testFullRowGetDoesNotOverreadWhenRowInsideOneBlock</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>
+</li>
+</ul>
+<a name="testFullRowSpansBlocks()">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testFullRowSpansBlocks</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.209">testFullRowSpansBlocks</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>
+</li>
+</ul>
+<a name="testOptimize()">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testOptimize</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.238">testOptimize</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">Test optimize in StoreScanner. Test that we skip to the next 'block' when we it makes sense
+ reading the block 'index'.</div>
+<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>
+</li>
+</ul>
+<a name="testOptimizeAndGet()">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testOptimizeAndGet</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.269">testOptimizeAndGet</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">Ensure the optimize Scan method in StoreScanner does not get in the way of a Get doing minimum
+ work... seeking to start of block and then SKIPPING until we find the wanted Cell.
+ This 'simple' scenario mimics case of all Cells fitting inside a single HFileBlock.
+ See HBASE-15392. This test is a little cryptic. Takes a bit of staring to figure what it up to.</div>
+<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>
+</li>
+</ul>
+<a name="testOptimizeAndGetWithFakedNextBlockIndexStart()">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testOptimizeAndGetWithFakedNextBlockIndexStart</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.301">testOptimizeAndGetWithFakedNextBlockIndexStart</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">Ensure that optimize does not cause the Get to do more seeking than required. Optimize
+ (see HBASE-15392) was causing us to seek all Cells in a block when a Get Scan if the next block
+ index/start key was a different row to the current one. A bug. We'd call next too often
+ because we had to exhaust all Cells in the current row making us load the next block just to
+ discard what we read there. This test is a little cryptic. Takes a bit of staring to figure
+ what it up to.</div>
+<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>
 </li>
 </ul>
 <a name="testScanTimeRange()">
@@ -390,7 +724,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanTimeRange</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.81">testScanTimeRange</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.323">testScanTimeRange</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>
@@ -402,7 +736,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanSameTimestamp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.140">testScanSameTimestamp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.382">testScanSameTimestamp</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>
@@ -414,7 +748,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testWontNextToNext</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.170">testWontNextToNext</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.412">testWontNextToNext</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>
@@ -426,7 +760,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteVersionSameTimestamp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.202">testDeleteVersionSameTimestamp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.444">testDeleteVersionSameTimestamp</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>
@@ -438,7 +772,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeletedRowThenGoodRow</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.222">testDeletedRowThenGoodRow</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.464">testDeletedRowThenGoodRow</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>
@@ -450,7 +784,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteVersionMaskingMultiplePuts</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.244">testDeleteVersionMaskingMultiplePuts</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.486">testDeleteVersionMaskingMultiplePuts</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>
@@ -462,7 +796,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteVersionsMixedAndMultipleVersionReturn</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.268">testDeleteVersionsMixedAndMultipleVersionReturn</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.510">testDeleteVersionsMixedAndMultipleVersionReturn</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>
@@ -474,7 +808,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testWildCardOneVersionScan</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.294">testWildCardOneVersionScan</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.536">testWildCardOneVersionScan</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>
@@ -486,7 +820,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testWildCardScannerUnderDeletes</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.312">testWildCardScannerUnderDeletes</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.554">testWildCardScannerUnderDeletes</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>
@@ -498,7 +832,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteFamily</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.346">testDeleteFamily</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.588">testDeleteFamily</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>
@@ -510,7 +844,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteColumn</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.377">testDeleteColumn</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.619">testDeleteColumn</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>
@@ -522,7 +856,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testSkipColumn</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.408">testSkipColumn</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.650">testSkipColumn</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>
@@ -534,7 +868,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testWildCardTtlScan</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.433">testWildCardTtlScan</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.675">testWildCardTtlScan</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>
@@ -546,7 +880,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testScannerReseekDoesntNPE</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.471">testScannerReseekDoesntNPE</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.713">testScannerReseekDoesntNPE</a>()
                                 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>
@@ -558,7 +892,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>SKIP_testPeek</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.492">SKIP_testPeek</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.734">SKIP_testPeek</a>()
                    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">TODO this fails, since we don't handle deletions, etc, in peek</div>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -571,7 +905,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>testExpiredDeleteFamily</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.509">testExpiredDeleteFamily</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.751">testExpiredDeleteFamily</a>()
                              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">Ensure that expired delete family markers don't override valid puts</div>
 <dl><dt><span class="strong">Throws:</span></dt>
@@ -584,7 +918,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testDeleteMarkerLongevity</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.538">testDeleteMarkerLongevity</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestStoreScanner.html#line.780">testDeleteMarkerLongevity</a>()
                                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>
@@ -617,7 +951,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreFileScannerWithTagCompression.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Prev Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStripeCompactor.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Next Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Next Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" target="_top">Frames</a></li>
@@ -641,7 +975,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <div>
 <ul class="subNavList">
 <li>Summary:&nbsp;</li>
-<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#nested_class_summary">Nested</a>&nbsp;|&nbsp;</li>
 <li><a href="#field_summary">Field</a>&nbsp;|&nbsp;</li>
 <li><a href="#constructor_summary">Constr</a>&nbsp;|&nbsp;</li>
 <li><a href="#method_summary">Method</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestStripeCompactor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestStripeCompactor.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestStripeCompactor.html
index 89f7fd7..7f6878e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestStripeCompactor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestStripeCompactor.html
@@ -35,7 +35,7 @@
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Prev Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Prev Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStripeCompactor.Scanner.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Next Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -555,7 +555,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Prev Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Prev Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestStripeCompactor.Scanner.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Next Class</span></a></li>
 </ul>
 <ul class="navList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTimeRangeTracker.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTimeRangeTracker.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTimeRangeTracker.html
index 5d74148..cc5a9a8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTimeRangeTracker.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTimeRangeTracker.html
@@ -36,7 +36,7 @@
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Prev Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALLockup.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Next Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Next Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/regionserver/TestTimeRangeTracker.html" target="_top">Frames</a></li>
@@ -266,7 +266,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Prev Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALLockup.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Next Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Next Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/regionserver/TestTimeRangeTracker.html" target="_top">Frames</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html
new file mode 100644
index 0000000..86cffd4
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html
@@ -0,0 +1,448 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>TestTimestampFilterSeekHint (Apache HBase 2.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<script type="text/javascript"><!--
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="TestTimestampFilterSeekHint (Apache HBase 2.0.0-SNAPSHOT Test API)";
+    }
+//-->
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar_top">
+<!--   -->
+</a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestTimestampFilterSeekHint.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimeRangeTracker.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Prev Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALLockup.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Next Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" target="_top">Frames</a></li>
+<li><a href="TestTimestampFilterSeekHint.html" target="_top">No Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../allclasses-noframe.html">All Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#field_summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor_summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method_summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field_detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor_detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method_detail">Method</a></li>
+</ul>
+</div>
+<a name="skip-navbar_top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.regionserver</div>
+<h2 title="Class TestTimestampFilterSeekHint" class="title">Class TestTimestampFilterSeekHint</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.regionserver.TestTimestampFilterSeekHint</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<hr>
+<br>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#line.40">TestTimestampFilterSeekHint</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>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field_summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
+<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private 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/regionserver/TestTimestampFilterSeekHint.html#FAMILY">FAMILY</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#FAMILY_BYTES">FAMILY_BYTES</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static int</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#MAX_VERSIONS">MAX_VERSIONS</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>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="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#QUAL">QUAL</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#QUAL_BYTES">QUAL_BYTES</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private org.apache.hadoop.hbase.regionserver.HRegion</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#region">region</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private int</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#regionCount">regionCount</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>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="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#RK">RK</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#RK_BYTES">RK_BYTES</a></strong></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#TEST_UTIL">TEST_UTIL</a></strong></code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor_summary">
+<!--   -->
+</a>
+<h3>Constructor Summary</h3>
+<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
+<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#TestTimestampFilterSeekHint()">TestTimestampFilterSeekHint</a></strong>()</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method_summary">
+<!--   -->
+</a>
+<h3>Method Summary</h3>
+<table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
+<caption><span>Methods</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#prepareRegion()">prepareRegion</a></strong>()</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#testGetDoesntSeekWithNoHint()">testGetDoesntSeekWithNoHint</a></strong>()</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#testGetSeek()">testGetSeek</a></strong>()</code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods_inherited_from_class_java.lang.Object">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;java.lang.<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></h3>
+<code><a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#clone()" title="class or interface in java.lang">clone</a>, <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>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#finalize()" title="class or interface in java.lang">finalize</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang">getClass</a>, <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>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#notify()" title="class or interface in java.lang">notify</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang
 /Object.html?is-external=true#notifyAll()" title="class or interface in java.lang">notifyAll</a>, <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>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#wait()" title="class or interface in java.lang">wait</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#wait(long)" title="class or interface in java.lang">wait</a>, <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?is-external=true#wait(long,%20int)" title="class or interface in java.lang">wait</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="details">
+<ul class="blockList">
+<li class="blockList">
+<!-- ============ FIELD DETAIL =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field_detail">
+<!--   -->
+</a>
+<h3>Field Detail</h3>
+<a name="TEST_UTIL">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>TEST_UTIL</h4>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#line.42">TEST_UTIL</a></pre>
+</li>
+</ul>
+<a name="RK">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>RK</h4>
+<pre>private static 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/regionserver/TestTimestampFilterSeekHint.html#line.43">RK</a></pre>
+<dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestTimestampFilterSeekHint.RK">Constant Field Values</a></dd></dl>
+</li>
+</ul>
+<a name="RK_BYTES">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>RK_BYTES</h4>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#line.44">RK_BYTES</a></pre>
+</li>
+</ul>
+<a name="FAMILY">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>FAMILY</h4>
+<pre>private static 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/regionserver/TestTimestampFilterSeekHint.html#line.46">FAMILY</a></pre>
+<dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestTimestampFilterSeekHint.FAMILY">Constant Field Values</a></dd></dl>
+</li>
+</ul>
+<a name="FAMILY_BYTES">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>FAMILY_BYTES</h4>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#line.47">FAMILY_BYTES</a></pre>
+</li>
+</ul>
+<a name="QUAL">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>QUAL</h4>
+<pre>private static 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/regionserver/TestTimestampFilterSeekHint.html#line.49">QUAL</a></pre>
+<dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestTimestampFilterSeekHint.QUAL">Constant Field Values</a></dd></dl>
+</li>
+</ul>
+<a name="QUAL_BYTES">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>QUAL_BYTES</h4>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#line.50">QUAL_BYTES</a></pre>
+</li>
+</ul>
+<a name="MAX_VERSIONS">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>MAX_VERSIONS</h4>
+<pre>public static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#line.52">MAX_VERSIONS</a></pre>
+<dl><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestTimestampFilterSeekHint.MAX_VERSIONS">Constant Field Values</a></dd></dl>
+</li>
+</ul>
+<a name="region">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>region</h4>
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#line.53">region</a></pre>
+</li>
+</ul>
+<a name="regionCount">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>regionCount</h4>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#line.54">regionCount</a></pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor_detail">
+<!--   -->
+</a>
+<h3>Constructor Detail</h3>
+<a name="TestTimestampFilterSeekHint()">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TestTimestampFilterSeekHint</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#line.40">TestTimestampFilterSeekHint</a>()</pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method_detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="testGetSeek()">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testGetSeek</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#line.57">testGetSeek</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>
+</li>
+</ul>
+<a name="testGetDoesntSeekWithNoHint()">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testGetDoesntSeekWithNoHint</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#line.76">testGetDoesntSeekWithNoHint</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>
+</li>
+</ul>
+<a name="prepareRegion()">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>prepareRegion</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html#line.91">prepareRegion</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>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar_bottom">
+<!--   -->
+</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestTimestampFilterSeekHint.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimeRangeTracker.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Prev Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWALLockup.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Next Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" target="_top">Frames</a></li>
+<li><a href="TestTimestampFilterSeekHint.html" target="_top">No Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../allclasses-noframe.html">All Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#field_summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor_summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method_summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field_detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor_detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method_detail">Method</a></li>
+</ul>
+</div>
+<a name="skip-navbar_bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2016 <a href="http://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALLockup.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALLockup.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALLockup.html
index 0731b53..8611912 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALLockup.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALLockup.html
@@ -35,7 +35,7 @@
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimeRangeTracker.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Prev Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Prev Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWideScanner.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Next Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -433,7 +433,7 @@ extends <a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html?
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimeRangeTracker.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Prev Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Prev Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestWideScanner.html" title="class in org.apache.hadoop.hbase.regionserver"><span class="strong">Next Class</span></a></li>
 </ul>
 <ul class="navList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/org/apache/hadoop/hbase/regionserver/class-use/TestStoreScanner.CellGridStoreScanner.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/class-use/TestStoreScanner.CellGridStoreScanner.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/class-use/TestStoreScanner.CellGridStoreScanner.html
new file mode 100644
index 0000000..efbedeb
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/class-use/TestStoreScanner.CellGridStoreScanner.html
@@ -0,0 +1,115 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Uses of Class org.apache.hadoop.hbase.regionserver.TestStoreScanner.CellGridStoreScanner (Apache HBase 2.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<script type="text/javascript"><!--
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Class org.apache.hadoop.hbase.regionserver.TestStoreScanner.CellGridStoreScanner (Apache HBase 2.0.0-SNAPSHOT Test API)";
+    }
+//-->
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar_top">
+<!--   -->
+</a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/regionserver/class-use/TestStoreScanner.CellGridStoreScanner.html" target="_top">Frames</a></li>
+<li><a href="TestStoreScanner.CellGridStoreScanner.html" target="_top">No Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../allclasses-noframe.html">All Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip-navbar_top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<div class="header">
+<h2 title="Uses of Class org.apache.hadoop.hbase.regionserver.TestStoreScanner.CellGridStoreScanner" class="title">Uses of Class<br>org.apache.hadoop.hbase.regionserver.TestStoreScanner.CellGridStoreScanner</h2>
+</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.regionserver.TestStoreScanner.CellGridStoreScanner</div>
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar_bottom">
+<!--   -->
+</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/TestStoreScanner.CellGridStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/regionserver/class-use/TestStoreScanner.CellGridStoreScanner.html" target="_top">Frames</a></li>
+<li><a href="TestStoreScanner.CellGridStoreScanner.html" target="_top">No Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../allclasses-noframe.html">All Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip-navbar_bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2016 <a href="http://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>


[30/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html
index 9e42ac9..054df6f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/MetricsConnection.RegionStats.html
@@ -71,411 +71,413 @@
 <span class="sourceLineNo">063</span>  private static final String MEMLOAD_BASE = "memstoreLoad_";<a name="line.63"></a>
 <span class="sourceLineNo">064</span>  private static final String HEAP_BASE = "heapOccupancy_";<a name="line.64"></a>
 <span class="sourceLineNo">065</span>  private static final String CACHE_BASE = "cacheDroppingExceptions_";<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  private static final String CLIENT_SVC = ClientService.getDescriptor().getName();<a name="line.66"></a>
-<span class="sourceLineNo">067</span><a name="line.67"></a>
-<span class="sourceLineNo">068</span>  /** A container class for collecting details about the RPC call as it percolates. */<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  public static class CallStats {<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    private long requestSizeBytes = 0;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    private long responseSizeBytes = 0;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    private long startTime = 0;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    private long callTimeMs = 0;<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>    public long getRequestSizeBytes() {<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      return requestSizeBytes;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    }<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public void setRequestSizeBytes(long requestSizeBytes) {<a name="line.79"></a>
-<span class="sourceLineNo">080</span>      this.requestSizeBytes = requestSizeBytes;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    }<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>    public long getResponseSizeBytes() {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      return responseSizeBytes;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    }<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>    public void setResponseSizeBytes(long responseSizeBytes) {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      this.responseSizeBytes = responseSizeBytes;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    }<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>    public long getStartTime() {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      return startTime;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>    public void setStartTime(long startTime) {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>      this.startTime = startTime;<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>    public long getCallTimeMs() {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      return callTimeMs;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    }<a name="line.101"></a>
-<span class="sourceLineNo">102</span><a name="line.102"></a>
-<span class="sourceLineNo">103</span>    public void setCallTimeMs(long callTimeMs) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      this.callTimeMs = callTimeMs;<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><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  @VisibleForTesting<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  protected static final class CallTracker {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    private final String name;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    @VisibleForTesting final Timer callTimer;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    @VisibleForTesting final Histogram reqHist;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    @VisibleForTesting final Histogram respHist;<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    private CallTracker(MetricRegistry registry, String name, String subName, String scope) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      StringBuilder sb = new StringBuilder(CLIENT_SVC).append("_").append(name);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      if (subName != null) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        sb.append("(").append(subName).append(")");<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      }<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      this.name = sb.toString();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      this.callTimer = registry.timer(name(MetricsConnection.class,<a name="line.121"></a>
-<span class="sourceLineNo">122</span>        DRTN_BASE + this.name, scope));<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      this.reqHist = registry.histogram(name(MetricsConnection.class,<a name="line.123"></a>
-<span class="sourceLineNo">124</span>        REQ_BASE + this.name, scope));<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      this.respHist = registry.histogram(name(MetricsConnection.class,<a name="line.125"></a>
-<span class="sourceLineNo">126</span>        RESP_BASE + this.name, scope));<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>    private CallTracker(MetricRegistry registry, String name, String scope) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      this(registry, name, null, scope);<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>    public void updateRpc(CallStats stats) {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      this.callTimer.update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      this.reqHist.update(stats.getRequestSizeBytes());<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      this.respHist.update(stats.getResponseSizeBytes());<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>    @Override<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    public String toString() {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      return "CallTracker:" + name;<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>  protected static class RegionStats {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    final String name;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    final Histogram memstoreLoadHist;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    final Histogram heapOccupancyHist;<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>    public RegionStats(MetricRegistry registry, String name) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      this.name = name;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      this.memstoreLoadHist = registry.histogram(name(MetricsConnection.class,<a name="line.152"></a>
-<span class="sourceLineNo">153</span>          MEMLOAD_BASE + this.name));<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      this.heapOccupancyHist = registry.histogram(name(MetricsConnection.class,<a name="line.154"></a>
-<span class="sourceLineNo">155</span>          HEAP_BASE + this.name));<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>    public void update(ClientProtos.RegionLoadStats regionStatistics) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      this.memstoreLoadHist.update(regionStatistics.getMemstoreLoad());<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      this.heapOccupancyHist.update(regionStatistics.getHeapOccupancy());<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    }<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>  protected static class RunnerStats {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    final Counter normalRunners;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    final Counter delayRunners;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    final Histogram delayIntevalHist;<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>    public RunnerStats(MetricRegistry registry) {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      this.normalRunners = registry.counter(<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        name(MetricsConnection.class, "normalRunnersCount"));<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      this.delayRunners = registry.counter(<a name="line.173"></a>
-<span class="sourceLineNo">174</span>        name(MetricsConnection.class, "delayRunnersCount"));<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      this.delayIntevalHist = registry.histogram(<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        name(MetricsConnection.class, "delayIntervalHist"));<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    public void incrNormalRunners() {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      this.normalRunners.inc();<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>    public void incrDelayRunners() {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      this.delayRunners.inc();<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>    public void updateDelayInterval(long interval) {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      this.delayIntevalHist.update(interval);<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><a name="line.191"></a>
-<span class="sourceLineNo">192</span>  @VisibleForTesting<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  protected ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt; serverStats<a name="line.193"></a>
-<span class="sourceLineNo">194</span>          = new ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt;();<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>  public void updateServerStats(ServerName serverName, byte[] regionName,<a name="line.196"></a>
-<span class="sourceLineNo">197</span>                                Object r) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    if (!(r instanceof Result)) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      return;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    Result result = (Result) r;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    ClientProtos.RegionLoadStats stats = result.getStats();<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    if (stats == null) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      return;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    updateRegionStats(serverName, regionName, stats);<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>  @Override<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  public void updateRegionStats(ServerName serverName, byte[] regionName,<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    ClientProtos.RegionLoadStats stats) {<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    String name = serverName.getServerName() + "," + Bytes.toStringBinary(regionName);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    ConcurrentMap&lt;byte[], RegionStats&gt; rsStats = null;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    if (serverStats.containsKey(serverName)) {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      rsStats = serverStats.get(serverName);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    } else {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      rsStats = serverStats.putIfAbsent(serverName,<a name="line.217"></a>
-<span class="sourceLineNo">218</span>          new ConcurrentSkipListMap&lt;byte[], RegionStats&gt;(Bytes.BYTES_COMPARATOR));<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      if (rsStats == null) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        rsStats = serverStats.get(serverName);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    RegionStats regionStats = null;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    if (rsStats.containsKey(regionName)) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      regionStats = rsStats.get(regionName);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    } else {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      regionStats = rsStats.putIfAbsent(regionName, new RegionStats(this.registry, name));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      if (regionStats == null) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>        regionStats = rsStats.get(regionName);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      }<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    regionStats.update(stats);<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">066</span>  private static final String UNKNOWN_EXCEPTION = "UnknownException";<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  private static final String CLIENT_SVC = ClientService.getDescriptor().getName();<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>  /** A container class for collecting details about the RPC call as it percolates. */<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  public static class CallStats {<a name="line.70"></a>
+<span class="sourceLineNo">071</span>    private long requestSizeBytes = 0;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>    private long responseSizeBytes = 0;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    private long startTime = 0;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    private long callTimeMs = 0;<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>    public long getRequestSizeBytes() {<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      return requestSizeBytes;<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>    public void setRequestSizeBytes(long requestSizeBytes) {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>      this.requestSizeBytes = requestSizeBytes;<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>    public long getResponseSizeBytes() {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      return responseSizeBytes;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    }<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>    public void setResponseSizeBytes(long responseSizeBytes) {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      this.responseSizeBytes = responseSizeBytes;<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">092</span>    public long getStartTime() {<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      return startTime;<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>    public void setStartTime(long startTime) {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      this.startTime = startTime;<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>    public long getCallTimeMs() {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>      return callTimeMs;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>    public void setCallTimeMs(long callTimeMs) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>      this.callTimeMs = callTimeMs;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    }<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  }<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  @VisibleForTesting<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  protected static final class CallTracker {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    private final String name;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    @VisibleForTesting final Timer callTimer;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    @VisibleForTesting final Histogram reqHist;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    @VisibleForTesting final Histogram respHist;<a name="line.114"></a>
+<span class="sourceLineNo">115</span><a name="line.115"></a>
+<span class="sourceLineNo">116</span>    private CallTracker(MetricRegistry registry, String name, String subName, String scope) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      StringBuilder sb = new StringBuilder(CLIENT_SVC).append("_").append(name);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      if (subName != null) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>        sb.append("(").append(subName).append(")");<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      }<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      this.name = sb.toString();<a name="line.121"></a>
+<span class="sourceLineNo">122</span>      this.callTimer = registry.timer(name(MetricsConnection.class,<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        DRTN_BASE + this.name, scope));<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      this.reqHist = registry.histogram(name(MetricsConnection.class,<a name="line.124"></a>
+<span class="sourceLineNo">125</span>        REQ_BASE + this.name, scope));<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      this.respHist = registry.histogram(name(MetricsConnection.class,<a name="line.126"></a>
+<span class="sourceLineNo">127</span>        RESP_BASE + this.name, scope));<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>    private CallTracker(MetricRegistry registry, String name, String scope) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      this(registry, name, null, scope);<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>    public void updateRpc(CallStats stats) {<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      this.callTimer.update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      this.reqHist.update(stats.getRequestSizeBytes());<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      this.respHist.update(stats.getResponseSizeBytes());<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>    @Override<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    public String toString() {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      return "CallTracker:" + name;<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><a name="line.145"></a>
+<span class="sourceLineNo">146</span>  protected static class RegionStats {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    final String name;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    final Histogram memstoreLoadHist;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    final Histogram heapOccupancyHist;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>    public RegionStats(MetricRegistry registry, String name) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      this.name = name;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      this.memstoreLoadHist = registry.histogram(name(MetricsConnection.class,<a name="line.153"></a>
+<span class="sourceLineNo">154</span>          MEMLOAD_BASE + this.name));<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      this.heapOccupancyHist = registry.histogram(name(MetricsConnection.class,<a name="line.155"></a>
+<span class="sourceLineNo">156</span>          HEAP_BASE + this.name));<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>    public void update(ClientProtos.RegionLoadStats regionStatistics) {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      this.memstoreLoadHist.update(regionStatistics.getMemstoreLoad());<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      this.heapOccupancyHist.update(regionStatistics.getHeapOccupancy());<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><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  @VisibleForTesting<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  protected static class RunnerStats {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    final Counter normalRunners;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    final Counter delayRunners;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    final Histogram delayIntevalHist;<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    public RunnerStats(MetricRegistry registry) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      this.normalRunners = registry.counter(<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        name(MetricsConnection.class, "normalRunnersCount"));<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      this.delayRunners = registry.counter(<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        name(MetricsConnection.class, "delayRunnersCount"));<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      this.delayIntevalHist = registry.histogram(<a name="line.176"></a>
+<span class="sourceLineNo">177</span>        name(MetricsConnection.class, "delayIntervalHist"));<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    }<a name="line.178"></a>
+<span class="sourceLineNo">179</span><a name="line.179"></a>
+<span class="sourceLineNo">180</span>    public void incrNormalRunners() {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      this.normalRunners.inc();<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
+<span class="sourceLineNo">183</span><a name="line.183"></a>
+<span class="sourceLineNo">184</span>    public void incrDelayRunners() {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      this.delayRunners.inc();<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    }<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>    public void updateDelayInterval(long interval) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      this.delayIntevalHist.update(interval);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  }<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>  @VisibleForTesting<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  protected ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt; serverStats<a name="line.194"></a>
+<span class="sourceLineNo">195</span>          = new ConcurrentHashMap&lt;ServerName, ConcurrentMap&lt;byte[], RegionStats&gt;&gt;();<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>  public void updateServerStats(ServerName serverName, byte[] regionName,<a name="line.197"></a>
+<span class="sourceLineNo">198</span>                                Object r) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    if (!(r instanceof Result)) {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      return;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    }<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    Result result = (Result) r;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    ClientProtos.RegionLoadStats stats = result.getStats();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    if (stats == null) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      return;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    updateRegionStats(serverName, regionName, stats);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  @Override<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  public void updateRegionStats(ServerName serverName, byte[] regionName,<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ClientProtos.RegionLoadStats stats) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    String name = serverName.getServerName() + "," + Bytes.toStringBinary(regionName);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    ConcurrentMap&lt;byte[], RegionStats&gt; rsStats = null;<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    if (serverStats.containsKey(serverName)) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      rsStats = serverStats.get(serverName);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    } else {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      rsStats = serverStats.putIfAbsent(serverName,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>          new ConcurrentSkipListMap&lt;byte[], RegionStats&gt;(Bytes.BYTES_COMPARATOR));<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      if (rsStats == null) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        rsStats = serverStats.get(serverName);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    RegionStats regionStats = null;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    if (rsStats.containsKey(regionName)) {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      regionStats = rsStats.get(regionName);<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    } else {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      regionStats = rsStats.putIfAbsent(regionName, new RegionStats(this.registry, name));<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      if (regionStats == null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        regionStats = rsStats.get(regionName);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      }<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    regionStats.update(stats);<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>  /** A lambda for dispatching to the appropriate metric factory method */<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  private static interface NewMetric&lt;T&gt; {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    T newMetric(Class&lt;?&gt; clazz, String name, String scope);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>  /** Anticipated number of metric entries */<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  private static final int CAPACITY = 50;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>  /** Default load factor from {@link java.util.HashMap#DEFAULT_LOAD_FACTOR} */<a name="line.243"></a>
-<span class="sourceLineNo">244</span>  private static final float LOAD_FACTOR = 0.75f;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /**<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * Anticipated number of concurrent accessor threads, from<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * {@link ConnectionImplementation#getBatchPool()}<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   */<a name="line.248"></a>
-<span class="sourceLineNo">249</span>  private static final int CONCURRENCY_LEVEL = 256;<a name="line.249"></a>
-<span class="sourceLineNo">250</span><a name="line.250"></a>
-<span class="sourceLineNo">251</span>  private final MetricRegistry registry;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>  private final JmxReporter reporter;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  private final String scope;<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private final NewMetric&lt;Timer&gt; timerFactory = new NewMetric&lt;Timer&gt;() {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    @Override public Timer newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      return registry.timer(name(clazz, name, scope));<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>  private final NewMetric&lt;Histogram&gt; histogramFactory = new NewMetric&lt;Histogram&gt;() {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    @Override public Histogram newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      return registry.histogram(name(clazz, name, scope));<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  };<a name="line.265"></a>
-<span class="sourceLineNo">266</span><a name="line.266"></a>
-<span class="sourceLineNo">267</span>  private final NewMetric&lt;Counter&gt; counterFactory = new NewMetric&lt;Counter&gt;() {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    @Override public Counter newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      return registry.counter(name(clazz, name, scope));<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  };<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  // static metrics<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>  @VisibleForTesting protected final Counter metaCacheHits;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  @VisibleForTesting protected final Counter metaCacheMisses;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  @VisibleForTesting protected final CallTracker getTracker;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @VisibleForTesting protected final CallTracker scanTracker;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  @VisibleForTesting protected final CallTracker appendTracker;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  @VisibleForTesting protected final CallTracker deleteTracker;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  @VisibleForTesting protected final CallTracker incrementTracker;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  @VisibleForTesting protected final CallTracker putTracker;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  @VisibleForTesting protected final CallTracker multiTracker;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  @VisibleForTesting protected final RunnerStats runnerStats;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  private final Counter metaCacheNumClearServer;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  private final Counter metaCacheNumClearRegion;<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // dynamic metrics<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>  // These maps are used to cache references to the metric instances that are managed by the<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // registry. I don't think their use perfectly removes redundant allocations, but it's<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  // a big improvement over calling registry.newMetric each time.<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Timer&gt; rpcTimers =<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Histogram&gt; rpcHistograms =<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY * 2 /* tracking both request and response sizes */,<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  private final ConcurrentMap&lt;String, Counter&gt; cacheDroppingExceptions =<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.299"></a>
-<span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>  public MetricsConnection(final ConnectionImplementation conn) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    this.scope = conn.toString();<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    this.registry = new MetricRegistry();<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    final ThreadPoolExecutor batchPool = (ThreadPoolExecutor) conn.getCurrentBatchPool();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    final ThreadPoolExecutor metaPool = (ThreadPoolExecutor) conn.getCurrentMetaLookupPool();<a name="line.305"></a>
-<span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>    this.registry.register(name(this.getClass(), "executorPoolActiveThreads", scope),<a name="line.307"></a>
-<span class="sourceLineNo">308</span>        new RatioGauge() {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>          @Override<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          protected Ratio getRatio() {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>            return Ratio.of(batchPool.getActiveCount(), batchPool.getMaximumPoolSize());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          }<a name="line.312"></a>
-<span class="sourceLineNo">313</span>        });<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    this.registry.register(name(this.getClass(), "metaPoolActiveThreads", scope),<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        new RatioGauge() {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>          @Override<a name="line.316"></a>
-<span class="sourceLineNo">317</span>          protected Ratio getRatio() {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>            return Ratio.of(metaPool.getActiveCount(), metaPool.getMaximumPoolSize());<a name="line.318"></a>
-<span class="sourceLineNo">319</span>          }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        });<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    this.metaCacheHits = registry.counter(name(this.getClass(), "metaCacheHits", scope));<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    this.metaCacheMisses = registry.counter(name(this.getClass(), "metaCacheMisses", scope));<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    this.metaCacheNumClearServer = registry.counter(name(this.getClass(),<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      "metaCacheNumClearServer", scope));<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    this.metaCacheNumClearRegion = registry.counter(name(this.getClass(),<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      "metaCacheNumClearRegion", scope));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    this.getTracker = new CallTracker(this.registry, "Get", scope);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    this.scanTracker = new CallTracker(this.registry, "Scan", scope);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    this.appendTracker = new CallTracker(this.registry, "Mutate", "Append", scope);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    this.deleteTracker = new CallTracker(this.registry, "Mutate", "Delete", scope);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    this.incrementTracker = new CallTracker(this.registry, "Mutate", "Increment", scope);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    this.putTracker = new CallTracker(this.registry, "Mutate", "Put", scope);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    this.multiTracker = new CallTracker(this.registry, "Multi", scope);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    this.runnerStats = new RunnerStats(this.registry);<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    this.reporter = JmxReporter.forRegistry(this.registry).build();<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    this.reporter.start();<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>  public void shutdown() {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    this.reporter.stop();<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>  /** Produce an instance of {@link CallStats} for clients to attach to RPCs. */<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  public static CallStats newCallStats() {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    // TODO: instance pool to reduce GC?<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    return new CallStats();<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">350</span>  /** Increment the number of meta cache hits. */<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  public void incrMetaCacheHit() {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    metaCacheHits.inc();<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>  /** Increment the number of meta cache misses. */<a name="line.355"></a>
-<span class="sourceLineNo">356</span>  public void incrMetaCacheMiss() {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    metaCacheMisses.inc();<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>  /** Increment the number of meta cache drops requested for entire RegionServer. */<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  public void incrMetaCacheNumClearServer() {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    metaCacheNumClearServer.inc();<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>  /** Increment the number of meta cache drops requested for individual region. */<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  public void incrMetaCacheNumClearRegion() {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    metaCacheNumClearRegion.inc();<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  /** Increment the number of normal runner counts. */<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  public void incrNormalRunners() {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    this.runnerStats.incrNormalRunners();<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>  /** Increment the number of delay runner counts. */<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  public void incrDelayRunners() {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    this.runnerStats.incrDelayRunners();<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>  /** Update delay interval of delay runner. */<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  public void updateDelayInterval(long interval) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    this.runnerStats.updateDelayInterval(interval);<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>   * Get a metric for {@code key} from {@code map}, or create it with {@code factory}.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>   */<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  private &lt;T&gt; T getMetric(String key, ConcurrentMap&lt;String, T&gt; map, NewMetric&lt;T&gt; factory) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    T t = map.get(key);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    if (t == null) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      t = factory.newMetric(this.getClass(), key, scope);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      T tmp = map.putIfAbsent(key, t);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      t = (tmp == null) ? t : tmp;<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    }<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    return t;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  }<a name="line.396"></a>
-<span class="sourceLineNo">397</span><a name="line.397"></a>
-<span class="sourceLineNo">398</span>  /** Update call stats for non-critical-path methods */<a name="line.398"></a>
-<span class="sourceLineNo">399</span>  private void updateRpcGeneric(MethodDescriptor method, CallStats stats) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    final String methodName = method.getService().getName() + "_" + method.getName();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    getMetric(DRTN_BASE + methodName, rpcTimers, timerFactory)<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        .update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    getMetric(REQ_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        .update(stats.getRequestSizeBytes());<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    getMetric(RESP_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.405"></a>
-<span class="sourceLineNo">406</span>        .update(stats.getResponseSizeBytes());<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>  /** Report RPC context to metrics system. */<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  public void updateRpc(MethodDescriptor method, Message param, CallStats stats) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // this implementation is tied directly to protobuf implementation details. would be better<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    // if we could dispatch based on something static, ie, request Message type.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    if (method.getService() == ClientService.getDescriptor()) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      switch(method.getIndex()) {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>      case 0:<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        assert "Get".equals(method.getName());<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        getTracker.updateRpc(stats);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        return;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      case 1:<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        assert "Mutate".equals(method.getName());<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        final MutationType mutationType = ((MutateRequest) param).getMutation().getMutateType();<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        switch(mutationType) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        case APPEND:<a name="line.423"></a>
-<span class="sourceLineNo">424</span>          appendTracker.updateRpc(stats);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          return;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        case DELETE:<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          deleteTracker.updateRpc(stats);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          return;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        case INCREMENT:<a name="line.429"></a>
-<span class="sourceLineNo">430</span>          incrementTracker.updateRpc(stats);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>          return;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        case PUT:<a name="line.432"></a>
-<span class="sourceLineNo">433</span>          putTracker.updateRpc(stats);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>          return;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        default:<a name="line.435"></a>
-<span class="sourceLineNo">436</span>          throw new RuntimeException("Unrecognized mutation type " + mutationType);<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        }<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      case 2:<a name="line.438"></a>
-<span class="sourceLineNo">439</span>        assert "Scan".equals(method.getName());<a name="line.439"></a>
-<span class="sourceLineNo">440</span>        scanTracker.updateRpc(stats);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>        return;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      case 3:<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        assert "BulkLoadHFile".equals(method.getName());<a name="line.443"></a>
-<span class="sourceLineNo">444</span>        // use generic implementation<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        break;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      case 4:<a name="line.446"></a>
-<span class="sourceLineNo">447</span>        assert "ExecService".equals(method.getName());<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        // use generic implementation<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        break;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      case 5:<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        assert "ExecRegionServerService".equals(method.getName());<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        // use generic implementation<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        break;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      case 6:<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        assert "Multi".equals(method.getName());<a name="line.455"></a>
-<span class="sourceLineNo">456</span>        multiTracker.updateRpc(stats);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        return;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      default:<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        throw new RuntimeException("Unrecognized ClientService RPC type " + method.getFullName());<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      }<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    }<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // Fallback to dynamic registry lookup for DDL methods.<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    updateRpcGeneric(method, stats);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  }<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>  public void incrCacheDroppingExceptions(Object exception) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    getMetric(CACHE_BASE + exception.getClass().getSimpleName(),<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      cacheDroppingExceptions, counterFactory).inc();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>  }<a name="line.469"></a>
-<span class="sourceLineNo">470</span>}<a name="line.470"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /** A lambda for dispatching to the appropriate metric factory method */<a name="line.237"></a>
+<span class="sourceLineNo">238</span>  private static interface NewMetric&lt;T&gt; {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    T newMetric(Class&lt;?&gt; clazz, String name, String scope);<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>  /** Anticipated number of metric entries */<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  private static final int CAPACITY = 50;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  /** Default load factor from {@link java.util.HashMap#DEFAULT_LOAD_FACTOR} */<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  private static final float LOAD_FACTOR = 0.75f;<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  /**<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * Anticipated number of concurrent accessor threads, from<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * {@link ConnectionImplementation#getBatchPool()}<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  private static final int CONCURRENCY_LEVEL = 256;<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  private final MetricRegistry registry;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  private final JmxReporter reporter;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  private final String scope;<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  private final NewMetric&lt;Timer&gt; timerFactory = new NewMetric&lt;Timer&gt;() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    @Override public Timer newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      return registry.timer(name(clazz, name, scope));<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>  private final NewMetric&lt;Histogram&gt; histogramFactory = new NewMetric&lt;Histogram&gt;() {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    @Override public Histogram newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      return registry.histogram(name(clazz, name, scope));<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  };<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  private final NewMetric&lt;Counter&gt; counterFactory = new NewMetric&lt;Counter&gt;() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    @Override public Counter newMetric(Class&lt;?&gt; clazz, String name, String scope) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      return registry.counter(name(clazz, name, scope));<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
+<span class="sourceLineNo">272</span>  };<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>  // static metrics<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @VisibleForTesting protected final Counter metaCacheHits;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  @VisibleForTesting protected final Counter metaCacheMisses;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  @VisibleForTesting protected final CallTracker getTracker;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  @VisibleForTesting protected final CallTracker scanTracker;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  @VisibleForTesting protected final CallTracker appendTracker;<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  @VisibleForTesting protected final CallTracker deleteTracker;<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @VisibleForTesting protected final CallTracker incrementTracker;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  @VisibleForTesting protected final CallTracker putTracker;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  @VisibleForTesting protected final CallTracker multiTracker;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  @VisibleForTesting protected final RunnerStats runnerStats;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  private final Counter metaCacheNumClearServer;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  private final Counter metaCacheNumClearRegion;<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>  // dynamic metrics<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>  // These maps are used to cache references to the metric instances that are managed by the<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  // registry. I don't think their use perfectly removes redundant allocations, but it's<a name="line.292"></a>
+<span class="sourceLineNo">293</span>  // a big improvement over calling registry.newMetric each time.<a name="line.293"></a>
+<span class="sourceLineNo">294</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Timer&gt; rpcTimers =<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  @VisibleForTesting protected final ConcurrentMap&lt;String, Histogram&gt; rpcHistograms =<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      new ConcurrentHashMap&lt;&gt;(CAPACITY * 2 /* tracking both request and response sizes */,<a name="line.297"></a>
+<span class="sourceLineNo">298</span>          LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  private final ConcurrentMap&lt;String, Counter&gt; cacheDroppingExceptions =<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    new ConcurrentHashMap&lt;&gt;(CAPACITY, LOAD_FACTOR, CONCURRENCY_LEVEL);<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  public MetricsConnection(final ConnectionImplementation conn) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    this.scope = conn.toString();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    this.registry = new MetricRegistry();<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    final ThreadPoolExecutor batchPool = (ThreadPoolExecutor) conn.getCurrentBatchPool();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    final ThreadPoolExecutor metaPool = (ThreadPoolExecutor) conn.getCurrentMetaLookupPool();<a name="line.306"></a>
+<span class="sourceLineNo">307</span><a name="line.307"></a>
+<span class="sourceLineNo">308</span>    this.registry.register(name(this.getClass(), "executorPoolActiveThreads", scope),<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        new RatioGauge() {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>          @Override<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          protected Ratio getRatio() {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            return Ratio.of(batchPool.getActiveCount(), batchPool.getMaximumPoolSize());<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>    this.registry.register(name(this.getClass(), "metaPoolActiveThreads", scope),<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        new RatioGauge() {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          @Override<a name="line.317"></a>
+<span class="sourceLineNo">318</span>          protected Ratio getRatio() {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>            return Ratio.of(metaPool.getActiveCount(), metaPool.getMaximumPoolSize());<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>    this.metaCacheHits = registry.counter(name(this.getClass(), "metaCacheHits", scope));<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    this.metaCacheMisses = registry.counter(name(this.getClass(), "metaCacheMisses", scope));<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    this.metaCacheNumClearServer = registry.counter(name(this.getClass(),<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      "metaCacheNumClearServer", scope));<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    this.metaCacheNumClearRegion = registry.counter(name(this.getClass(),<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      "metaCacheNumClearRegion", scope));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    this.getTracker = new CallTracker(this.registry, "Get", scope);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    this.scanTracker = new CallTracker(this.registry, "Scan", scope);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    this.appendTracker = new CallTracker(this.registry, "Mutate", "Append", scope);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    this.deleteTracker = new CallTracker(this.registry, "Mutate", "Delete", scope);<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    this.incrementTracker = new CallTracker(this.registry, "Mutate", "Increment", scope);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    this.putTracker = new CallTracker(this.registry, "Mutate", "Put", scope);<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    this.multiTracker = new CallTracker(this.registry, "Multi", scope);<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    this.runnerStats = new RunnerStats(this.registry);<a name="line.335"></a>
+<span class="sourceLineNo">336</span><a name="line.336"></a>
+<span class="sourceLineNo">337</span>    this.reporter = JmxReporter.forRegistry(this.registry).build();<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    this.reporter.start();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>  public void shutdown() {<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    this.reporter.stop();<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  /** Produce an instance of {@link CallStats} for clients to attach to RPCs. */<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  public static CallStats newCallStats() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    // TODO: instance pool to reduce GC?<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    return new CallStats();<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>  /** Increment the number of meta cache hits. */<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  public void incrMetaCacheHit() {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    metaCacheHits.inc();<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>  /** Increment the number of meta cache misses. */<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  public void incrMetaCacheMiss() {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    metaCacheMisses.inc();<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  }<a name="line.359"></a>
+<span class="sourceLineNo">360</span><a name="line.360"></a>
+<span class="sourceLineNo">361</span>  /** Increment the number of meta cache drops requested for entire RegionServer. */<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  public void incrMetaCacheNumClearServer() {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    metaCacheNumClearServer.inc();<a name="line.363"></a>
+<span class="sourceLineNo">364</span>  }<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span>  /** Increment the number of meta cache drops requested for individual region. */<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  public void incrMetaCacheNumClearRegion() {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    metaCacheNumClearRegion.inc();<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  }<a name="line.369"></a>
+<span class="sourceLineNo">370</span><a name="line.370"></a>
+<span class="sourceLineNo">371</span>  /** Increment the number of normal runner counts. */<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  public void incrNormalRunners() {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    this.runnerStats.incrNormalRunners();<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>  /** Increment the number of delay runner counts. */<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public void incrDelayRunners() {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    this.runnerStats.incrDelayRunners();<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>  /** Update delay interval of delay runner. */<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  public void updateDelayInterval(long interval) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    this.runnerStats.updateDelayInterval(interval);<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>  /**<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   * Get a metric for {@code key} from {@code map}, or create it with {@code factory}.<a name="line.387"></a>
+<span class="sourceLineNo">388</span>   */<a name="line.388"></a>
+<span class="sourceLineNo">389</span>  private &lt;T&gt; T getMetric(String key, ConcurrentMap&lt;String, T&gt; map, NewMetric&lt;T&gt; factory) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    T t = map.get(key);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    if (t == null) {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      t = factory.newMetric(this.getClass(), key, scope);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      T tmp = map.putIfAbsent(key, t);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      t = (tmp == null) ? t : tmp;<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    return t;<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>  /** Update call stats for non-critical-path methods */<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  private void updateRpcGeneric(MethodDescriptor method, CallStats stats) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    final String methodName = method.getService().getName() + "_" + method.getName();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    getMetric(DRTN_BASE + methodName, rpcTimers, timerFactory)<a name="line.402"></a>
+<span class="sourceLineNo">403</span>        .update(stats.getCallTimeMs(), TimeUnit.MILLISECONDS);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    getMetric(REQ_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        .update(stats.getRequestSizeBytes());<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    getMetric(RESP_BASE + methodName, rpcHistograms, histogramFactory)<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        .update(stats.getResponseSizeBytes());<a name="line.407"></a>
+<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
+<span class="sourceLineNo">410</span>  /** Report RPC context to metrics system. */<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  public void updateRpc(MethodDescriptor method, Message param, CallStats stats) {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    // this implementation is tied directly to protobuf implementation details. would be better<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    // if we could dispatch based on something static, ie, request Message type.<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (method.getService() == ClientService.getDescriptor()) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      switch(method.getIndex()) {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      case 0:<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        assert "Get".equals(method.getName());<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        getTracker.updateRpc(stats);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        return;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      case 1:<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        assert "Mutate".equals(method.getName());<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        final MutationType mutationType = ((MutateRequest) param).getMutation().getMutateType();<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        switch(mutationType) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        case APPEND:<a name="line.424"></a>
+<span class="sourceLineNo">425</span>          appendTracker.updateRpc(stats);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          return;<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        case DELETE:<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          deleteTracker.updateRpc(stats);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          return;<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        case INCREMENT:<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          incrementTracker.updateRpc(stats);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          return;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>        case PUT:<a name="line.433"></a>
+<span class="sourceLineNo">434</span>          putTracker.updateRpc(stats);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>          return;<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        default:<a name="line.436"></a>
+<span class="sourceLineNo">437</span>          throw new RuntimeException("Unrecognized mutation type " + mutationType);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>        }<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      case 2:<a name="line.439"></a>
+<span class="sourceLineNo">440</span>        assert "Scan".equals(method.getName());<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        scanTracker.updateRpc(stats);<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        return;<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      case 3:<a name="line.443"></a>
+<span class="sourceLineNo">444</span>        assert "BulkLoadHFile".equals(method.getName());<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        // use generic implementation<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        break;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      case 4:<a name="line.447"></a>
+<span class="sourceLineNo">448</span>        assert "ExecService".equals(method.getName());<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        // use generic implementation<a name="line.449"></a>
+<span class="sourceLineNo">450</span>        break;<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      case 5:<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        assert "ExecRegionServerService".equals(method.getName());<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        // use generic implementation<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        break;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      case 6:<a name="line.455"></a>
+<span class="sourceLineNo">456</span>        assert "Multi".equals(method.getName());<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        multiTracker.updateRpc(stats);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        return;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      default:<a name="line.459"></a>
+<span class="sourceLineNo">460</span>        throw new RuntimeException("Unrecognized ClientService RPC type " + method.getFullName());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      }<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    // Fallback to dynamic registry lookup for DDL methods.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    updateRpcGeneric(method, stats);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  }<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  public void incrCacheDroppingExceptions(Object exception) {<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    getMetric(CACHE_BASE +<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      (exception == null? UNKNOWN_EXCEPTION : exception.getClass().getSimpleName()),<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      cacheDroppingExceptions, counterFactory).inc();<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>}<a name="line.472"></a>
 
 
 


[40/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.ReplicaCallIssuingRunnable.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.ReplicaCallIssuingRunnable.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.ReplicaCallIssuingRunnable.html
index ed7bc7f..e65df71 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.ReplicaCallIssuingRunnable.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.ReplicaCallIssuingRunnable.html
@@ -1198,681 +1198,699 @@
 <span class="sourceLineNo">1190</span>        byte[] row = e.getValue().iterator().next().getAction().getRow();<a name="line.1190"></a>
 <span class="sourceLineNo">1191</span>        // Do not use the exception for updating cache because it might be coming from<a name="line.1191"></a>
 <span class="sourceLineNo">1192</span>        // any of the regions in the MultiAction.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        if (tableName != null) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>          connection.updateCachedLocations(tableName, regionName, row,<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>              ClientExceptionsUtil.isMetaClearingException(t) ? null : t, server);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>        for (Action&lt;Row&gt; action : e.getValue()) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          Retry retry = manageError(<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>              action.getOriginalIndex(), action.getAction(), canRetry, t, server);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (retry == Retry.YES) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            toReplay.add(action);<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            ++stopped;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>          } else {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            ++failed;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>          }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>        }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>      }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      if (toReplay.isEmpty()) {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>        logNoResubmit(server, numAttempt, rsActions.size(), t, failed, stopped);<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>      } else {<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        resubmit(server, toReplay, numAttempt, rsActions.size(), t);<a name="line.1213"></a>
+<span class="sourceLineNo">1193</span>        try {<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          if (tableName != null) {<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>            connection.updateCachedLocations(tableName, regionName, row,<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>              ClientExceptionsUtil.isMetaClearingException(t) ? null : t, server);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>          }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        } catch (Throwable ex) {<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>          // That should never happen, but if it did, we want to make sure<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          // we still process errors<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>          LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        for (Action&lt;Row&gt; action : e.getValue()) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          Retry retry = manageError(<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              action.getOriginalIndex(), action.getAction(), canRetry, t, server);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>          if (retry == Retry.YES) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>            toReplay.add(action);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>            ++stopped;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>            ++failed;<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
 <span class="sourceLineNo">1214</span>      }<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>     * Log as much info as possible, and, if there is something to replay,<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     * submit it again after a back off sleep.<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>     */<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    private void resubmit(ServerName oldServer, List&lt;Action&lt;Row&gt;&gt; toReplay,<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        int numAttempt, int failureCount, Throwable throwable) {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      // We have something to replay. We're going to sleep a little before.<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // We have two contradicting needs here:<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      //  1) We want to get the new location after having slept, as it may change.<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      //  2) We want to take into account the location when calculating the sleep time.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      //  3) If all this is just because the response needed to be chunked try again FAST.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      // It should be possible to have some heuristics to take the right decision. Short term,<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>      //  we go for one.<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      boolean retryImmediately = throwable instanceof RetryImmediatelyException;<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      int nextAttemptNumber = retryImmediately ? numAttempt : numAttempt + 1;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      long backOffTime = retryImmediately ? 0 :<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          errorsByServer.calculateBackoffTime(oldServer, pause);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>      if (numAttempt &gt; startLogErrorsCnt) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        // We use this value to have some logs when we have multiple failures, but not too many<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        //  logs, as errors are to be expected when a region moves, splits and so on<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        LOG.info(createLog(numAttempt, failureCount, toReplay.size(),<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>            oldServer, throwable, backOffTime, true, null, -1, -1));<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      try {<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>        if (backOffTime &gt; 0) {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>          Thread.sleep(backOffTime);<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>        }<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      } catch (InterruptedException e) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>        LOG.warn("#" + id + ", not sent: " + toReplay.size() + " operations, " + oldServer, e);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>        Thread.currentThread().interrupt();<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        return;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>      groupAndSendMultiAction(toReplay, nextAttemptNumber);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    private void logNoResubmit(ServerName oldServer, int numAttempt,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        int failureCount, Throwable throwable, int failed, int stopped) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      if (failureCount != 0 || numAttempt &gt; startLogErrorsCnt + 1) {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>        String timeStr = new Date(errorsByServer.getStartTrackingTime()).toString();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>        String logMessage = createLog(numAttempt, failureCount, 0, oldServer,<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>            throwable, -1, false, timeStr, failed, stopped);<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>        if (failed != 0) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>          // Only log final failures as warning<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>          LOG.warn(logMessage);<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        } else {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>          LOG.info(logMessage);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>        }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    }<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    /**<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>     * Called when we receive the result of a server query.<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>     *<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>     * @param multiAction    - the multiAction we sent<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>     * @param server       - the location. It's used as a server name.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>     * @param responses      - the response, if any<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>     * @param numAttempt     - the attempt<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>     */<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    private void receiveMultiAction(MultiAction&lt;Row&gt; multiAction,<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>        ServerName server, MultiResponse responses, int numAttempt) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>       assert responses != null;<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span><a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      // Success or partial success<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      // Analyze detailed results. We can still have individual failures to be redo.<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      // two specific throwables are managed:<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      //  - DoNotRetryIOException: we continue to retry for other actions<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      //  - RegionMovedException: we update the cache with the new region location<a name="line.1286"></a>
+<span class="sourceLineNo">1215</span><a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      if (toReplay.isEmpty()) {<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>        logNoResubmit(server, numAttempt, rsActions.size(), t, failed, stopped);<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>        resubmit(server, toReplay, numAttempt, rsActions.size(), t);<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    }<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>     * Log as much info as possible, and, if there is something to replay,<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>     * submit it again after a back off sleep.<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    private void resubmit(ServerName oldServer, List&lt;Action&lt;Row&gt;&gt; toReplay,<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        int numAttempt, int failureCount, Throwable throwable) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>      // We have something to replay. We're going to sleep a little before.<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      // We have two contradicting needs here:<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>      //  1) We want to get the new location after having slept, as it may change.<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>      //  2) We want to take into account the location when calculating the sleep time.<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      //  3) If all this is just because the response needed to be chunked try again FAST.<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      // It should be possible to have some heuristics to take the right decision. Short term,<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      //  we go for one.<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      boolean retryImmediately = throwable instanceof RetryImmediatelyException;<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>      int nextAttemptNumber = retryImmediately ? numAttempt : numAttempt + 1;<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      long backOffTime = retryImmediately ? 0 :<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          errorsByServer.calculateBackoffTime(oldServer, pause);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      if (numAttempt &gt; startLogErrorsCnt) {<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>        // We use this value to have some logs when we have multiple failures, but not too many<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>        //  logs, as errors are to be expected when a region moves, splits and so on<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>        LOG.info(createLog(numAttempt, failureCount, toReplay.size(),<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>            oldServer, throwable, backOffTime, true, null, -1, -1));<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      }<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span><a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      try {<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>        if (backOffTime &gt; 0) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>          Thread.sleep(backOffTime);<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>        }<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      } catch (InterruptedException e) {<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>        LOG.warn("#" + id + ", not sent: " + toReplay.size() + " operations, " + oldServer, e);<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>        Thread.currentThread().interrupt();<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>        return;<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span><a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      groupAndSendMultiAction(toReplay, nextAttemptNumber);<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    private void logNoResubmit(ServerName oldServer, int numAttempt,<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        int failureCount, Throwable throwable, int failed, int stopped) {<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>      if (failureCount != 0 || numAttempt &gt; startLogErrorsCnt + 1) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>        String timeStr = new Date(errorsByServer.getStartTrackingTime()).toString();<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>        String logMessage = createLog(numAttempt, failureCount, 0, oldServer,<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>            throwable, -1, false, timeStr, failed, stopped);<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>        if (failed != 0) {<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          // Only log final failures as warning<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          LOG.warn(logMessage);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>        } else {<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>          LOG.info(logMessage);<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>        }<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    }<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span><a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>    /**<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>     * Called when we receive the result of a server query.<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>     *<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>     * @param multiAction    - the multiAction we sent<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>     * @param server       - the location. It's used as a server name.<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>     * @param responses      - the response, if any<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>     * @param numAttempt     - the attempt<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>     */<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    private void receiveMultiAction(MultiAction&lt;Row&gt; multiAction,<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        ServerName server, MultiResponse responses, int numAttempt) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>       assert responses != null;<a name="line.1286"></a>
 <span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      List&lt;Action&lt;Row&gt;&gt; toReplay = new ArrayList&lt;Action&lt;Row&gt;&gt;();<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      Throwable throwable = null;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      int failureCount = 0;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      boolean canRetry = true;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span><a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      Map&lt;byte[], MultiResponse.RegionResult&gt; results = responses.getResults();<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      updateStats(server, results);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      int failed = 0, stopped = 0;<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      // Go by original action.<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      for (Map.Entry&lt;byte[], List&lt;Action&lt;Row&gt;&gt;&gt; regionEntry : multiAction.actions.entrySet()) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        byte[] regionName = regionEntry.getKey();<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>        Map&lt;Integer, Object&gt; regionResults = results.get(regionName) == null<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>            ?  null : results.get(regionName).result;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        if (regionResults == null) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>          if (!responses.getExceptions().containsKey(regionName)) {<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>            LOG.error("Server sent us neither results nor exceptions for "<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>                + Bytes.toStringBinary(regionName));<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>            responses.getExceptions().put(regionName, new RuntimeException("Invalid response"));<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>          }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>          continue;<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>        }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>        boolean regionFailureRegistered = false;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>        for (Action&lt;Row&gt; sentAction : regionEntry.getValue()) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>          Object result = regionResults.get(sentAction.getOriginalIndex());<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>          // Failure: retry if it's make sense else update the errors lists<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>          if (result == null || result instanceof Throwable) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>            Row row = sentAction.getAction();<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>            throwable = ClientExceptionsUtil.findException(result);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>            // Register corresponding failures once per server/once per region.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>            if (!regionFailureRegistered) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>              regionFailureRegistered = true;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>              connection.updateCachedLocations(<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>                  tableName, regionName, row.getRow(), result, server);<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>            }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>            if (failureCount == 0) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>              errorsByServer.reportServerError(server);<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>              // We determine canRetry only once for all calls, after reporting server failure.<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>              canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            }<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            ++failureCount;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>            Retry retry = manageError(sentAction.getOriginalIndex(), row,<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>                canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, (Throwable) result, server);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>            if (retry == Retry.YES) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>              toReplay.add(sentAction);<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>            } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>              ++stopped;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>            } else {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>              ++failed;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>            }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>          } else {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>            if (callback != null) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>              try {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>                //noinspection unchecked<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>                // TODO: would callback expect a replica region name if it gets one?<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>                this.callback.update(regionName, sentAction.getAction().getRow(), (CResult) result);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>              } catch (Throwable t) {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>                LOG.error("User callback threw an exception for "<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>                    + Bytes.toStringBinary(regionName) + ", ignoring", t);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>              }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>            }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>            setResult(sentAction, result);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>          }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>        }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      }<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span><a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      // The failures global to a region. We will use for multiAction we sent previously to find the<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      //   actions to replay.<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      for (Map.Entry&lt;byte[], Throwable&gt; throwableEntry : responses.getExceptions().entrySet()) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>        throwable = throwableEntry.getValue();<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>        byte[] region = throwableEntry.getKey();<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        List&lt;Action&lt;Row&gt;&gt; actions = multiAction.actions.get(region);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>        if (actions == null || actions.isEmpty()) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          throw new IllegalStateException("Wrong response for the region: " +<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>              HRegionInfo.encodeRegionName(region));<a name="line.1362"></a>
+<span class="sourceLineNo">1288</span>      // Success or partial success<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>      // Analyze detailed results. We can still have individual failures to be redo.<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      // two specific throwables are managed:<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      //  - DoNotRetryIOException: we continue to retry for other actions<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      //  - RegionMovedException: we update the cache with the new region location<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span><a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      List&lt;Action&lt;Row&gt;&gt; toReplay = new ArrayList&lt;Action&lt;Row&gt;&gt;();<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      Throwable throwable = null;<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      int failureCount = 0;<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      boolean canRetry = true;<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span><a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      Map&lt;byte[], MultiResponse.RegionResult&gt; results = responses.getResults();<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      updateStats(server, results);<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span><a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      int failed = 0, stopped = 0;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>      // Go by original action.<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>      for (Map.Entry&lt;byte[], List&lt;Action&lt;Row&gt;&gt;&gt; regionEntry : multiAction.actions.entrySet()) {<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>        byte[] regionName = regionEntry.getKey();<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>        Map&lt;Integer, Object&gt; regionResults = results.get(regionName) == null<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>            ?  null : results.get(regionName).result;<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>        if (regionResults == null) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>          if (!responses.getExceptions().containsKey(regionName)) {<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>            LOG.error("Server sent us neither results nor exceptions for "<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>                + Bytes.toStringBinary(regionName));<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>            responses.getExceptions().put(regionName, new RuntimeException("Invalid response"));<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>          }<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>          continue;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>        }<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        boolean regionFailureRegistered = false;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        for (Action&lt;Row&gt; sentAction : regionEntry.getValue()) {<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>          Object result = regionResults.get(sentAction.getOriginalIndex());<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>          // Failure: retry if it's make sense else update the errors lists<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>          if (result == null || result instanceof Throwable) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>            Row row = sentAction.getAction();<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>            throwable = ClientExceptionsUtil.findException(result);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>            // Register corresponding failures once per server/once per region.<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>            if (!regionFailureRegistered) {<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>              regionFailureRegistered = true;<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>              try {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>                connection.updateCachedLocations(<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>                  tableName, regionName, row.getRow(), result, server);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>              } catch (Throwable ex) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>                // That should never happen, but if it did, we want to make sure<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>                // we still process errors<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>                LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>              }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>            }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>            if (failureCount == 0) {<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>              errorsByServer.reportServerError(server);<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>              // We determine canRetry only once for all calls, after reporting server failure.<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>              canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>            }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>            ++failureCount;<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>            Retry retry = manageError(sentAction.getOriginalIndex(), row,<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>                canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, (Throwable) result, server);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>            if (retry == Retry.YES) {<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>              toReplay.add(sentAction);<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>            } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>              ++stopped;<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>            } else {<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>              ++failed;<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>            }<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>          } else {<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>            if (callback != null) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>              try {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>                //noinspection unchecked<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>                // TODO: would callback expect a replica region name if it gets one?<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>                this.callback.update(regionName, sentAction.getAction().getRow(), (CResult) result);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>              } catch (Throwable t) {<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>                LOG.error("User callback threw an exception for "<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>                    + Bytes.toStringBinary(regionName) + ", ignoring", t);<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>            setResult(sentAction, result);<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>          }<a name="line.1362"></a>
 <span class="sourceLineNo">1363</span>        }<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        if (failureCount == 0) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>          errorsByServer.reportServerError(server);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>          canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>        }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        if (null == tableName &amp;&amp; ClientExceptionsUtil.isMetaClearingException(throwable)) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>          // For multi-actions, we don't have a table name, but we want to make sure to clear the<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>          // cache in case there were location-related exceptions. We don't to clear the cache<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>          // for every possible exception that comes through, however.<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>          connection.clearCaches(server);<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        } else {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>          connection.updateCachedLocations(<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>              tableName, region, actions.get(0).getAction().getRow(), throwable, server);<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>        }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        failureCount += actions.size();<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span><a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>        for (Action&lt;Row&gt; action : actions) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>          Row row = action.getAction();<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          Retry retry = manageError(action.getOriginalIndex(), row,<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>              canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, throwable, server);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>          if (retry == Retry.YES) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>            toReplay.add(action);<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>            ++stopped;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>          } else {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>            ++failed;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>          }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        }<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (toReplay.isEmpty()) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        logNoResubmit(server, numAttempt, failureCount, throwable, failed, stopped);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      } else {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>        resubmit(server, toReplay, numAttempt, failureCount, throwable);<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    private String createLog(int numAttempt, int failureCount, int replaySize, ServerName sn,<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        Throwable error, long backOffTime, boolean willRetry, String startTime,<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>        int failed, int stopped) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      StringBuilder sb = new StringBuilder();<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      sb.append("#").append(id).append(", table=").append(tableName).append(", ")<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>        .append("attempt=").append(numAttempt)<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>        .append("/").append(numTries).append(" ");<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span><a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      if (failureCount &gt; 0 || error != null){<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>        sb.append("failed=").append(failureCount).append("ops").append(", last exception: ").<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>            append(error == null ? "null" : error);<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>      } else {<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        sb.append("succeeded");<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      }<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span><a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      sb.append(" on ").append(sn).append(", tracking started ").append(startTime);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span><a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      if (willRetry) {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        sb.append(", retrying after=").append(backOffTime).append("ms").<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>            append(", replay=").append(replaySize).append("ops");<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      } else if (failureCount &gt; 0) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        if (stopped &gt; 0) {<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          sb.append("; not retrying ").append(stopped).append(" due to success from other replica");<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>        }<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        if (failed &gt; 0) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          sb.append("; not retrying ").append(failed).append(" - final failure");<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>        }<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span><a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span><a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      return sb.toString();<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
+<span class="sourceLineNo">1364</span>      }<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span><a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      // The failures global to a region. We will use for multiAction we sent previously to find the<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>      //   actions to replay.<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      for (Map.Entry&lt;byte[], Throwable&gt; throwableEntry : responses.getExceptions().entrySet()) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        throwable = throwableEntry.getValue();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>        byte[] region = throwableEntry.getKey();<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>        List&lt;Action&lt;Row&gt;&gt; actions = multiAction.actions.get(region);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>        if (actions == null || actions.isEmpty()) {<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>          throw new IllegalStateException("Wrong response for the region: " +<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>              HRegionInfo.encodeRegionName(region));<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        }<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span><a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        if (failureCount == 0) {<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>          errorsByServer.reportServerError(server);<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>          canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>        }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>        if (null == tableName &amp;&amp; ClientExceptionsUtil.isMetaClearingException(throwable)) {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>          // For multi-actions, we don't have a table name, but we want to make sure to clear the<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>          // cache in case there were location-related exceptions. We don't to clear the cache<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>          // for every possible exception that comes through, however.<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>          connection.clearCaches(server);<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>        } else {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>          try {<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>            connection.updateCachedLocations(<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>              tableName, region, actions.get(0).getAction().getRow(), throwable, server);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          } catch (Throwable ex) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>            // That should never happen, but if it did, we want to make sure<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            // we still process errors<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>            LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          }<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        failureCount += actions.size();<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span><a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>        for (Action&lt;Row&gt; action : actions) {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>          Row row = action.getAction();<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>          Retry retry = manageError(action.getOriginalIndex(), row,<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>              canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, throwable, server);<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>          if (retry == Retry.YES) {<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>            toReplay.add(action);<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>            ++stopped;<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>          } else {<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>            ++failed;<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>          }<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        }<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      }<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>      if (toReplay.isEmpty()) {<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>        logNoResubmit(server, numAttempt, failureCount, throwable, failed, stopped);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>      } else {<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>        resubmit(server, toReplay, numAttempt, failureCount, throwable);<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>      }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span><a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    private String createLog(int numAttempt, int failureCount, int replaySize, ServerName sn,<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>        Throwable error, long backOffTime, boolean willRetry, String startTime,<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>        int failed, int stopped) {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      StringBuilder sb = new StringBuilder();<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>      sb.append("#").append(id).append(", table=").append(tableName).append(", ")<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>        .append("attempt=").append(numAttempt)<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>        .append("/").append(numTries).append(" ");<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span><a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      if (failureCount &gt; 0 || error != null){<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>        sb.append("failed=").append(failureCount).append("ops").append(", last exception: ").<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>            append(error == null ? "null" : error);<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      } else {<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>        sb.append("succeeded");<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>      }<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>     * Sets the non-error result from a particular action.<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>     * @param action Action (request) that the server responded to.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>     * @param result The result.<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>     */<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    private void setResult(Action&lt;Row&gt; action, Object result) {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      if (result == null) {<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        throw new RuntimeException("Result cannot be null");<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      }<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      ReplicaResultState state = null;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      boolean isStale = !RegionReplicaUtil.isDefaultReplica(action.getReplicaId());<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      int index = action.getOriginalIndex();<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      if (results == null) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        decActionCounter(index);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        return; // Simple case, no replica requests.<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      }<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      state = trySetResultSimple(index, action.getAction(), false, result, null, isStale);<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      if (state == null) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        return; // Simple case, no replica requests.<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      // At this point we know that state is set to replica tracking class.<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>      // It could be that someone else is also looking at it; however, we know there can<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      // only be one state object, and only one thread can set callCount to 0. Other threads<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>      // will either see state with callCount 0 after locking it; or will not see state at all<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      // we will replace it with the result.<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      synchronized (state) {<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>        if (state.callCount == 0) {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>          return; // someone already set the result<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>        }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        state.callCount = 0;<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>      }<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>      synchronized (replicaResultLock) {<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>        if (results[index] != state) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>          throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>        }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        results[index] = result;<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>      }<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span><a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      decActionCounter(index);<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    }<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span><a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>    /**<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>     * Sets the error from a particular action.<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>     * @param index Original action index.<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>     * @param row Original request.<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>     * @param throwable The resulting error.<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>     * @param server The source server.<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>     */<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>    private void setError(int index, Row row, Throwable throwable, ServerName server) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      ReplicaResultState state = null;<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>      if (results == null) {<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>        // Note that we currently cannot have replica requests with null results. So it shouldn't<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>        // happen that multiple replica calls will call dAC for same actions with results == null.<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        // Only one call per action should be present in this case.<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        errors.add(throwable, row, server);<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>        decActionCounter(index);<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>        return; // Simple case, no replica requests.<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>      }<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>      state = trySetResultSimple(index, row, true, throwable, server, false);<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>      if (state == null) {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>        return; // Simple case, no replica requests.<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>      }<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>      BatchErrors target = null; // Error will be added to final errors, or temp replica errors.<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      boolean isActionDone = false;<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>      synchronized (state) {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>        switch (state.callCount) {<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>          case 0: return; // someone already set the result<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>          case 1: { // All calls failed, we are the last error.<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>            target = errors;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>            isActionDone = true;<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>            break;<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>          }<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>          default: {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>            assert state.callCount &gt; 1;<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>            if (state.replicaErrors == null) {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>              state.replicaErrors = new BatchErrors();<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>            }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>            target = state.replicaErrors;<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>            break;<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>        --state.callCount;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      target.add(throwable, row, server);<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>      if (isActionDone) {<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        if (state.replicaErrors != null) { // last call, no need to lock<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>          errors.merge(state.replicaErrors);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>        }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>        // See setResult for explanations.<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>        synchronized (replicaResultLock) {<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>          if (results[index] != state) {<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>            throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>          }<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>          results[index] = throwable;<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>        }<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>        decActionCounter(index);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      }<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    }<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span><a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    /**<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>     * Checks if the action is complete; used on error to prevent needless retries.<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>     * Does not synchronize, assuming element index/field accesses are atomic.<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>     * This is an opportunistic optimization check, doesn't have to be strict.<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>     * @param index Original action index.<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>     * @param row Original request.<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>     */<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    private boolean isActionComplete(int index, Row row) {<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      if (!isReplicaGet(row)) return false;<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      Object resObj = results[index];<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      return (resObj != null) &amp;&amp; (!(resObj instanceof ReplicaResultState)<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>          || ((ReplicaResultState)resObj).callCount == 0);<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>     * Tries to set the result or error for a particular action as if there were no replica calls.<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>     * @return null if successful; replica state if there were in fact replica calls.<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>     */<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    private ReplicaResultState trySetResultSimple(int index, Row row, boolean isError,<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>        Object result, ServerName server, boolean isFromReplica) {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      Object resObj = null;<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      if (!isReplicaGet(row)) {<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>        if (isFromReplica) {<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>          throw new AssertionError("Unexpected stale result for " + row);<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        }<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        results[index] = result;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>      } else {<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>        synchronized (replicaResultLock) {<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          resObj = results[index];<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>          if (resObj == null) {<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>            if (isFromReplica) {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>              throw new AssertionError("Unexpected stale result for " + row);<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>            }<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>            results[index] = result;<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>          }<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>        }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>      }<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span><a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>      ReplicaResultState rrs =<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>          (resObj instanceof ReplicaResultState) ? (ReplicaResultState)resObj : null;<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      if (rrs == null &amp;&amp; isError) {<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>        // The resObj is not replica state (null or already set).<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>        errors.add((Throwable)result, row, server);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>      }<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span><a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>      if (resObj == null) {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>        // resObj is null - no replica calls were made.<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>        decActionCounter(index);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>        return null;<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      }<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      return rrs;<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    }<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span><a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    private void decActionCounter(int index) {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>      long actionsRemaining = actionsInProgress.decrementAndGet();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      if (actionsRemaining &lt; 0) {<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>        String error = buildDetailedErrorMsg("Incorrect actions in progress", index);<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>        throw new AssertionError(error);<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      } else if (actionsRemaining == 0) {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>        synchronized (actionsInProgress) {<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>          actionsInProgress.notifyAll();<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>        }<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>      }<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span><a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>    private String buildDetailedErrorMsg(String string, int index) {<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>      StringBuilder error = new StringBuilder(128);<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>      error.append(string).append("; called for ").append(index).append(", actionsInProgress ")<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>          .append(actionsInProgress.get()).append("; replica gets: ");<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>      if (replicaGetIndices != null) {<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>        for (int i = 0; i &lt; replicaGetIndices.length; ++i) {<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>          error.append(replicaGetIndices[i]).append(", ");<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>        }<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>      } else {<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>        error.append(hasAnyReplicaGets ? "all" : "none");<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>      }<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      error.append("; results ");<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      if (results != null) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>        for (int i = 0; i &lt; results.length; ++i) {<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>          Object o = results[i];<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          error.append(((o == null) ? "null" : o.toString())).append(", ");<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>        }<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>      }<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      return error.toString();<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    }<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span><a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    @Override<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    public void waitUntilDone() throws InterruptedIOException {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      try {<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>        waitUntilDone(Long.MAX_VALUE);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>      } catch (InterruptedException iex) {<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        throw new InterruptedIOException(iex.getMessage());<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>      } finally {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>        if (callsInProgress != null) {<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>          for (PayloadCarryingServerCallable clb : callsInProgress) {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>            clb.cancel();<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>          }<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>      }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>    }<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span><a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    private boolean waitUntilDone(long cutoff) throws InterruptedException {<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>      boolean hasWait = cutoff != Long.MAX_VALUE;<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>      long lastLog = EnvironmentEdgeManager.currentTime();<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>      long currentInProgress;<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>      while (0 != (currentInProgress = actionsInProgress.get())) {<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>        long now = EnvironmentEdgeManager.currentTime();<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>        if (hasWait &amp;&amp; (now * 1000L) &gt; cutoff) {<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>          return false;<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>        }<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>        if (!hasWait) { // Only log if wait is infinite.<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>          if (now &gt; lastLog + 10000) {<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>            lastLog = now;<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>            LOG.info("#" + id + ", waiting for " + currentInProgress + "  actions to finish");<a name="line.1645"></a>
+<span class="sourceLineNo">1433</span>      sb.append(" on ").append(sn).append(", tracking started ").append(startTime);<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span><a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      if (willRetry) {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>        sb.append(", retrying after=").append(backOffTime).append("ms").<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>            append(", replay=").append(replaySize).append("ops");<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>      } else if (failureCount &gt; 0) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>        if (stopped &gt; 0) {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>          sb.append("; not retrying ").append(stopped).append(" due to success from other replica");<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        if (failed &gt; 0) {<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>          sb.append("; not retrying ").append(failed).append(" - final failure");<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>        }<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><a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      return sb.toString();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>    }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span><a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>    /**<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>     * Sets the non-error result from a particular action.<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>     * @param action Action (request) that the server responded to.<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>     * @param result The result.<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>     */<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    private void setResult(Action&lt;Row&gt; action, Object result) {<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      if (result == null) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>        throw new RuntimeException("Result cannot be null");<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>      ReplicaResultState state = null;<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>      boolean isStale = !RegionReplicaUtil.isDefaultReplica(action.getReplicaId());<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      int index = action.getOriginalIndex();<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>      if (results == null) {<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>        decActionCounter(index);<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>        return; // Simple case, no replica requests.<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>      }<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>      state = trySetResultSimple(index, action.getAction(), false, result, null, isStale);<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      if (state == null) {<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>        return; // Simple case, no replica requests.<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>      }<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>      // At this point we know that state is set to replica tracking class.<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>      // It could be that someone else is also looking at it; however, we know there can<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      // only be one state object, and only one thread can set callCount to 0. Other threads<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      // will either see state with callCount 0 after locking it; or will not see state at all<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>      // we will replace it with the result.<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>      synchronized (state) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>        if (state.callCount == 0) {<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>          return; // someone already set the result<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>        state.callCount = 0;<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      }<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      synchronized (replicaResultLock) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>        if (results[index] != state) {<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>          throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>        }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>        results[index] = result;<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>      decActionCounter(index);<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    }<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span><a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    /**<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>     * Sets the error from a particular action.<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>     * @param index Original action index.<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>     * @param row Original request.<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>     * @param throwable The resulting error.<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>     * @param server The source server.<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>     */<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    private void setError(int index, Row row, Throwable throwable, ServerName server) {<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      ReplicaResultState state = null;<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>      if (results == null) {<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>        // Note that we currently cannot have replica requests with null results. So it shouldn't<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>        // happen that multiple replica calls will call dAC for same actions with results == null.<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>        // Only one call per action should be present in this case.<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>        errors.add(throwable, row, server);<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>        decActionCounter(index);<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>        return; // Simple case, no replica requests.<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>      }<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>      state = trySetResultSimple(index, row, true, throwable, server, false);<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      if (state == null) {<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>        return; // Simple case, no replica requests.<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>      }<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      BatchErrors target = null; // Error will be added to final errors, or temp replica errors.<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>      boolean isActionDone = false;<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>      synchronized (state) {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>        switch (state.callCount) {<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>          case 0: return; // someone already set the result<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>          case 1: { // All calls failed, we are the last error.<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>            target = errors;<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>            isActionDone = true;<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>            break;<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>          }<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          default: {<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>            assert state.callCount &gt; 1;<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>            if (state.replicaErrors == null) {<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>              state.replicaErrors = new BatchErrors();<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>            }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>            target = state.replicaErrors;<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>            break;<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>          }<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>        }<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>        --state.callCount;<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>      }<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span>      target.add(throwable, row, server);<a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>      if (isActionDone) {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>        if (state.replicaErrors != null) { // last call, no need to lock<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>          errors.merge(state.replicaErrors);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>        }<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>        // See setResult for explanations.<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>        synchronized (replicaResultLock) {<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>          if (results[index] != state) {<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>            throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>          }<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>          results[index] = throwable;<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>        }<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>        decActionCounter(index);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>      }<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>    }<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span><a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>    /**<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>     * Checks if the action is complete; used on error to prevent needless retries.<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>     * Does not synchronize, assuming element index/field accesses are atomic.<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>     * This is an opportunistic optimization check, doesn't have to be strict.<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>     * @param index Original action index.<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>     * @param row Original request.<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>     */<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    private boolean isActionComplete(int index, Row row) {<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>      if (!isReplicaGet(row)) return false;<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>      Object resObj = results[index];<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>      return (resObj != null) &amp;&amp; (!(resObj instanceof ReplicaResultState)<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>          || ((ReplicaResultState)resObj).callCount == 0);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    }<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span><a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>    /**<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>     * Tries to set the result or error for a particular action as if there were no replica calls.<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>     * @return null if successful; replica state if there were in fact replica calls.<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>     */<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>    private ReplicaResultState trySetResultSimple(int index, Row row, boolean isError,<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>        Object result, ServerName server, boolean isFromReplica) {<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>      Object resObj = null;<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      if (!isReplicaGet(row)) {<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>        if (isFromReplica) {<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>          throw new AssertionError("Unexpected stale result for " + row);<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>        }<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>        results[index] = result;<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>      } else {<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>        synchronized (replicaResultLock) {<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>          resObj = results[index];<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>          if (resObj == null) {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>            if (isFromReplica) {<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>              throw new AssertionError("Unexpected stale result for " + row);<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>            }<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>            results[index] = result;<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>          }<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>        }<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>      }<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>

<TRUNCATED>

[09/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer.html
index 1f46d03..8d76e1e 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/ipc/AbstractTestIPC.TestRpcServer.html
@@ -65,367 +65,366 @@
 <span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.57"></a>
 <span class="sourceLineNo">058</span>import org.apache.hadoop.io.compress.GzipCodec;<a name="line.58"></a>
 <span class="sourceLineNo">059</span>import org.apache.hadoop.util.StringUtils;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.http.ConnectionClosedException;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.Assert;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.junit.Test;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>import com.google.common.collect.ImmutableList;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import com.google.common.collect.Lists;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import com.google.protobuf.BlockingRpcChannel;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import com.google.protobuf.BlockingService;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import com.google.protobuf.Message;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import com.google.protobuf.RpcController;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import com.google.protobuf.ServiceException;<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> * Some basic ipc tests.<a name="line.74"></a>
-<span class="sourceLineNo">075</span> */<a name="line.75"></a>
-<span class="sourceLineNo">076</span>public abstract class AbstractTestIPC {<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private static final Log LOG = LogFactory.getLog(AbstractTestIPC.class);<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private static byte[] CELL_BYTES = Bytes.toBytes("xyz");<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  private static KeyValue CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, CELL_BYTES);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  static byte[] BIG_CELL_BYTES = new byte[10 * 1024];<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  static KeyValue BIG_CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, BIG_CELL_BYTES);<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  static final Configuration CONF = HBaseConfiguration.create();<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  // We are using the test TestRpcServiceProtos generated classes and Service because they are<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  // available and basic with methods like 'echo', and ping. Below we make a blocking service<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  // by passing in implementation of blocking interface. We use this service in all tests that<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  // follow.<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  static final BlockingService SERVICE =<a name="line.89"></a>
-<span class="sourceLineNo">090</span>      TestRpcServiceProtos.TestProtobufRpcProto<a name="line.90"></a>
-<span class="sourceLineNo">091</span>          .newReflectiveBlockingService(new TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface() {<a name="line.91"></a>
-<span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>            @Override<a name="line.93"></a>
-<span class="sourceLineNo">094</span>            public EmptyResponseProto ping(RpcController controller, EmptyRequestProto request)<a name="line.94"></a>
-<span class="sourceLineNo">095</span>                throws ServiceException {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>              return null;<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>            @Override<a name="line.99"></a>
-<span class="sourceLineNo">100</span>            public EmptyResponseProto error(RpcController controller, EmptyRequestProto request)<a name="line.100"></a>
-<span class="sourceLineNo">101</span>                throws ServiceException {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>              return null;<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>            @Override<a name="line.105"></a>
-<span class="sourceLineNo">106</span>            public EchoResponseProto echo(RpcController controller, EchoRequestProto request)<a name="line.106"></a>
-<span class="sourceLineNo">107</span>                throws ServiceException {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>              if (controller instanceof PayloadCarryingRpcController) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>                PayloadCarryingRpcController pcrc = (PayloadCarryingRpcController) controller;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>                // If cells, scan them to check we are able to iterate what we were given and since<a name="line.110"></a>
-<span class="sourceLineNo">111</span>                // this is<a name="line.111"></a>
-<span class="sourceLineNo">112</span>                // an echo, just put them back on the controller creating a new block. Tests our<a name="line.112"></a>
-<span class="sourceLineNo">113</span>                // block<a name="line.113"></a>
-<span class="sourceLineNo">114</span>                // building.<a name="line.114"></a>
-<span class="sourceLineNo">115</span>                CellScanner cellScanner = pcrc.cellScanner();<a name="line.115"></a>
-<span class="sourceLineNo">116</span>                List&lt;Cell&gt; list = null;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>                if (cellScanner != null) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>                  list = new ArrayList&lt;Cell&gt;();<a name="line.118"></a>
-<span class="sourceLineNo">119</span>                  try {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>                    while (cellScanner.advance()) {<a name="line.120"></a>
-<span class="sourceLineNo">121</span>                      list.add(cellScanner.current());<a name="line.121"></a>
-<span class="sourceLineNo">122</span>                    }<a name="line.122"></a>
-<span class="sourceLineNo">123</span>                  } catch (IOException e) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>                    throw new ServiceException(e);<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>                cellScanner = CellUtil.createCellScanner(list);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>                ((PayloadCarryingRpcController) controller).setCellScanner(cellScanner);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>              }<a name="line.129"></a>
-<span class="sourceLineNo">130</span>              return EchoResponseProto.newBuilder().setMessage(request.getMessage()).build();<a name="line.130"></a>
-<span class="sourceLineNo">131</span>            }<a name="line.131"></a>
-<span class="sourceLineNo">132</span>          });<a name="line.132"></a>
-<span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  /**<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   * Instance of server. We actually don't do anything speical in here so could just use<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * HBaseRpcServer directly.<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   */<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  static class TestRpcServer extends RpcServer {<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>    TestRpcServer() throws IOException {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      this(new FifoRpcScheduler(CONF, 1), CONF);<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>    TestRpcServer(Configuration conf) throws IOException {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      this(new FifoRpcScheduler(conf, 1), conf);<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>    TestRpcServer(RpcScheduler scheduler, Configuration conf) throws IOException {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      super(null, "testRpcServer", Lists<a name="line.149"></a>
-<span class="sourceLineNo">150</span>          .newArrayList(new BlockingServiceAndInterface(SERVICE, null)), new InetSocketAddress(<a name="line.150"></a>
-<span class="sourceLineNo">151</span>          "localhost", 0), conf, scheduler);<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<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    public Pair&lt;Message, CellScanner&gt; call(BlockingService service, MethodDescriptor md,<a name="line.155"></a>
-<span class="sourceLineNo">156</span>        Message param, CellScanner cellScanner, long receiveTime, MonitoredRPCHandler status)<a name="line.156"></a>
-<span class="sourceLineNo">157</span>        throws IOException {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      return super.call(service, md, param, cellScanner, receiveTime, status);<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><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  protected abstract AbstractRpcClient createRpcClientNoCodec(Configuration conf);<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>   * Ensure we do not HAVE TO HAVE a codec.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @throws InterruptedException<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @throws IOException<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  @Test<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  public void testNoCodec() throws InterruptedException, IOException {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    Configuration conf = HBaseConfiguration.create();<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    AbstractRpcClient client = createRpcClientNoCodec(conf);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    TestRpcServer rpcServer = new TestRpcServer();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    try {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      rpcServer.start();<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      final String message = "hello";<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(message).build();<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      if (address == null) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        throw new IOException("Listener channel is closed");<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      Pair&lt;Message, CellScanner&gt; r =<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          client.call(null, md, param, md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.184"></a>
-<span class="sourceLineNo">185</span>              new MetricsConnection.CallStats());<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      assertTrue(r.getSecond() == null);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      // Silly assertion that the message is in the returned pb.<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      assertTrue(r.getFirst().toString().contains(message));<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    } finally {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      client.close();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      rpcServer.stop();<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>  protected abstract AbstractRpcClient createRpcClient(Configuration conf);<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>  /**<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * It is hard to verify the compression is actually happening under the wraps. Hope that if<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * unsupported, we'll get an exception out of some time (meantime, have to trace it manually to<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * confirm that compression is happening down in the client and server).<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   * @throws IOException<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   * @throws InterruptedException<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   * @throws SecurityException<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   * @throws NoSuchMethodException<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   */<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  @Test<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  public void testCompressCellBlock() throws IOException, InterruptedException, SecurityException,<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      NoSuchMethodException, ServiceException {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    Configuration conf = new Configuration(HBaseConfiguration.create());<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    conf.set("hbase.client.rpc.compressor", GzipCodec.class.getCanonicalName());<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    List&lt;Cell&gt; cells = new ArrayList&lt;Cell&gt;();<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    int count = 3;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    for (int i = 0; i &lt; count; i++) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      cells.add(CELL);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    AbstractRpcClient client = createRpcClient(conf);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    TestRpcServer rpcServer = new TestRpcServer();<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    try {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      rpcServer.start();<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      PayloadCarryingRpcController pcrc =<a name="line.222"></a>
-<span class="sourceLineNo">223</span>          new PayloadCarryingRpcController(CellUtil.createCellScanner(cells));<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      if (address == null) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        throw new IOException("Listener channel is closed");<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      }<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      Pair&lt;Message, CellScanner&gt; r =<a name="line.228"></a>
-<span class="sourceLineNo">229</span>          client.call(pcrc, md, param, md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.229"></a>
-<span class="sourceLineNo">230</span>              new MetricsConnection.CallStats());<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      int index = 0;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      while (r.getSecond().advance()) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        assertTrue(CELL.equals(r.getSecond().current()));<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        index++;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      }<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      assertEquals(count, index);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    } finally {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      client.close();<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      rpcServer.stop();<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>  protected abstract AbstractRpcClient createRpcClientRTEDuringConnectionSetup(Configuration conf)<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      throws IOException;<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Test<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  public void testRTEDuringConnectionSetup() throws Exception {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    Configuration conf = HBaseConfiguration.create();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    TestRpcServer rpcServer = new TestRpcServer();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    AbstractRpcClient client = createRpcClientRTEDuringConnectionSetup(conf);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    try {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      rpcServer.start();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      if (address == null) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        throw new IOException("Listener channel is closed");<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      client.call(null, md, param, null, User.getCurrent(), address,<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          new MetricsConnection.CallStats());<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      fail("Expected an exception to have been thrown!");<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    } catch (Exception e) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      LOG.info("Caught expected exception: " + e.toString());<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      assertTrue(StringUtils.stringifyException(e).contains("Injected fault"));<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    } finally {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      client.close();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      rpcServer.stop();<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
-<span class="sourceLineNo">270</span><a name="line.270"></a>
-<span class="sourceLineNo">271</span>  /** Tests that the rpc scheduler is called when requests arrive. */<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  @Test<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  public void testRpcScheduler() throws IOException, InterruptedException {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    RpcScheduler scheduler = spy(new FifoRpcScheduler(CONF, 1));<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    RpcServer rpcServer = new TestRpcServer(scheduler, CONF);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    verify(scheduler).init((RpcScheduler.Context) anyObject());<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    AbstractRpcClient client = createRpcClient(CONF);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    try {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      rpcServer.start();<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      verify(scheduler).start();<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      if (address == null) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        throw new IOException("Listener channel is closed");<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        client.call(new PayloadCarryingRpcController(<a name="line.288"></a>
-<span class="sourceLineNo">289</span>            CellUtil.createCellScanner(ImmutableList.&lt;Cell&gt; of(CELL))), md, param,<a name="line.289"></a>
-<span class="sourceLineNo">290</span>            md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            new MetricsConnection.CallStats());<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      }<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      verify(scheduler, times(10)).dispatch((CallRunner) anyObject());<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    } finally {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      rpcServer.stop();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      verify(scheduler).stop();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /** Tests that the rpc scheduler is called when requests arrive. */<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  @Test<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  public void testRpcMaxRequestSize() throws IOException, InterruptedException {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    Configuration conf = new Configuration(CONF);<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    conf.setInt(RpcServer.MAX_REQUEST_SIZE, 100);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    RpcServer rpcServer = new TestRpcServer(conf);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    AbstractRpcClient client = createRpcClient(conf);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    try {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      rpcServer.start();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      // set total RPC size bigger than 100 bytes<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello.hello.hello.hello."<a name="line.311"></a>
-<span class="sourceLineNo">312</span>          + "hello.hello.hello.hello.hello.hello.hello.hello.hello.hello.hello.hello").build();<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      if (address == null) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        throw new IOException("Listener channel is closed");<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      }<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      try {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>        client.call(new PayloadCarryingRpcController(<a name="line.318"></a>
-<span class="sourceLineNo">319</span>          CellUtil.createCellScanner(ImmutableList.&lt;Cell&gt; of(CELL))), md, param,<a name="line.319"></a>
-<span class="sourceLineNo">320</span>          md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.320"></a>
-<span class="sourceLineNo">321</span>          new MetricsConnection.CallStats());<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        fail("RPC should have failed because it exceeds max request size");<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      } catch(ConnectionClosingException | ConnectionClosedException ex) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        // pass<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    } finally {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      rpcServer.stop();<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">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /**<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * Instance of RpcServer that echoes client hostAddress back to client<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   */<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  static class TestRpcServer1 extends RpcServer {<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    private static BlockingInterface SERVICE1 =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        new TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface() {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>          @Override<a name="line.338"></a>
-<span class="sourceLineNo">339</span>          public EmptyResponseProto ping(RpcController unused, EmptyRequestProto request)<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              throws ServiceException {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>            return EmptyResponseProto.newBuilder().build();<a name="line.341"></a>
-<span class="sourceLineNo">342</span>          }<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>          @Override<a name="line.344"></a>
-<span class="sourceLineNo">345</span>          public EchoResponseProto echo(RpcController unused, EchoRequestProto request)<a name="line.345"></a>
-<span class="sourceLineNo">346</span>              throws ServiceException {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>            final InetAddress remoteAddr = TestRpcServer1.getRemoteAddress();<a name="line.347"></a>
-<span class="sourceLineNo">348</span>            final String message = remoteAddr == null ? "NULL" : remoteAddr.getHostAddress();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>            return EchoResponseProto.newBuilder().setMessage(message).build();<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>          @Override<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          public EmptyResponseProto error(RpcController unused, EmptyRequestProto request)<a name="line.353"></a>
-<span class="sourceLineNo">354</span>              throws ServiceException {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>            throw new ServiceException("error", new IOException("error"));<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        };<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>    TestRpcServer1() throws IOException {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      this(new FifoRpcScheduler(CONF, 1));<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
-<span class="sourceLineNo">362</span><a name="line.362"></a>
-<span class="sourceLineNo">363</span>    TestRpcServer1(RpcScheduler scheduler) throws IOException {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      super(null, "testRemoteAddressInCallObject", Lists<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          .newArrayList(new BlockingServiceAndInterface(TestRpcServiceProtos.TestProtobufRpcProto<a name="line.365"></a>
-<span class="sourceLineNo">366</span>              .newReflectiveBlockingService(SERVICE1), null)),<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          new InetSocketAddress("localhost", 0), CONF, scheduler);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    }<a name="line.368"></a>
-<span class="sourceLineNo">369</span>  }<a name="line.369"></a>
-<span class="sourceLineNo">370</span><a name="line.370"></a>
-<span class="sourceLineNo">371</span>  /**<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   * Tests that the RpcServer creates &amp; dispatches CallRunner object to scheduler with non-null<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   * remoteAddress set to its Call Object<a name="line.373"></a>
-<span class="sourceLineNo">374</span>   * @throws ServiceException<a name="line.374"></a>
-<span class="sourceLineNo">375</span>   */<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  @Test<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  public void testRpcServerForNotNullRemoteAddressInCallObject() throws IOException,<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      ServiceException {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    final RpcScheduler scheduler = new FifoRpcScheduler(CONF, 1);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    final TestRpcServer1 rpcServer = new TestRpcServer1(scheduler);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    final InetSocketAddress localAddr = new InetSocketAddress("localhost", 0);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    final AbstractRpcClient client =<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        new RpcClientImpl(CONF, HConstants.CLUSTER_ID_DEFAULT, localAddr, null);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    try {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      rpcServer.start();<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      final InetSocketAddress isa = rpcServer.getListenerAddress();<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      if (isa == null) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        throw new IOException("Listener channel is closed");<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      final BlockingRpcChannel channel =<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          client.createBlockingRpcChannel(<a name="line.391"></a>
-<span class="sourceLineNo">392</span>            ServerName.valueOf(isa.getHostName(), isa.getPort(), System.currentTimeMillis()),<a name="line.392"></a>
-<span class="sourceLineNo">393</span>            User.getCurrent(), 0);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface stub =<a name="line.394"></a>
-<span class="sourceLineNo">395</span>          TestRpcServiceProtos.TestProtobufRpcProto.newBlockingStub(channel);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      final EchoRequestProto echoRequest =<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          EchoRequestProto.newBuilder().setMessage("GetRemoteAddress").build();<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      final EchoResponseProto echoResponse = stub.echo(null, echoRequest);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      Assert.assertEquals(localAddr.getAddress().getHostAddress(), echoResponse.getMessage());<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    } finally {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      client.close();<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      rpcServer.stop();<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  }<a name="line.404"></a>
-<span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  @Test<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  public void testWrapException() throws Exception {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    AbstractRpcClient client =<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        (AbstractRpcClient) RpcClientFactory.createClient(CONF, "AbstractTestIPC");<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    final InetSocketAddress address = InetSocketAddress.createUnresolved("localhost", 0);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    assertTrue(client.wrapException(address, new ConnectException()) instanceof ConnectException);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    assertTrue(client.wrapException(address,<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      new SocketTimeoutException()) instanceof SocketTimeoutException);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    assertTrue(client.wrapException(address, new ConnectionClosingException(<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        "Test AbstractRpcClient#wrapException")) instanceof ConnectionClosingException);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    assertTrue(client<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        .wrapException(address, new CallTimeoutException("Test AbstractRpcClient#wrapException"))<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        .getCause() instanceof CallTimeoutException);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  }<a name="line.419"></a>
-<span class="sourceLineNo">420</span>}<a name="line.420"></a>
+<span class="sourceLineNo">060</span>import org.junit.Assert;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.junit.Test;<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>import com.google.common.collect.ImmutableList;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import com.google.common.collect.Lists;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import com.google.protobuf.BlockingRpcChannel;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import com.google.protobuf.BlockingService;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import com.google.protobuf.Descriptors.MethodDescriptor;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import com.google.protobuf.Message;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import com.google.protobuf.RpcController;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import com.google.protobuf.ServiceException;<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>/**<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * Some basic ipc tests.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>public abstract class AbstractTestIPC {<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private static final Log LOG = LogFactory.getLog(AbstractTestIPC.class);<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private static byte[] CELL_BYTES = Bytes.toBytes("xyz");<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private static KeyValue CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, CELL_BYTES);<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  static byte[] BIG_CELL_BYTES = new byte[10 * 1024];<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  static KeyValue BIG_CELL = new KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, BIG_CELL_BYTES);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  static final Configuration CONF = HBaseConfiguration.create();<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  // We are using the test TestRpcServiceProtos generated classes and Service because they are<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  // available and basic with methods like 'echo', and ping. Below we make a blocking service<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  // by passing in implementation of blocking interface. We use this service in all tests that<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  // follow.<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  static final BlockingService SERVICE =<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      TestRpcServiceProtos.TestProtobufRpcProto<a name="line.89"></a>
+<span class="sourceLineNo">090</span>          .newReflectiveBlockingService(new TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface() {<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>            @Override<a name="line.92"></a>
+<span class="sourceLineNo">093</span>            public EmptyResponseProto ping(RpcController controller, EmptyRequestProto request)<a name="line.93"></a>
+<span class="sourceLineNo">094</span>                throws ServiceException {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>              return null;<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>            @Override<a name="line.98"></a>
+<span class="sourceLineNo">099</span>            public EmptyResponseProto error(RpcController controller, EmptyRequestProto request)<a name="line.99"></a>
+<span class="sourceLineNo">100</span>                throws ServiceException {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>              return null;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>            }<a name="line.102"></a>
+<span class="sourceLineNo">103</span><a name="line.103"></a>
+<span class="sourceLineNo">104</span>            @Override<a name="line.104"></a>
+<span class="sourceLineNo">105</span>            public EchoResponseProto echo(RpcController controller, EchoRequestProto request)<a name="line.105"></a>
+<span class="sourceLineNo">106</span>                throws ServiceException {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>              if (controller instanceof PayloadCarryingRpcController) {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>                PayloadCarryingRpcController pcrc = (PayloadCarryingRpcController) controller;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>                // If cells, scan them to check we are able to iterate what we were given and since<a name="line.109"></a>
+<span class="sourceLineNo">110</span>                // this is<a name="line.110"></a>
+<span class="sourceLineNo">111</span>                // an echo, just put them back on the controller creating a new block. Tests our<a name="line.111"></a>
+<span class="sourceLineNo">112</span>                // block<a name="line.112"></a>
+<span class="sourceLineNo">113</span>                // building.<a name="line.113"></a>
+<span class="sourceLineNo">114</span>                CellScanner cellScanner = pcrc.cellScanner();<a name="line.114"></a>
+<span class="sourceLineNo">115</span>                List&lt;Cell&gt; list = null;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>                if (cellScanner != null) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>                  list = new ArrayList&lt;Cell&gt;();<a name="line.117"></a>
+<span class="sourceLineNo">118</span>                  try {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>                    while (cellScanner.advance()) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>                      list.add(cellScanner.current());<a name="line.120"></a>
+<span class="sourceLineNo">121</span>                    }<a name="line.121"></a>
+<span class="sourceLineNo">122</span>                  } catch (IOException e) {<a name="line.122"></a>
+<span class="sourceLineNo">123</span>                    throw new ServiceException(e);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>                  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>                }<a name="line.125"></a>
+<span class="sourceLineNo">126</span>                cellScanner = CellUtil.createCellScanner(list);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>                ((PayloadCarryingRpcController) controller).setCellScanner(cellScanner);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>              }<a name="line.128"></a>
+<span class="sourceLineNo">129</span>              return EchoResponseProto.newBuilder().setMessage(request.getMessage()).build();<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>  /**<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * Instance of server. We actually don't do anything speical in here so could just use<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   * HBaseRpcServer directly.<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   */<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  static class TestRpcServer extends RpcServer {<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>    TestRpcServer() throws IOException {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      this(new FifoRpcScheduler(CONF, 1), CONF);<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>    TestRpcServer(Configuration conf) throws IOException {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      this(new FifoRpcScheduler(conf, 1), conf);<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>    TestRpcServer(RpcScheduler scheduler, Configuration conf) throws IOException {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      super(null, "testRpcServer", Lists<a name="line.148"></a>
+<span class="sourceLineNo">149</span>          .newArrayList(new BlockingServiceAndInterface(SERVICE, null)), new InetSocketAddress(<a name="line.149"></a>
+<span class="sourceLineNo">150</span>          "localhost", 0), conf, scheduler);<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>    @Override<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    public Pair&lt;Message, CellScanner&gt; call(BlockingService service, MethodDescriptor md,<a name="line.154"></a>
+<span class="sourceLineNo">155</span>        Message param, CellScanner cellScanner, long receiveTime, MonitoredRPCHandler status)<a name="line.155"></a>
+<span class="sourceLineNo">156</span>        throws IOException {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      return super.call(service, md, param, cellScanner, receiveTime, status);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    }<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>  protected abstract AbstractRpcClient createRpcClientNoCodec(Configuration conf);<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>   * Ensure we do not HAVE TO HAVE a codec.<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   * @throws InterruptedException<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * @throws IOException<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   */<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  @Test<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public void testNoCodec() throws InterruptedException, IOException {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    Configuration conf = HBaseConfiguration.create();<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    AbstractRpcClient client = createRpcClientNoCodec(conf);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    TestRpcServer rpcServer = new TestRpcServer();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    try {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      rpcServer.start();<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      final String message = "hello";<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(message).build();<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      if (address == null) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        throw new IOException("Listener channel is closed");<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      }<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      Pair&lt;Message, CellScanner&gt; r =<a name="line.182"></a>
+<span class="sourceLineNo">183</span>          client.call(null, md, param, md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.183"></a>
+<span class="sourceLineNo">184</span>              new MetricsConnection.CallStats());<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      assertTrue(r.getSecond() == null);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      // Silly assertion that the message is in the returned pb.<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      assertTrue(r.getFirst().toString().contains(message));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    } finally {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      client.close();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      rpcServer.stop();<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    }<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>  protected abstract AbstractRpcClient createRpcClient(Configuration conf);<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>  /**<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * It is hard to verify the compression is actually happening under the wraps. Hope that if<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * unsupported, we'll get an exception out of some time (meantime, have to trace it manually to<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * confirm that compression is happening down in the client and server).<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * @throws IOException<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * @throws InterruptedException<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * @throws SecurityException<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * @throws NoSuchMethodException<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  @Test<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  public void testCompressCellBlock() throws IOException, InterruptedException, SecurityException,<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      NoSuchMethodException, ServiceException {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    Configuration conf = new Configuration(HBaseConfiguration.create());<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    conf.set("hbase.client.rpc.compressor", GzipCodec.class.getCanonicalName());<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    List&lt;Cell&gt; cells = new ArrayList&lt;Cell&gt;();<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    int count = 3;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    for (int i = 0; i &lt; count; i++) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      cells.add(CELL);<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    }<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    AbstractRpcClient client = createRpcClient(conf);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    TestRpcServer rpcServer = new TestRpcServer();<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    try {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      rpcServer.start();<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      PayloadCarryingRpcController pcrc =<a name="line.221"></a>
+<span class="sourceLineNo">222</span>          new PayloadCarryingRpcController(CellUtil.createCellScanner(cells));<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      if (address == null) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        throw new IOException("Listener channel is closed");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      Pair&lt;Message, CellScanner&gt; r =<a name="line.227"></a>
+<span class="sourceLineNo">228</span>          client.call(pcrc, md, param, md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>              new MetricsConnection.CallStats());<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      int index = 0;<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      while (r.getSecond().advance()) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        assertTrue(CELL.equals(r.getSecond().current()));<a name="line.232"></a>
+<span class="sourceLineNo">233</span>        index++;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      assertEquals(count, index);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    } finally {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      client.close();<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      rpcServer.stop();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    }<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>  protected abstract AbstractRpcClient createRpcClientRTEDuringConnectionSetup(Configuration conf)<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      throws IOException;<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  @Test<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  public void testRTEDuringConnectionSetup() throws Exception {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    Configuration conf = HBaseConfiguration.create();<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    TestRpcServer rpcServer = new TestRpcServer();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    AbstractRpcClient client = createRpcClientRTEDuringConnectionSetup(conf);<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    try {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      rpcServer.start();<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      if (address == null) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        throw new IOException("Listener channel is closed");<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>      client.call(null, md, param, null, User.getCurrent(), address,<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          new MetricsConnection.CallStats());<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      fail("Expected an exception to have been thrown!");<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    } catch (Exception e) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      LOG.info("Caught expected exception: " + e.toString());<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      assertTrue(StringUtils.stringifyException(e).contains("Injected fault"));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    } finally {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      client.close();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      rpcServer.stop();<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>  /** Tests that the rpc scheduler is called when requests arrive. */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  @Test<a name="line.271"></a>
+<span class="sourceLineNo">272</span>  public void testRpcScheduler() throws IOException, InterruptedException {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    RpcScheduler scheduler = spy(new FifoRpcScheduler(CONF, 1));<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    RpcServer rpcServer = new TestRpcServer(scheduler, CONF);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    verify(scheduler).init((RpcScheduler.Context) anyObject());<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    AbstractRpcClient client = createRpcClient(CONF);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    try {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      rpcServer.start();<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      verify(scheduler).start();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello").build();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      if (address == null) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>        throw new IOException("Listener channel is closed");<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      }<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        client.call(new PayloadCarryingRpcController(<a name="line.287"></a>
+<span class="sourceLineNo">288</span>            CellUtil.createCellScanner(ImmutableList.&lt;Cell&gt; of(CELL))), md, param,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>            md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.289"></a>
+<span class="sourceLineNo">290</span>            new MetricsConnection.CallStats());<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      }<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      verify(scheduler, times(10)).dispatch((CallRunner) anyObject());<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    } finally {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      rpcServer.stop();<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      verify(scheduler).stop();<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><a name="line.298"></a>
+<span class="sourceLineNo">299</span>  /** Tests that the rpc scheduler is called when requests arrive. */<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  @Test<a name="line.300"></a>
+<span class="sourceLineNo">301</span>  public void testRpcMaxRequestSize() throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    Configuration conf = new Configuration(CONF);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    conf.setInt(RpcServer.MAX_REQUEST_SIZE, 100);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    RpcServer rpcServer = new TestRpcServer(conf);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    AbstractRpcClient client = createRpcClient(conf);<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    try {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      rpcServer.start();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName("echo");<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      // set total RPC size bigger than 100 bytes<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      EchoRequestProto param = EchoRequestProto.newBuilder().setMessage("hello.hello.hello.hello."<a name="line.310"></a>
+<span class="sourceLineNo">311</span>          + "hello.hello.hello.hello.hello.hello.hello.hello.hello.hello.hello.hello").build();<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      InetSocketAddress address = rpcServer.getListenerAddress();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      if (address == null) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>        throw new IOException("Listener channel is closed");<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      try {<a name="line.316"></a>
+<span class="sourceLineNo">317</span>        client.call(new PayloadCarryingRpcController(<a name="line.317"></a>
+<span class="sourceLineNo">318</span>          CellUtil.createCellScanner(ImmutableList.&lt;Cell&gt; of(CELL))), md, param,<a name="line.318"></a>
+<span class="sourceLineNo">319</span>          md.getOutputType().toProto(), User.getCurrent(), address,<a name="line.319"></a>
+<span class="sourceLineNo">320</span>          new MetricsConnection.CallStats());<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        fail("RPC should have failed because it exceeds max request size");<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      } catch(IOException ex) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>        // pass<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      }<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    } finally {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      rpcServer.stop();<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">330</span>  /**<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * Instance of RpcServer that echoes client hostAddress back to client<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   */<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  static class TestRpcServer1 extends RpcServer {<a name="line.333"></a>
+<span class="sourceLineNo">334</span><a name="line.334"></a>
+<span class="sourceLineNo">335</span>    private static BlockingInterface SERVICE1 =<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        new TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface() {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          @Override<a name="line.337"></a>
+<span class="sourceLineNo">338</span>          public EmptyResponseProto ping(RpcController unused, EmptyRequestProto request)<a name="line.338"></a>
+<span class="sourceLineNo">339</span>              throws ServiceException {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>            return EmptyResponseProto.newBuilder().build();<a name="line.340"></a>
+<span class="sourceLineNo">341</span>          }<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>          @Override<a name="line.343"></a>
+<span class="sourceLineNo">344</span>          public EchoResponseProto echo(RpcController unused, EchoRequestProto request)<a name="line.344"></a>
+<span class="sourceLineNo">345</span>              throws ServiceException {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>            final InetAddress remoteAddr = TestRpcServer1.getRemoteAddress();<a name="line.346"></a>
+<span class="sourceLineNo">347</span>            final String message = remoteAddr == null ? "NULL" : remoteAddr.getHostAddress();<a name="line.347"></a>
+<span class="sourceLineNo">348</span>            return EchoResponseProto.newBuilder().setMessage(message).build();<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 EmptyResponseProto error(RpcController unused, EmptyRequestProto request)<a name="line.352"></a>
+<span class="sourceLineNo">353</span>              throws ServiceException {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>            throw new ServiceException("error", new IOException("error"));<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><a name="line.357"></a>
+<span class="sourceLineNo">358</span>    TestRpcServer1() throws IOException {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      this(new FifoRpcScheduler(CONF, 1));<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>    TestRpcServer1(RpcScheduler scheduler) throws IOException {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      super(null, "testRemoteAddressInCallObject", Lists<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          .newArrayList(new BlockingServiceAndInterface(TestRpcServiceProtos.TestProtobufRpcProto<a name="line.364"></a>
+<span class="sourceLineNo">365</span>              .newReflectiveBlockingService(SERVICE1), null)),<a name="line.365"></a>
+<span class="sourceLineNo">366</span>          new InetSocketAddress("localhost", 0), CONF, scheduler);<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><a name="line.369"></a>
+<span class="sourceLineNo">370</span>  /**<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   * Tests that the RpcServer creates &amp; dispatches CallRunner object to scheduler with non-null<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   * remoteAddress set to its Call Object<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   * @throws ServiceException<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   */<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  @Test<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  public void testRpcServerForNotNullRemoteAddressInCallObject() throws IOException,<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      ServiceException {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    final RpcScheduler scheduler = new FifoRpcScheduler(CONF, 1);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    final TestRpcServer1 rpcServer = new TestRpcServer1(scheduler);<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    final InetSocketAddress localAddr = new InetSocketAddress("localhost", 0);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    final AbstractRpcClient client =<a name="line.381"></a>
+<span class="sourceLineNo">382</span>        new RpcClientImpl(CONF, HConstants.CLUSTER_ID_DEFAULT, localAddr, null);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    try {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      rpcServer.start();<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      final InetSocketAddress isa = rpcServer.getListenerAddress();<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      if (isa == null) {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        throw new IOException("Listener channel is closed");<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      final BlockingRpcChannel channel =<a name="line.389"></a>
+<span class="sourceLineNo">390</span>          client.createBlockingRpcChannel(<a name="line.390"></a>
+<span class="sourceLineNo">391</span>            ServerName.valueOf(isa.getHostName(), isa.getPort(), System.currentTimeMillis()),<a name="line.391"></a>
+<span class="sourceLineNo">392</span>            User.getCurrent(), 0);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface stub =<a name="line.393"></a>
+<span class="sourceLineNo">394</span>          TestRpcServiceProtos.TestProtobufRpcProto.newBlockingStub(channel);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      final EchoRequestProto echoRequest =<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          EchoRequestProto.newBuilder().setMessage("GetRemoteAddress").build();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      final EchoResponseProto echoResponse = stub.echo(null, echoRequest);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      Assert.assertEquals(localAddr.getAddress().getHostAddress(), echoResponse.getMessage());<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    } finally {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      client.close();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      rpcServer.stop();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    }<a name="line.402"></a>
+<span class="sourceLineNo">403</span>  }<a name="line.403"></a>
+<span class="sourceLineNo">404</span><a name="line.404"></a>
+<span class="sourceLineNo">405</span>  @Test<a name="line.405"></a>
+<span class="sourceLineNo">406</span>  public void testWrapException() throws Exception {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    AbstractRpcClient client =<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        (AbstractRpcClient) RpcClientFactory.createClient(CONF, "AbstractTestIPC");<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    final InetSocketAddress address = InetSocketAddress.createUnresolved("localhost", 0);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    assertTrue(client.wrapException(address, new ConnectException()) instanceof ConnectException);<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    assertTrue(client.wrapException(address,<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      new SocketTimeoutException()) instanceof SocketTimeoutException);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    assertTrue(client.wrapException(address, new ConnectionClosingException(<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        "Test AbstractRpcClient#wrapException")) instanceof ConnectionClosingException);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    assertTrue(client<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        .wrapException(address, new CallTimeoutException("Test AbstractRpcClient#wrapException"))<a name="line.416"></a>
+<span class="sourceLineNo">417</span>        .getCause() instanceof CallTimeoutException);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>  }<a name="line.418"></a>
+<span class="sourceLineNo">419</span>}<a name="line.419"></a>
 
 
 


[49/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 24f7a41..22eb786 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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <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>1712</td>
 <td>0</td>
 <td>0</td>
-<td>12614</td></tr></table></div>
+<td>12615</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -1571,7 +1571,7 @@
 <td><a href="#org.apache.hadoop.hbase.filter.TimestampsFilter.java">org/apache/hadoop/hbase/filter/TimestampsFilter.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>8</td></tr>
+<td>7</td></tr>
 <tr class="b">
 <td><a href="#org.apache.hadoop.hbase.filter.ValueFilter.java">org/apache/hadoop/hbase/filter/ValueFilter.java</a></td>
 <td>0</td>
@@ -3601,7 +3601,7 @@
 <td><a href="#org.apache.hadoop.hbase.regionserver.KeyValueScanner.java">org/apache/hadoop/hbase/regionserver/KeyValueScanner.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>3</td></tr>
+<td>4</td></tr>
 <tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.LeaseException.java">org/apache/hadoop/hbase/regionserver/LeaseException.java</a></td>
 <td>0</td>
@@ -3826,7 +3826,7 @@
 <td><a href="#org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>27</td></tr>
+<td>21</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ScanWildcardColumnTracker.java">org/apache/hadoop/hbase/regionserver/ScanWildcardColumnTracker.java</a></td>
 <td>0</td>
@@ -3916,7 +3916,7 @@
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreScanner.java">org/apache/hadoop/hbase/regionserver/StoreScanner.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>152</td></tr>
+<td>159</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreUtils.java">org/apache/hadoop/hbase/regionserver/StoreUtils.java</a></td>
 <td>0</td>
@@ -6080,19 +6080,19 @@
 <li>arrayInitIndent: <tt>&quot;2&quot;</tt></li>
 <li>throwsIndent: <tt>&quot;2&quot;</tt></li>
 <li>basicOffset: <tt>&quot;2&quot;</tt></li></ul></td>
-<td>4513</td>
+<td>4519</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>javadoc</td>
 <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>769</td>
+<td>770</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_javadoc.html#NonEmptyAtclauseDescription">NonEmptyAtclauseDescription</a></td>
-<td>3395</td>
+<td>3389</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>misc</td>
@@ -12196,19 +12196,19 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/AsyncProcess.html#L1540">1540</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/AsyncProcess.html#L1558">1558</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/AsyncProcess.html#L1649">1649</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/AsyncProcess.html#L1667">1667</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/AsyncProcess.html#L1756">1756</a></td></tr></table></div>
+<td><a href="./xref/org/apache/hadoop/hbase/client/AsyncProcess.html#L1774">1774</a></td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.BufferedMutator.java">org/apache/hadoop/hbase/client/BufferedMutator.java</h3>
 <table border="0" class="table table-striped">
@@ -14516,7 +14516,7 @@
 <tr class="a">
 <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#L1768">1768</a></td></tr>
 <tr class="b">
@@ -15175,259 +15175,259 @@
 <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/MetricsConnection.html#L415">415</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L416">416</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L417">417</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L418">418</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L417">417</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L418">418</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L418">418</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L419">419</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 6, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L419">419</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L420">420</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L421">421</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L422">422</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'member def modifier' have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L421">421</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L422">422</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'switch' have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L422">422</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L423">423</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 8, expected level should be 12.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L423">423</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L424">424</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 10, expected level should be 14.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L424">424</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L425">425</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child have incorrect indentation level 10, expected level should be 14.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L424">424</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L425">425</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 10, expected level should be 14.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L425">425</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L426">426</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 8, expected level should be 12.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L426">426</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L427">427</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 10, expected level should be 14.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L427">427</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L428">428</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child have incorrect indentation level 10, expected level should be 14.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L427">427</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L428">428</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 10, expected level should be 14.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L428">428</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L429">429</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 8, expected level should be 12.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L429">429</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L430">430</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 10, expected level should be 14.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L430">430</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L431">431</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child have incorrect indentation level 10, expected level should be 14.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L430">430</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L431">431</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 10, expected level should be 14.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L431">431</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L432">432</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 8, expected level should be 12.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L432">432</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L433">433</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 10, expected level should be 14.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L433">433</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L434">434</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child have incorrect indentation level 10, expected level should be 14.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L433">433</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L434">434</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 10, expected level should be 14.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L434">434</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L435">435</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 8, expected level should be 12.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L435">435</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L436">436</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 10, expected level should be 14.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L436">436</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L437">437</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'switch rcurly' have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L437">437</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L438">438</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 6, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L438">438</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L439">439</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L440">440</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L441">441</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L440">440</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L441">441</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L441">441</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L442">442</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 6, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L442">442</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L443">443</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L445">445</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L446">446</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 6, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L446">446</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L447">447</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L449">449</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L450">450</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 6, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L450">450</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L451">451</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L453">453</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L454">454</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 6, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L454">454</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L455">455</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L456">456</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L457">457</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L456">456</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L457">457</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L457">457</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L458">458</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child have incorrect indentation level 6, expected level should be 8.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L458">458</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L459">459</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child have incorrect indentation level 8, expected level should be 10.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L459">459</a></td></tr></table></div>
+<td><a href="./xref/org/apache/hadoop/hbase/client/MetricsConnection.html#L460">460</a></td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.MultiAction.java">org/apache/hadoop/hbase/client/MultiAction.java</h3>
 <table border="0" class="table table-striped">
@@ -24943,89 +24943,83 @@
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'com.google.common.base.Preconditions' import.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/filter/TimestampsFilter.html#L31">31</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/filter/TimestampsFilter.html#L32">32</a></td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 135).</td>
-<td><a href="./xref/org/apache/hadoop/hbase/filter/TimestampsFilter.html#L40">40</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/filter/TimestampsFilter.html#L41">41</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/filter/TimestampsFilter.html#L59">59</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/filter/TimestampsFilter.html#L58">58</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/filter/TimestampsFilter.html#L132">132</a></td></tr>
+<td><a href="./xref/org/apache/hadoop/hbase/filter/TimestampsFilter.html#L198">198</a></td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/filter/TimestampsFilter.html#L147">147</a></td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td><a href="./xref/org/apache/hadoop/hbase/filter/TimestampsFilter.html#L149">149</a></td></tr>
-<tr class="b">
+<td><a href="./xref/org/apache/hadoop/hbase/filter/TimestampsFilter.html#L200">200</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/filter/TimestampsFilter.html#L152">152</a></td></tr>
-<tr class="a">
+<td><a href="./xref/org/apache/hadoop/hbase/filter/TimestampsFilter.html#L203">203</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/filter/TimestampsFilter.html#L153">153</a></td></tr></table></div>
+<td><a href="./xref/org/apache/hadoop/hbase/filter/TimestampsFilter.html#L204">204</a></td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.ValueFilter.java">org/apache/hadoop/hbase/filter/ValueFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'com.google.protobuf.InvalidProtocolBufferException' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/filter/ValueFilter.html#L32">32</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/filter/ValueFilter.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>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/filter/ValueFilter.html#L115">115</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/filter/ValueFilter.html#L117">117</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/filter/ValueFilter.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>blocks</td>
 <td>NeedBraces</td>
@@ -25034,43 +25028,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.filter.WhileMatchFilter.java">org/apache/hadoop/hbase/filter/WhileMatchFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</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.InvalidProtocolBufferException' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/filter/WhileMatchFilter.html#L31">31</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/filter/WhileMatchFilter.html#L119">119</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/filter/WhileMatchFilter.html#L138">138</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/filter/WhileMatchFilter.html#L140">140</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/filter/WhileMatchFilter.html#L143">143</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>
@@ -25079,199 +25073,199 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.fs.HFileSystem.java">org/apache/hadoop/hbase/fs/HFileSystem.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' should be on the previous line.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L268">268</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 modifier' have incorrect indentation level 14, expected level should be one of the following: 8, 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L271">271</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>'try' have incorrect indentation level 16, expected level should be one of the following: 10, 12.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L273">273</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>'if' have incorrect indentation level 18, expected level should be one of the following: 12, 14.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L274">274</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 20, expected level should be one of the following: 14, 16.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L276">276</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>'if' child have incorrect indentation level 20, expected level should be one of the following: 14, 16.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L277">277</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 rcurly' have incorrect indentation level 18, expected level should be one of the following: 12, 14.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L278">278</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>'else' child have incorrect indentation level 20, expected level should be one of the following: 14, 16.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L279">279</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>'member def type' have incorrect indentation level 20, expected level should be one of the following: 14, 16.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L279">279</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>'if' have incorrect indentation level 20, expected level should be one of the following: 14, 16.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L280">280</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 22, expected level should be one of the following: 16, 18.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L285">285</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>'if rcurly' have incorrect indentation level 20, expected level should be one of the following: 14, 16.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L286">286</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>'else' child have incorrect indentation level 20, expected level should be one of the following: 14, 16.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L287">287</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>'else rcurly' have incorrect indentation level 18, expected level should be one of the following: 12, 14.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L288">288</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>'try rcurly' have incorrect indentation level 16, expected level should be one of the following: 10, 12.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L289">289</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>'catch' child have incorrect indentation level 18, expected level should be one of the following: 12, 14.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L292">292</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>'member def type' have incorrect indentation level 18, expected level should be one of the following: 12, 14.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L292">292</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>'if' have incorrect indentation level 18, expected level should be one of the following: 12, 14.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L293">293</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 20, expected level should be one of the following: 14, 16.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L294">294</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>'if rcurly' have incorrect indentation level 18, expected level should be one of the following: 12, 14.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L296">296</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' have incorrect indentation level 18, expected level should be one of the following: 12, 14.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L297">297</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>'if' child have incorrect indentation level 20, expected level should be one of the following: 14, 16.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L298">298</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>'member def type' have incorrect indentation level 20, expected level should be one of the following: 14, 16.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L298">298</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>'if' have incorrect indentation level 20, expected level should be one of the following: 14, 16.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L299">299</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 22, expected level should be one of the following: 16, 18.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L300">300</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>'if rcurly' have incorrect indentation level 20, expected level should be one of the following: 14, 16.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L301">301</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 20, expected level should be one of the following: 14, 16.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L302">302</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>'if rcurly' have incorrect indentation level 18, expected level should be one of the following: 12, 14.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L303">303</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>'catch' child have incorrect indentation level 18, expected level should be one of the following: 12, 14.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L304">304</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>'catch rcurly' have incorrect indentation level 16, expected level should be one of the following: 10, 12.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L305">305</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 rcurly' have incorrect indentation level 14, expected level should be one of the following: 8, 10.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/fs/HFileSystem.html#L306">306</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>
@@ -25280,91 +25274,91 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.ClickjackingPreventionFilter.java">org/apache/hadoop/hbase/http/ClickjackingPreventionFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/ClickjackingPreventionFilter.html#L27">27</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 'org.apache.hadoop.hbase.HBaseInterfaceAudience' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/ClickjackingPreventionFilter.html#L30">30</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>'member def modifier' have incorrect indentation level 4, expected level should be 2.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/ClickjackingPreventionFilter.html#L35">35</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 modifier' have incorrect indentation level 4, expected level should be 2.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/ClickjackingPreventionFilter.html#L37">37</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 8, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/ClickjackingPreventionFilter.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>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 4, expected level should be 2.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/ClickjackingPreventionFilter.html#L40">40</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 modifier' have incorrect indentation level 4, expected level should be 2.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/ClickjackingPreventionFilter.html#L42">42</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>'member def type' have incorrect indentation level 8, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/ClickjackingPreventionFilter.html#L46">46</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 8, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/ClickjackingPreventionFilter.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>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/ClickjackingPreventionFilter.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>indentation</td>
 <td>Indentation</td>
 <td>'method def' child have incorrect indentation level 8, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/ClickjackingPreventionFilter.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>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' have incorrect indentation level 4, expected level should be 2.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/ClickjackingPreventionFilter.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>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' have incorrect indentation level 4, expected level should be 2.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/ClickjackingPreventionFilter.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>indentation</td>
 <td>Indentation</td>
@@ -25373,109 +25367,109 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.HtmlQuoting.java">org/apache/hadoop/hbase/http/HtmlQuoting.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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/http/HtmlQuoting.html#L27">27</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>'if' child have incorrect indentation level 8, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HtmlQuoting.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>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/http/HtmlQuoting.html#L48">48</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/http/HtmlQuoting.html#L49">49</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/http/HtmlQuoting.html#L50">50</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/http/HtmlQuoting.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>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/http/HtmlQuoting.html#L52">52</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/http/HtmlQuoting.html#L53">53</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/http/HtmlQuoting.html#L54">54</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/http/HtmlQuoting.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>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/http/HtmlQuoting.html#L86">86</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/http/HtmlQuoting.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>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/http/HtmlQuoting.html#L88">88</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/http/HtmlQuoting.html#L89">89</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/http/HtmlQuoting.html#L90">90</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/http/HtmlQuoting.html#L91">91</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>
@@ -25484,19 +25478,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.HttpConfig.java">org/apache/hadoop/hbase/http/HttpConfig.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpConfig.html#L22">22</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>
@@ -25505,19 +25499,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.HttpRequestLog.java">org/apache/hadoop/hbase/http/HttpRequestLog.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.commons.logging.Log' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpRequestLog.html#L23">23</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
@@ -25526,13 +25520,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.HttpRequestLogAppender.java">org/apache/hadoop/hbase/http/HttpRequestLogAppender.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -25541,283 +25535,283 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.HttpServer.java">org/apache/hadoop/hbase/http/HttpServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.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>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.ReflectionUtils' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.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>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'com.google.common.base.Preconditions' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.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>design</td>
 <td>FinalClass</td>
 <td>Class ListenerInfo should be declared as final.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.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>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/http/HttpServer.html#L178">178</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L180">180</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L182">182</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L241">241</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L250">250</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L259">259</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 8, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L306">306</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 8, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L307">307</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 rcurly' have incorrect indentation level 6, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L308">308</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 8, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L311">311</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 8, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L312">312</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 rcurly' have incorrect indentation level 6, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L313">313</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L394">394</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>'ctor def rparen' have incorrect indentation level 6, expected level should be 2.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L396">396</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L400">400</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L420">420</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L435">435</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L441">441</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L460">460</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L481">481</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/http/HttpServer.html#L632">632</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>'if' child have incorrect indentation level 8, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L639">639</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/http/HttpServer.html#L696">696</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>'if' child have incorrect indentation level 7, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L783">783</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 7, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L784">784</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>'member def type' have incorrect indentation level 7, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L784">784</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 7, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L785">785</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>'member def type' have incorrect indentation level 7, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L785">785</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 7, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L786">786</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>'if' child have incorrect indentation level 7, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L787">787</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 7, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L788">788</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>'if' child have incorrect indentation level 7, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L789">789</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/http/HttpServer.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/http/HttpServer.html#L884">884</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L895">895</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/http/HttpServer.html#L908">908</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/http/HttpServer.html#L997">997</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 109).</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/HttpServer.html#L1104">1104</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/http/HttpServer.html#L1149">1149</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/http/HttpServer.html#L1150">1150</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/http/HttpServer.html#L1153">1153</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
@@ -25826,79 +25820,79 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.InfoServer.java">org/apache/hadoop/hbase/http/InfoServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/InfoServer.html#L29">29</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/http/InfoServer.html#L52">52</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>'ctor def' child have incorrect indentation level 6, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/InfoServer.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>'ctor def' child have incorrect indentation level 6, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/InfoServer.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>indentation</td>
 <td>Indentation</td>
 <td>'member def type' have incorrect indentation level 6, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/InfoServer.html#L65">65</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' have incorrect indentation level 6, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/InfoServer.html#L66">66</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>'if' child have incorrect indentation level 8, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/InfoServer.html#L67">67</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 rcurly' have incorrect indentation level 6, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/InfoServer.html#L68">68</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>'if' child have incorrect indentation level 4, expected level should be 6.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/InfoServer.html#L70">70</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 call' child have incorrect indentation level 6, expected level should be 8.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/InfoServer.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>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/http/InfoServer.html#L83">83</a></td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
@@ -25907,19 +25901,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.NoCacheFilter.java">org/apache/hadoop/hbase/http/NoCacheFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<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/http/NoCacheFilter.html#L27">27</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>
@@ -25928,13 +25922,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.ServerConfigurationKeys.java">org/apache/hadoop/hbase/http/ServerConfigurationKeys.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>InterfaceIsType</td>
@@ -25943,19 +25937,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.SslSocketConnectorSecure.java">org/apache/hadoop/hbase/http/SslSocketConnectorSecure.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'javax.net.ssl.SSLServerSocket' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/SslSocketConnectorSecure.html#L23">23</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>
@@ -25964,13 +25958,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.conf.ConfServlet.java">org/apache/hadoop/hbase/http/conf/ConfServlet.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -25979,19 +25973,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.jmx.JMXJsonServlet.java">org/apache/hadoop/hbase/http/jmx/JMXJsonServlet.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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/http/jmx/JMXJsonServlet.html#L208">208</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>
@@ -26000,25 +25994,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.lib.StaticUserWebFilter.java">org/apache/hadoop/hbase/http/lib/StaticUserWebFilter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/lib/StaticUserWebFilter.html#L35">35</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 'javax.servlet.Filter' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/lib/StaticUserWebFilter.html#L40">40</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>
@@ -26027,49 +26021,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.http.log.LogLevel.java">org/apache/hadoop/hbase/http/log/LogLevel.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/log/LogLevel.html#L45">45</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>'for' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/log/LogLevel.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>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/log/LogLevel.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>'method def rparen' have incorrect indentation level 8, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/log/LogLevel.html#L101">101</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>'for' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/log/LogLevel.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>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/http/log/LogLevel.html#L171">171</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
@@ -26078,31 +26072,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.BoundedByteBufferPool.java">org/apache/hadoop/hbase/io/BoundedByteBufferPool.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</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.annotations.VisibleForTesting' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/io/BoundedByteBufferPool.html#L30">30</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/io/BoundedByteBufferPool.html#L103">103</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/io/BoundedByteBufferPool.html#L104">104</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>
@@ -26111,25 +26105,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.ByteBuffInputStream.java">org/apache/hadoop/hbase/io/ByteBuffInputStream.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child have incorrect indentation level 6, expected level should be 4.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/io/ByteBuffInputStream.html#L36">36</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/io/ByteBuffInputStream.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>misc</td>
 <td>ArrayTypeStyle</td>
@@ -26138,43 +26132,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.ByteBufferOutputStream.java">org/apache/hadoop/hbase/io/ByteBufferOutputStream.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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/io/ByteBufferOutputStream.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>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/io/ByteBufferOutputStream.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/io/ByteBufferOutputStream.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>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/io/ByteBufferOutputStream.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>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/io/ByteBufferOutputStream.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>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
@@ -26183,19 +26177,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.CellOutputStream.java">org/apache/hadoop/hbase/io/CellOutputStream.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</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/io/CellOutputStream.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>NonEmptyAtclauseDescription</td>
@@ -26204,49 +26198,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.FSDataInputStreamWrapper.java">org/apache/hadoop/hbase/io/FSDataInputStreamWrapper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<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.annotations.VisibleForTesting' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/io/FSDataInputStreamWrapper.html#L27">27</a></td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/io/FSDataInputStreamWrapper.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>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/io/FSDataInputStreamWrapper.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>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/io/FSDataInputStreamWrapper.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>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/io/FSDataInputStreamWrapper.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>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/io/FSDataInputStreamWrapper.html#L165">165</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>
@@ -26255,85 +26249,85 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.FileLink.java">org/apache/hadoop/hbase/io/FileLink.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.IOException' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/io/FileLink.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>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.io.FileNotFoundException' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/io/FileLink.html#L26">26</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 'org.apache.hadoop.fs.FSDataInputStream' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/io/FileLink.html#L32">32</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 'org.apache.hadoop.fs.FileStatus' import.</td>
 <td><a href="./xref/org/apache/hadoop/hbase/io/FileLink.html#L34">34</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/io/FileLink.html#L137">137</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 7, expected level should be 6.</td>
 <td>

<TRUNCATED>

[03/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/xref-test/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
----------------------------------------------------------------------
diff --git a/xref-test/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html b/xref-test/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
index 41ce0e5..b059f72 100644
--- a/xref-test/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
+++ b/xref-test/org/apache/hadoop/hbase/ipc/AbstractTestIPC.html
@@ -67,367 +67,366 @@
 <a class="jxr_linenumber" name="57" href="#57">57</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.util.Pair;
 <a class="jxr_linenumber" name="58" href="#58">58</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.io.compress.GzipCodec;
 <a class="jxr_linenumber" name="59" href="#59">59</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.util.StringUtils;
-<a class="jxr_linenumber" name="60" href="#60">60</a>  <strong class="jxr_keyword">import</strong> org.apache.http.ConnectionClosedException;
-<a class="jxr_linenumber" name="61" href="#61">61</a>  <strong class="jxr_keyword">import</strong> org.junit.Assert;
-<a class="jxr_linenumber" name="62" href="#62">62</a>  <strong class="jxr_keyword">import</strong> org.junit.Test;
-<a class="jxr_linenumber" name="63" href="#63">63</a>  
-<a class="jxr_linenumber" name="64" href="#64">64</a>  <strong class="jxr_keyword">import</strong> com.google.common.collect.ImmutableList;
-<a class="jxr_linenumber" name="65" href="#65">65</a>  <strong class="jxr_keyword">import</strong> com.google.common.collect.Lists;
-<a class="jxr_linenumber" name="66" href="#66">66</a>  <strong class="jxr_keyword">import</strong> com.google.protobuf.BlockingRpcChannel;
-<a class="jxr_linenumber" name="67" href="#67">67</a>  <strong class="jxr_keyword">import</strong> com.google.protobuf.BlockingService;
-<a class="jxr_linenumber" name="68" href="#68">68</a>  <strong class="jxr_keyword">import</strong> com.google.protobuf.Descriptors.MethodDescriptor;
-<a class="jxr_linenumber" name="69" href="#69">69</a>  <strong class="jxr_keyword">import</strong> com.google.protobuf.Message;
-<a class="jxr_linenumber" name="70" href="#70">70</a>  <strong class="jxr_keyword">import</strong> com.google.protobuf.RpcController;
-<a class="jxr_linenumber" name="71" href="#71">71</a>  <strong class="jxr_keyword">import</strong> com.google.protobuf.ServiceException;
-<a class="jxr_linenumber" name="72" href="#72">72</a>  
-<a class="jxr_linenumber" name="73" href="#73">73</a>  <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="74" href="#74">74</a>  <em class="jxr_javadoccomment"> * Some basic ipc tests.</em>
-<a class="jxr_linenumber" name="75" href="#75">75</a>  <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="76" href="#76">76</a>  <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">abstract</strong> <strong class="jxr_keyword">class</strong> <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">AbstractTestIPC</a> {
-<a class="jxr_linenumber" name="77" href="#77">77</a>  
-<a class="jxr_linenumber" name="78" href="#78">78</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> Log LOG = LogFactory.getLog(AbstractTestIPC.<strong class="jxr_keyword">class</strong>);
-<a class="jxr_linenumber" name="79" href="#79">79</a>  
-<a class="jxr_linenumber" name="80" href="#80">80</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> byte[] CELL_BYTES = Bytes.toBytes(<span class="jxr_string">"xyz"</span>);
-<a class="jxr_linenumber" name="81" href="#81">81</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> KeyValue CELL = <strong class="jxr_keyword">new</strong> KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, CELL_BYTES);
-<a class="jxr_linenumber" name="82" href="#82">82</a>    <strong class="jxr_keyword">static</strong> byte[] BIG_CELL_BYTES = <strong class="jxr_keyword">new</strong> byte[10 * 1024];
-<a class="jxr_linenumber" name="83" href="#83">83</a>    <strong class="jxr_keyword">static</strong> KeyValue BIG_CELL = <strong class="jxr_keyword">new</strong> KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, BIG_CELL_BYTES);
-<a class="jxr_linenumber" name="84" href="#84">84</a>    <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> Configuration CONF = HBaseConfiguration.create();
-<a class="jxr_linenumber" name="85" href="#85">85</a>    <em class="jxr_comment">// We are using the test TestRpcServiceProtos generated classes and Service because they are</em>
-<a class="jxr_linenumber" name="86" href="#86">86</a>    <em class="jxr_comment">// available and basic with methods like 'echo', and ping. Below we make a blocking service</em>
-<a class="jxr_linenumber" name="87" href="#87">87</a>    <em class="jxr_comment">// by passing in implementation of blocking interface. We use this service in all tests that</em>
-<a class="jxr_linenumber" name="88" href="#88">88</a>    <em class="jxr_comment">// follow.</em>
-<a class="jxr_linenumber" name="89" href="#89">89</a>    <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> BlockingService SERVICE =
-<a class="jxr_linenumber" name="90" href="#90">90</a>        TestRpcServiceProtos.TestProtobufRpcProto
-<a class="jxr_linenumber" name="91" href="#91">91</a>            .newReflectiveBlockingService(<strong class="jxr_keyword">new</strong> TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface() {
-<a class="jxr_linenumber" name="92" href="#92">92</a>  
-<a class="jxr_linenumber" name="93" href="#93">93</a>              @Override
-<a class="jxr_linenumber" name="94" href="#94">94</a>              <strong class="jxr_keyword">public</strong> EmptyResponseProto ping(RpcController controller, EmptyRequestProto request)
-<a class="jxr_linenumber" name="95" href="#95">95</a>                  <strong class="jxr_keyword">throws</strong> ServiceException {
-<a class="jxr_linenumber" name="96" href="#96">96</a>                <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="97" href="#97">97</a>              }
-<a class="jxr_linenumber" name="98" href="#98">98</a>  
-<a class="jxr_linenumber" name="99" href="#99">99</a>              @Override
-<a class="jxr_linenumber" name="100" href="#100">100</a>             <strong class="jxr_keyword">public</strong> EmptyResponseProto error(RpcController controller, EmptyRequestProto request)
-<a class="jxr_linenumber" name="101" href="#101">101</a>                 <strong class="jxr_keyword">throws</strong> ServiceException {
-<a class="jxr_linenumber" name="102" href="#102">102</a>               <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="103" href="#103">103</a>             }
-<a class="jxr_linenumber" name="104" href="#104">104</a> 
-<a class="jxr_linenumber" name="105" href="#105">105</a>             @Override
-<a class="jxr_linenumber" name="106" href="#106">106</a>             <strong class="jxr_keyword">public</strong> EchoResponseProto echo(RpcController controller, EchoRequestProto request)
-<a class="jxr_linenumber" name="107" href="#107">107</a>                 <strong class="jxr_keyword">throws</strong> ServiceException {
-<a class="jxr_linenumber" name="108" href="#108">108</a>               <strong class="jxr_keyword">if</strong> (controller instanceof PayloadCarryingRpcController) {
-<a class="jxr_linenumber" name="109" href="#109">109</a>                 PayloadCarryingRpcController pcrc = (PayloadCarryingRpcController) controller;
-<a class="jxr_linenumber" name="110" href="#110">110</a>                 <em class="jxr_comment">// If cells, scan them to check we are able to iterate what we were given and since</em>
-<a class="jxr_linenumber" name="111" href="#111">111</a>                 <em class="jxr_comment">// this is</em>
-<a class="jxr_linenumber" name="112" href="#112">112</a>                 <em class="jxr_comment">// an echo, just put them back on the controller creating a new block. Tests our</em>
-<a class="jxr_linenumber" name="113" href="#113">113</a>                 <em class="jxr_comment">// block</em>
-<a class="jxr_linenumber" name="114" href="#114">114</a>                 <em class="jxr_comment">// building.</em>
-<a class="jxr_linenumber" name="115" href="#115">115</a>                 CellScanner cellScanner = pcrc.cellScanner();
-<a class="jxr_linenumber" name="116" href="#116">116</a>                 List&lt;Cell&gt; list = <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="117" href="#117">117</a>                 <strong class="jxr_keyword">if</strong> (cellScanner != <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="118" href="#118">118</a>                   list = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
-<a class="jxr_linenumber" name="119" href="#119">119</a>                   <strong class="jxr_keyword">try</strong> {
-<a class="jxr_linenumber" name="120" href="#120">120</a>                     <strong class="jxr_keyword">while</strong> (cellScanner.advance()) {
-<a class="jxr_linenumber" name="121" href="#121">121</a>                       list.add(cellScanner.current());
-<a class="jxr_linenumber" name="122" href="#122">122</a>                     }
-<a class="jxr_linenumber" name="123" href="#123">123</a>                   } <strong class="jxr_keyword">catch</strong> (IOException e) {
-<a class="jxr_linenumber" name="124" href="#124">124</a>                     <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> ServiceException(e);
-<a class="jxr_linenumber" name="125" href="#125">125</a>                   }
-<a class="jxr_linenumber" name="126" href="#126">126</a>                 }
-<a class="jxr_linenumber" name="127" href="#127">127</a>                 cellScanner = CellUtil.createCellScanner(list);
-<a class="jxr_linenumber" name="128" href="#128">128</a>                 ((PayloadCarryingRpcController) controller).setCellScanner(cellScanner);
-<a class="jxr_linenumber" name="129" href="#129">129</a>               }
-<a class="jxr_linenumber" name="130" href="#130">130</a>               <strong class="jxr_keyword">return</strong> EchoResponseProto.newBuilder().setMessage(request.getMessage()).build();
-<a class="jxr_linenumber" name="131" href="#131">131</a>             }
-<a class="jxr_linenumber" name="132" href="#132">132</a>           });
-<a class="jxr_linenumber" name="133" href="#133">133</a> 
-<a class="jxr_linenumber" name="134" href="#134">134</a>   <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="135" href="#135">135</a> <em class="jxr_javadoccomment">   * Instance of server. We actually don't do anything speical in here so could just use</em>
-<a class="jxr_linenumber" name="136" href="#136">136</a> <em class="jxr_javadoccomment">   * HBaseRpcServer directly.</em>
-<a class="jxr_linenumber" name="137" href="#137">137</a> <em class="jxr_javadoccomment">   */</em>
-<a class="jxr_linenumber" name="138" href="#138">138</a>   <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">class</strong> <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a> <strong class="jxr_keyword">extends</strong> RpcServer {
-<a class="jxr_linenumber" name="139" href="#139">139</a> 
-<a class="jxr_linenumber" name="140" href="#140">140</a>     <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a>() <strong class="jxr_keyword">throws</strong> IOException {
-<a class="jxr_linenumber" name="141" href="#141">141</a>       <strong class="jxr_keyword">this</strong>(<strong class="jxr_keyword">new</strong> FifoRpcScheduler(CONF, 1), CONF);
-<a class="jxr_linenumber" name="142" href="#142">142</a>     }
-<a class="jxr_linenumber" name="143" href="#143">143</a> 
-<a class="jxr_linenumber" name="144" href="#144">144</a>     <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a>(Configuration conf) <strong class="jxr_keyword">throws</strong> IOException {
-<a class="jxr_linenumber" name="145" href="#145">145</a>       <strong class="jxr_keyword">this</strong>(<strong class="jxr_keyword">new</strong> FifoRpcScheduler(conf, 1), conf);
-<a class="jxr_linenumber" name="146" href="#146">146</a>     }
-<a class="jxr_linenumber" name="147" href="#147">147</a> 
-<a class="jxr_linenumber" name="148" href="#148">148</a>     <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a>(RpcScheduler scheduler, Configuration conf) <strong class="jxr_keyword">throws</strong> IOException {
-<a class="jxr_linenumber" name="149" href="#149">149</a>       <strong class="jxr_keyword">super</strong>(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"testRpcServer"</span>, Lists
-<a class="jxr_linenumber" name="150" href="#150">150</a>           .newArrayList(<strong class="jxr_keyword">new</strong> BlockingServiceAndInterface(SERVICE, <strong class="jxr_keyword">null</strong>)), <strong class="jxr_keyword">new</strong> InetSocketAddress(
-<a class="jxr_linenumber" name="151" href="#151">151</a>           <span class="jxr_string">"localhost"</span>, 0), conf, scheduler);
-<a class="jxr_linenumber" name="152" href="#152">152</a>     }
-<a class="jxr_linenumber" name="153" href="#153">153</a> 
-<a class="jxr_linenumber" name="154" href="#154">154</a>     @Override
-<a class="jxr_linenumber" name="155" href="#155">155</a>     <strong class="jxr_keyword">public</strong> Pair&lt;Message, CellScanner&gt; call(BlockingService service, MethodDescriptor md,
-<a class="jxr_linenumber" name="156" href="#156">156</a>         Message param, CellScanner cellScanner, <strong class="jxr_keyword">long</strong> receiveTime, MonitoredRPCHandler status)
-<a class="jxr_linenumber" name="157" href="#157">157</a>         <strong class="jxr_keyword">throws</strong> IOException {
-<a class="jxr_linenumber" name="158" href="#158">158</a>       <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">super</strong>.call(service, md, param, cellScanner, receiveTime, status);
-<a class="jxr_linenumber" name="159" href="#159">159</a>     }
-<a class="jxr_linenumber" name="160" href="#160">160</a>   }
-<a class="jxr_linenumber" name="161" href="#161">161</a> 
-<a class="jxr_linenumber" name="162" href="#162">162</a>   <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">abstract</strong> AbstractRpcClient createRpcClientNoCodec(Configuration conf);
-<a class="jxr_linenumber" name="163" href="#163">163</a> 
-<a class="jxr_linenumber" name="164" href="#164">164</a>   <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="165" href="#165">165</a> <em class="jxr_javadoccomment">   * Ensure we do not HAVE TO HAVE a codec.</em>
-<a class="jxr_linenumber" name="166" href="#166">166</a> <em class="jxr_javadoccomment">   * @throws InterruptedException</em>
-<a class="jxr_linenumber" name="167" href="#167">167</a> <em class="jxr_javadoccomment">   * @throws IOException</em>
-<a class="jxr_linenumber" name="168" href="#168">168</a> <em class="jxr_javadoccomment">   */</em>
-<a class="jxr_linenumber" name="169" href="#169">169</a>   @Test
-<a class="jxr_linenumber" name="170" href="#170">170</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testNoCodec() <strong class="jxr_keyword">throws</strong> InterruptedException, IOException {
-<a class="jxr_linenumber" name="171" href="#171">171</a>     Configuration conf = HBaseConfiguration.create();
-<a class="jxr_linenumber" name="172" href="#172">172</a>     AbstractRpcClient client = createRpcClientNoCodec(conf);
-<a class="jxr_linenumber" name="173" href="#173">173</a>     <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a> rpcServer = <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a>();
-<a class="jxr_linenumber" name="174" href="#174">174</a>     <strong class="jxr_keyword">try</strong> {
-<a class="jxr_linenumber" name="175" href="#175">175</a>       rpcServer.start();
-<a class="jxr_linenumber" name="176" href="#176">176</a>       MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName(<span class="jxr_string">"echo"</span>);
-<a class="jxr_linenumber" name="177" href="#177">177</a>       <strong class="jxr_keyword">final</strong> String message = <span class="jxr_string">"hello"</span>;
-<a class="jxr_linenumber" name="178" href="#178">178</a>       EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(message).build();
-<a class="jxr_linenumber" name="179" href="#179">179</a>       InetSocketAddress address = rpcServer.getListenerAddress();
-<a class="jxr_linenumber" name="180" href="#180">180</a>       <strong class="jxr_keyword">if</strong> (address == <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="181" href="#181">181</a>         <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IOException(<span class="jxr_string">"Listener channel is closed"</span>);
-<a class="jxr_linenumber" name="182" href="#182">182</a>       }
-<a class="jxr_linenumber" name="183" href="#183">183</a>       Pair&lt;Message, CellScanner&gt; r =
-<a class="jxr_linenumber" name="184" href="#184">184</a>           client.call(<strong class="jxr_keyword">null</strong>, md, param, md.getOutputType().toProto(), User.getCurrent(), address,
-<a class="jxr_linenumber" name="185" href="#185">185</a>               <strong class="jxr_keyword">new</strong> MetricsConnection.CallStats());
-<a class="jxr_linenumber" name="186" href="#186">186</a>       assertTrue(r.getSecond() == <strong class="jxr_keyword">null</strong>);
-<a class="jxr_linenumber" name="187" href="#187">187</a>       <em class="jxr_comment">// Silly assertion that the message is in the returned pb.</em>
-<a class="jxr_linenumber" name="188" href="#188">188</a>       assertTrue(r.getFirst().toString().contains(message));
-<a class="jxr_linenumber" name="189" href="#189">189</a>     } <strong class="jxr_keyword">finally</strong> {
-<a class="jxr_linenumber" name="190" href="#190">190</a>       client.close();
-<a class="jxr_linenumber" name="191" href="#191">191</a>       rpcServer.stop();
-<a class="jxr_linenumber" name="192" href="#192">192</a>     }
-<a class="jxr_linenumber" name="193" href="#193">193</a>   }
-<a class="jxr_linenumber" name="194" href="#194">194</a> 
-<a class="jxr_linenumber" name="195" href="#195">195</a>   <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">abstract</strong> AbstractRpcClient createRpcClient(Configuration conf);
-<a class="jxr_linenumber" name="196" href="#196">196</a> 
-<a class="jxr_linenumber" name="197" href="#197">197</a>   <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="198" href="#198">198</a> <em class="jxr_javadoccomment">   * It is hard to verify the compression is actually happening under the wraps. Hope that if</em>
-<a class="jxr_linenumber" name="199" href="#199">199</a> <em class="jxr_javadoccomment">   * unsupported, we'll get an exception out of some time (meantime, have to trace it manually to</em>
-<a class="jxr_linenumber" name="200" href="#200">200</a> <em class="jxr_javadoccomment">   * confirm that compression is happening down in the client and server).</em>
-<a class="jxr_linenumber" name="201" href="#201">201</a> <em class="jxr_javadoccomment">   * @throws IOException</em>
-<a class="jxr_linenumber" name="202" href="#202">202</a> <em class="jxr_javadoccomment">   * @throws InterruptedException</em>
-<a class="jxr_linenumber" name="203" href="#203">203</a> <em class="jxr_javadoccomment">   * @throws SecurityException</em>
-<a class="jxr_linenumber" name="204" href="#204">204</a> <em class="jxr_javadoccomment">   * @throws NoSuchMethodException</em>
-<a class="jxr_linenumber" name="205" href="#205">205</a> <em class="jxr_javadoccomment">   */</em>
-<a class="jxr_linenumber" name="206" href="#206">206</a>   @Test
-<a class="jxr_linenumber" name="207" href="#207">207</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testCompressCellBlock() <strong class="jxr_keyword">throws</strong> IOException, InterruptedException, SecurityException,
-<a class="jxr_linenumber" name="208" href="#208">208</a>       NoSuchMethodException, ServiceException {
-<a class="jxr_linenumber" name="209" href="#209">209</a>     Configuration conf = <strong class="jxr_keyword">new</strong> Configuration(HBaseConfiguration.create());
-<a class="jxr_linenumber" name="210" href="#210">210</a>     conf.set(<span class="jxr_string">"hbase.client.rpc.compressor"</span>, GzipCodec.<strong class="jxr_keyword">class</strong>.getCanonicalName());
-<a class="jxr_linenumber" name="211" href="#211">211</a>     List&lt;Cell&gt; cells = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
-<a class="jxr_linenumber" name="212" href="#212">212</a>     <strong class="jxr_keyword">int</strong> count = 3;
-<a class="jxr_linenumber" name="213" href="#213">213</a>     <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">int</strong> i = 0; i &lt; count; i++) {
-<a class="jxr_linenumber" name="214" href="#214">214</a>       cells.add(CELL);
-<a class="jxr_linenumber" name="215" href="#215">215</a>     }
-<a class="jxr_linenumber" name="216" href="#216">216</a>     AbstractRpcClient client = createRpcClient(conf);
-<a class="jxr_linenumber" name="217" href="#217">217</a>     <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a> rpcServer = <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a>();
-<a class="jxr_linenumber" name="218" href="#218">218</a>     <strong class="jxr_keyword">try</strong> {
-<a class="jxr_linenumber" name="219" href="#219">219</a>       rpcServer.start();
-<a class="jxr_linenumber" name="220" href="#220">220</a>       MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName(<span class="jxr_string">"echo"</span>);
-<a class="jxr_linenumber" name="221" href="#221">221</a>       EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(<span class="jxr_string">"hello"</span>).build();
-<a class="jxr_linenumber" name="222" href="#222">222</a>       PayloadCarryingRpcController pcrc =
-<a class="jxr_linenumber" name="223" href="#223">223</a>           <strong class="jxr_keyword">new</strong> PayloadCarryingRpcController(CellUtil.createCellScanner(cells));
-<a class="jxr_linenumber" name="224" href="#224">224</a>       InetSocketAddress address = rpcServer.getListenerAddress();
-<a class="jxr_linenumber" name="225" href="#225">225</a>       <strong class="jxr_keyword">if</strong> (address == <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="226" href="#226">226</a>         <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IOException(<span class="jxr_string">"Listener channel is closed"</span>);
-<a class="jxr_linenumber" name="227" href="#227">227</a>       }
-<a class="jxr_linenumber" name="228" href="#228">228</a>       Pair&lt;Message, CellScanner&gt; r =
-<a class="jxr_linenumber" name="229" href="#229">229</a>           client.call(pcrc, md, param, md.getOutputType().toProto(), User.getCurrent(), address,
-<a class="jxr_linenumber" name="230" href="#230">230</a>               <strong class="jxr_keyword">new</strong> MetricsConnection.CallStats());
-<a class="jxr_linenumber" name="231" href="#231">231</a>       <strong class="jxr_keyword">int</strong> index = 0;
-<a class="jxr_linenumber" name="232" href="#232">232</a>       <strong class="jxr_keyword">while</strong> (r.getSecond().advance()) {
-<a class="jxr_linenumber" name="233" href="#233">233</a>         assertTrue(CELL.equals(r.getSecond().current()));
-<a class="jxr_linenumber" name="234" href="#234">234</a>         index++;
-<a class="jxr_linenumber" name="235" href="#235">235</a>       }
-<a class="jxr_linenumber" name="236" href="#236">236</a>       assertEquals(count, index);
-<a class="jxr_linenumber" name="237" href="#237">237</a>     } <strong class="jxr_keyword">finally</strong> {
-<a class="jxr_linenumber" name="238" href="#238">238</a>       client.close();
-<a class="jxr_linenumber" name="239" href="#239">239</a>       rpcServer.stop();
-<a class="jxr_linenumber" name="240" href="#240">240</a>     }
-<a class="jxr_linenumber" name="241" href="#241">241</a>   }
-<a class="jxr_linenumber" name="242" href="#242">242</a> 
-<a class="jxr_linenumber" name="243" href="#243">243</a>   <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">abstract</strong> AbstractRpcClient createRpcClientRTEDuringConnectionSetup(Configuration conf)
-<a class="jxr_linenumber" name="244" href="#244">244</a>       <strong class="jxr_keyword">throws</strong> IOException;
-<a class="jxr_linenumber" name="245" href="#245">245</a> 
-<a class="jxr_linenumber" name="246" href="#246">246</a>   @Test
-<a class="jxr_linenumber" name="247" href="#247">247</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testRTEDuringConnectionSetup() <strong class="jxr_keyword">throws</strong> Exception {
-<a class="jxr_linenumber" name="248" href="#248">248</a>     Configuration conf = HBaseConfiguration.create();
-<a class="jxr_linenumber" name="249" href="#249">249</a>     <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a> rpcServer = <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a>();
-<a class="jxr_linenumber" name="250" href="#250">250</a>     AbstractRpcClient client = createRpcClientRTEDuringConnectionSetup(conf);
-<a class="jxr_linenumber" name="251" href="#251">251</a>     <strong class="jxr_keyword">try</strong> {
-<a class="jxr_linenumber" name="252" href="#252">252</a>       rpcServer.start();
-<a class="jxr_linenumber" name="253" href="#253">253</a>       MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName(<span class="jxr_string">"echo"</span>);
-<a class="jxr_linenumber" name="254" href="#254">254</a>       EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(<span class="jxr_string">"hello"</span>).build();
-<a class="jxr_linenumber" name="255" href="#255">255</a>       InetSocketAddress address = rpcServer.getListenerAddress();
-<a class="jxr_linenumber" name="256" href="#256">256</a>       <strong class="jxr_keyword">if</strong> (address == <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="257" href="#257">257</a>         <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IOException(<span class="jxr_string">"Listener channel is closed"</span>);
-<a class="jxr_linenumber" name="258" href="#258">258</a>       }
-<a class="jxr_linenumber" name="259" href="#259">259</a>       client.call(<strong class="jxr_keyword">null</strong>, md, param, <strong class="jxr_keyword">null</strong>, User.getCurrent(), address,
-<a class="jxr_linenumber" name="260" href="#260">260</a>           <strong class="jxr_keyword">new</strong> MetricsConnection.CallStats());
-<a class="jxr_linenumber" name="261" href="#261">261</a>       fail(<span class="jxr_string">"Expected an exception to have been thrown!"</span>);
-<a class="jxr_linenumber" name="262" href="#262">262</a>     } <strong class="jxr_keyword">catch</strong> (Exception e) {
-<a class="jxr_linenumber" name="263" href="#263">263</a>       LOG.info(<span class="jxr_string">"Caught expected exception: "</span> + e.toString());
-<a class="jxr_linenumber" name="264" href="#264">264</a>       assertTrue(StringUtils.stringifyException(e).contains(<span class="jxr_string">"Injected fault"</span>));
-<a class="jxr_linenumber" name="265" href="#265">265</a>     } <strong class="jxr_keyword">finally</strong> {
-<a class="jxr_linenumber" name="266" href="#266">266</a>       client.close();
-<a class="jxr_linenumber" name="267" href="#267">267</a>       rpcServer.stop();
-<a class="jxr_linenumber" name="268" href="#268">268</a>     }
-<a class="jxr_linenumber" name="269" href="#269">269</a>   }
-<a class="jxr_linenumber" name="270" href="#270">270</a> 
-<a class="jxr_linenumber" name="271" href="#271">271</a>   <em class="jxr_javadoccomment">/**</em><em class="jxr_javadoccomment"> Tests that the rpc scheduler is called when requests arrive. */</em>
-<a class="jxr_linenumber" name="272" href="#272">272</a>   @Test
-<a class="jxr_linenumber" name="273" href="#273">273</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testRpcScheduler() <strong class="jxr_keyword">throws</strong> IOException, InterruptedException {
-<a class="jxr_linenumber" name="274" href="#274">274</a>     RpcScheduler scheduler = spy(<strong class="jxr_keyword">new</strong> FifoRpcScheduler(CONF, 1));
-<a class="jxr_linenumber" name="275" href="#275">275</a>     RpcServer rpcServer = <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a>(scheduler, CONF);
-<a class="jxr_linenumber" name="276" href="#276">276</a>     verify(scheduler).init((RpcScheduler.Context) anyObject());
-<a class="jxr_linenumber" name="277" href="#277">277</a>     AbstractRpcClient client = createRpcClient(CONF);
-<a class="jxr_linenumber" name="278" href="#278">278</a>     <strong class="jxr_keyword">try</strong> {
-<a class="jxr_linenumber" name="279" href="#279">279</a>       rpcServer.start();
-<a class="jxr_linenumber" name="280" href="#280">280</a>       verify(scheduler).start();
-<a class="jxr_linenumber" name="281" href="#281">281</a>       MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName(<span class="jxr_string">"echo"</span>);
-<a class="jxr_linenumber" name="282" href="#282">282</a>       EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(<span class="jxr_string">"hello"</span>).build();
-<a class="jxr_linenumber" name="283" href="#283">283</a>       InetSocketAddress address = rpcServer.getListenerAddress();
-<a class="jxr_linenumber" name="284" href="#284">284</a>       <strong class="jxr_keyword">if</strong> (address == <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="285" href="#285">285</a>         <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IOException(<span class="jxr_string">"Listener channel is closed"</span>);
-<a class="jxr_linenumber" name="286" href="#286">286</a>       }
-<a class="jxr_linenumber" name="287" href="#287">287</a>       <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">int</strong> i = 0; i &lt; 10; i++) {
-<a class="jxr_linenumber" name="288" href="#288">288</a>         client.call(<strong class="jxr_keyword">new</strong> PayloadCarryingRpcController(
-<a class="jxr_linenumber" name="289" href="#289">289</a>             CellUtil.createCellScanner(ImmutableList.&lt;Cell&gt; of(CELL))), md, param,
-<a class="jxr_linenumber" name="290" href="#290">290</a>             md.getOutputType().toProto(), User.getCurrent(), address,
-<a class="jxr_linenumber" name="291" href="#291">291</a>             <strong class="jxr_keyword">new</strong> MetricsConnection.CallStats());
-<a class="jxr_linenumber" name="292" href="#292">292</a>       }
-<a class="jxr_linenumber" name="293" href="#293">293</a>       verify(scheduler, times(10)).dispatch((CallRunner) anyObject());
-<a class="jxr_linenumber" name="294" href="#294">294</a>     } <strong class="jxr_keyword">finally</strong> {
-<a class="jxr_linenumber" name="295" href="#295">295</a>       rpcServer.stop();
-<a class="jxr_linenumber" name="296" href="#296">296</a>       verify(scheduler).stop();
-<a class="jxr_linenumber" name="297" href="#297">297</a>     }
-<a class="jxr_linenumber" name="298" href="#298">298</a>   }
-<a class="jxr_linenumber" name="299" href="#299">299</a> 
-<a class="jxr_linenumber" name="300" href="#300">300</a>   <em class="jxr_javadoccomment">/**</em><em class="jxr_javadoccomment"> Tests that the rpc scheduler is called when requests arrive. */</em>
-<a class="jxr_linenumber" name="301" href="#301">301</a>   @Test
-<a class="jxr_linenumber" name="302" href="#302">302</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testRpcMaxRequestSize() <strong class="jxr_keyword">throws</strong> IOException, InterruptedException {
-<a class="jxr_linenumber" name="303" href="#303">303</a>     Configuration conf = <strong class="jxr_keyword">new</strong> Configuration(CONF);
-<a class="jxr_linenumber" name="304" href="#304">304</a>     conf.setInt(RpcServer.MAX_REQUEST_SIZE, 100);
-<a class="jxr_linenumber" name="305" href="#305">305</a>     RpcServer rpcServer = <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a>(conf);
-<a class="jxr_linenumber" name="306" href="#306">306</a>     AbstractRpcClient client = createRpcClient(conf);
-<a class="jxr_linenumber" name="307" href="#307">307</a>     <strong class="jxr_keyword">try</strong> {
-<a class="jxr_linenumber" name="308" href="#308">308</a>       rpcServer.start();
-<a class="jxr_linenumber" name="309" href="#309">309</a>       MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName(<span class="jxr_string">"echo"</span>);
-<a class="jxr_linenumber" name="310" href="#310">310</a>       <em class="jxr_comment">// set total RPC size bigger than 100 bytes</em>
-<a class="jxr_linenumber" name="311" href="#311">311</a>       EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(<span class="jxr_string">"hello.hello.hello.hello."</span>
-<a class="jxr_linenumber" name="312" href="#312">312</a>           + <span class="jxr_string">"hello.hello.hello.hello.hello.hello.hello.hello.hello.hello.hello.hello"</span>).build();
-<a class="jxr_linenumber" name="313" href="#313">313</a>       InetSocketAddress address = rpcServer.getListenerAddress();
-<a class="jxr_linenumber" name="314" href="#314">314</a>       <strong class="jxr_keyword">if</strong> (address == <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="315" href="#315">315</a>         <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IOException(<span class="jxr_string">"Listener channel is closed"</span>);
-<a class="jxr_linenumber" name="316" href="#316">316</a>       }
-<a class="jxr_linenumber" name="317" href="#317">317</a>       <strong class="jxr_keyword">try</strong> {
-<a class="jxr_linenumber" name="318" href="#318">318</a>         client.call(<strong class="jxr_keyword">new</strong> PayloadCarryingRpcController(
-<a class="jxr_linenumber" name="319" href="#319">319</a>           CellUtil.createCellScanner(ImmutableList.&lt;Cell&gt; of(CELL))), md, param,
-<a class="jxr_linenumber" name="320" href="#320">320</a>           md.getOutputType().toProto(), User.getCurrent(), address,
-<a class="jxr_linenumber" name="321" href="#321">321</a>           <strong class="jxr_keyword">new</strong> MetricsConnection.CallStats());
-<a class="jxr_linenumber" name="322" href="#322">322</a>         fail(<span class="jxr_string">"RPC should have failed because it exceeds max request size"</span>);
-<a class="jxr_linenumber" name="323" href="#323">323</a>       } <strong class="jxr_keyword">catch</strong>(ConnectionClosingException | ConnectionClosedException ex) {
-<a class="jxr_linenumber" name="324" href="#324">324</a>         <em class="jxr_comment">// pass</em>
-<a class="jxr_linenumber" name="325" href="#325">325</a>       }
-<a class="jxr_linenumber" name="326" href="#326">326</a>     } <strong class="jxr_keyword">finally</strong> {
-<a class="jxr_linenumber" name="327" href="#327">327</a>       rpcServer.stop();
-<a class="jxr_linenumber" name="328" href="#328">328</a>     }
-<a class="jxr_linenumber" name="329" href="#329">329</a>   }
-<a class="jxr_linenumber" name="330" href="#330">330</a> 
-<a class="jxr_linenumber" name="331" href="#331">331</a>   <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="332" href="#332">332</a> <em class="jxr_javadoccomment">   * Instance of RpcServer that echoes client hostAddress back to client</em>
-<a class="jxr_linenumber" name="333" href="#333">333</a> <em class="jxr_javadoccomment">   */</em>
-<a class="jxr_linenumber" name="334" href="#334">334</a>   <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">class</strong> <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer1</a> <strong class="jxr_keyword">extends</strong> RpcServer {
-<a class="jxr_linenumber" name="335" href="#335">335</a> 
-<a class="jxr_linenumber" name="336" href="#336">336</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> BlockingInterface SERVICE1 =
-<a class="jxr_linenumber" name="337" href="#337">337</a>         <strong class="jxr_keyword">new</strong> TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface() {
-<a class="jxr_linenumber" name="338" href="#338">338</a>           @Override
-<a class="jxr_linenumber" name="339" href="#339">339</a>           <strong class="jxr_keyword">public</strong> EmptyResponseProto ping(RpcController unused, EmptyRequestProto request)
-<a class="jxr_linenumber" name="340" href="#340">340</a>               <strong class="jxr_keyword">throws</strong> ServiceException {
-<a class="jxr_linenumber" name="341" href="#341">341</a>             <strong class="jxr_keyword">return</strong> EmptyResponseProto.newBuilder().build();
-<a class="jxr_linenumber" name="342" href="#342">342</a>           }
-<a class="jxr_linenumber" name="343" href="#343">343</a> 
-<a class="jxr_linenumber" name="344" href="#344">344</a>           @Override
-<a class="jxr_linenumber" name="345" href="#345">345</a>           <strong class="jxr_keyword">public</strong> EchoResponseProto echo(RpcController unused, EchoRequestProto request)
-<a class="jxr_linenumber" name="346" href="#346">346</a>               <strong class="jxr_keyword">throws</strong> ServiceException {
-<a class="jxr_linenumber" name="347" href="#347">347</a>             <strong class="jxr_keyword">final</strong> InetAddress remoteAddr = TestRpcServer1.getRemoteAddress();
-<a class="jxr_linenumber" name="348" href="#348">348</a>             <strong class="jxr_keyword">final</strong> String message = remoteAddr == <strong class="jxr_keyword">null</strong> ? <span class="jxr_string">"NULL"</span> : remoteAddr.getHostAddress();
-<a class="jxr_linenumber" name="349" href="#349">349</a>             <strong class="jxr_keyword">return</strong> EchoResponseProto.newBuilder().setMessage(message).build();
-<a class="jxr_linenumber" name="350" href="#350">350</a>           }
-<a class="jxr_linenumber" name="351" href="#351">351</a> 
-<a class="jxr_linenumber" name="352" href="#352">352</a>           @Override
-<a class="jxr_linenumber" name="353" href="#353">353</a>           <strong class="jxr_keyword">public</strong> EmptyResponseProto error(RpcController unused, EmptyRequestProto request)
-<a class="jxr_linenumber" name="354" href="#354">354</a>               <strong class="jxr_keyword">throws</strong> ServiceException {
-<a class="jxr_linenumber" name="355" href="#355">355</a>             <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> ServiceException(<span class="jxr_string">"error"</span>, <strong class="jxr_keyword">new</strong> IOException(<span class="jxr_string">"error"</span>));
-<a class="jxr_linenumber" name="356" href="#356">356</a>           }
-<a class="jxr_linenumber" name="357" href="#357">357</a>         };
-<a class="jxr_linenumber" name="358" href="#358">358</a> 
-<a class="jxr_linenumber" name="359" href="#359">359</a>     <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer1</a>() <strong class="jxr_keyword">throws</strong> IOException {
-<a class="jxr_linenumber" name="360" href="#360">360</a>       <strong class="jxr_keyword">this</strong>(<strong class="jxr_keyword">new</strong> FifoRpcScheduler(CONF, 1));
-<a class="jxr_linenumber" name="361" href="#361">361</a>     }
-<a class="jxr_linenumber" name="362" href="#362">362</a> 
-<a class="jxr_linenumber" name="363" href="#363">363</a>     <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer1</a>(RpcScheduler scheduler) <strong class="jxr_keyword">throws</strong> IOException {
-<a class="jxr_linenumber" name="364" href="#364">364</a>       <strong class="jxr_keyword">super</strong>(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"testRemoteAddressInCallObject"</span>, Lists
-<a class="jxr_linenumber" name="365" href="#365">365</a>           .newArrayList(<strong class="jxr_keyword">new</strong> BlockingServiceAndInterface(TestRpcServiceProtos.TestProtobufRpcProto
-<a class="jxr_linenumber" name="366" href="#366">366</a>               .newReflectiveBlockingService(SERVICE1), <strong class="jxr_keyword">null</strong>)),
-<a class="jxr_linenumber" name="367" href="#367">367</a>           <strong class="jxr_keyword">new</strong> InetSocketAddress(<span class="jxr_string">"localhost"</span>, 0), CONF, scheduler);
-<a class="jxr_linenumber" name="368" href="#368">368</a>     }
-<a class="jxr_linenumber" name="369" href="#369">369</a>   }
-<a class="jxr_linenumber" name="370" href="#370">370</a> 
-<a class="jxr_linenumber" name="371" href="#371">371</a>   <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="372" href="#372">372</a> <em class="jxr_javadoccomment">   * Tests that the RpcServer creates &amp; dispatches CallRunner object to scheduler with non-null</em>
-<a class="jxr_linenumber" name="373" href="#373">373</a> <em class="jxr_javadoccomment">   * remoteAddress set to its Call Object</em>
-<a class="jxr_linenumber" name="374" href="#374">374</a> <em class="jxr_javadoccomment">   * @throws ServiceException</em>
-<a class="jxr_linenumber" name="375" href="#375">375</a> <em class="jxr_javadoccomment">   */</em>
-<a class="jxr_linenumber" name="376" href="#376">376</a>   @Test
-<a class="jxr_linenumber" name="377" href="#377">377</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testRpcServerForNotNullRemoteAddressInCallObject() <strong class="jxr_keyword">throws</strong> IOException,
-<a class="jxr_linenumber" name="378" href="#378">378</a>       ServiceException {
-<a class="jxr_linenumber" name="379" href="#379">379</a>     <strong class="jxr_keyword">final</strong> RpcScheduler scheduler = <strong class="jxr_keyword">new</strong> FifoRpcScheduler(CONF, 1);
-<a class="jxr_linenumber" name="380" href="#380">380</a>     <strong class="jxr_keyword">final</strong> <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer1</a> rpcServer = <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer1</a>(scheduler);
-<a class="jxr_linenumber" name="381" href="#381">381</a>     <strong class="jxr_keyword">final</strong> InetSocketAddress localAddr = <strong class="jxr_keyword">new</strong> InetSocketAddress(<span class="jxr_string">"localhost"</span>, 0);
-<a class="jxr_linenumber" name="382" href="#382">382</a>     <strong class="jxr_keyword">final</strong> AbstractRpcClient client =
-<a class="jxr_linenumber" name="383" href="#383">383</a>         <strong class="jxr_keyword">new</strong> RpcClientImpl(CONF, HConstants.CLUSTER_ID_DEFAULT, localAddr, <strong class="jxr_keyword">null</strong>);
-<a class="jxr_linenumber" name="384" href="#384">384</a>     <strong class="jxr_keyword">try</strong> {
-<a class="jxr_linenumber" name="385" href="#385">385</a>       rpcServer.start();
-<a class="jxr_linenumber" name="386" href="#386">386</a>       <strong class="jxr_keyword">final</strong> InetSocketAddress isa = rpcServer.getListenerAddress();
-<a class="jxr_linenumber" name="387" href="#387">387</a>       <strong class="jxr_keyword">if</strong> (isa == <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="388" href="#388">388</a>         <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IOException(<span class="jxr_string">"Listener channel is closed"</span>);
-<a class="jxr_linenumber" name="389" href="#389">389</a>       }
-<a class="jxr_linenumber" name="390" href="#390">390</a>       <strong class="jxr_keyword">final</strong> BlockingRpcChannel channel =
-<a class="jxr_linenumber" name="391" href="#391">391</a>           client.createBlockingRpcChannel(
-<a class="jxr_linenumber" name="392" href="#392">392</a>             ServerName.valueOf(isa.getHostName(), isa.getPort(), System.currentTimeMillis()),
-<a class="jxr_linenumber" name="393" href="#393">393</a>             User.getCurrent(), 0);
-<a class="jxr_linenumber" name="394" href="#394">394</a>       TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface stub =
-<a class="jxr_linenumber" name="395" href="#395">395</a>           TestRpcServiceProtos.TestProtobufRpcProto.newBlockingStub(channel);
-<a class="jxr_linenumber" name="396" href="#396">396</a>       <strong class="jxr_keyword">final</strong> EchoRequestProto echoRequest =
-<a class="jxr_linenumber" name="397" href="#397">397</a>           EchoRequestProto.newBuilder().setMessage(<span class="jxr_string">"GetRemoteAddress"</span>).build();
-<a class="jxr_linenumber" name="398" href="#398">398</a>       <strong class="jxr_keyword">final</strong> EchoResponseProto echoResponse = stub.echo(<strong class="jxr_keyword">null</strong>, echoRequest);
-<a class="jxr_linenumber" name="399" href="#399">399</a>       Assert.assertEquals(localAddr.getAddress().getHostAddress(), echoResponse.getMessage());
-<a class="jxr_linenumber" name="400" href="#400">400</a>     } <strong class="jxr_keyword">finally</strong> {
-<a class="jxr_linenumber" name="401" href="#401">401</a>       client.close();
-<a class="jxr_linenumber" name="402" href="#402">402</a>       rpcServer.stop();
-<a class="jxr_linenumber" name="403" href="#403">403</a>     }
-<a class="jxr_linenumber" name="404" href="#404">404</a>   }
-<a class="jxr_linenumber" name="405" href="#405">405</a> 
-<a class="jxr_linenumber" name="406" href="#406">406</a>   @Test
-<a class="jxr_linenumber" name="407" href="#407">407</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testWrapException() <strong class="jxr_keyword">throws</strong> Exception {
-<a class="jxr_linenumber" name="408" href="#408">408</a>     AbstractRpcClient client =
-<a class="jxr_linenumber" name="409" href="#409">409</a>         (AbstractRpcClient) RpcClientFactory.createClient(CONF, <span class="jxr_string">"AbstractTestIPC"</span>);
-<a class="jxr_linenumber" name="410" href="#410">410</a>     <strong class="jxr_keyword">final</strong> InetSocketAddress address = InetSocketAddress.createUnresolved(<span class="jxr_string">"localhost"</span>, 0);
-<a class="jxr_linenumber" name="411" href="#411">411</a>     assertTrue(client.wrapException(address, <strong class="jxr_keyword">new</strong> ConnectException()) instanceof ConnectException);
-<a class="jxr_linenumber" name="412" href="#412">412</a>     assertTrue(client.wrapException(address,
-<a class="jxr_linenumber" name="413" href="#413">413</a>       <strong class="jxr_keyword">new</strong> SocketTimeoutException()) instanceof SocketTimeoutException);
-<a class="jxr_linenumber" name="414" href="#414">414</a>     assertTrue(client.wrapException(address, <strong class="jxr_keyword">new</strong> ConnectionClosingException(
-<a class="jxr_linenumber" name="415" href="#415">415</a>         <span class="jxr_string">"Test AbstractRpcClient#wrapException"</span>)) instanceof ConnectionClosingException);
-<a class="jxr_linenumber" name="416" href="#416">416</a>     assertTrue(client
-<a class="jxr_linenumber" name="417" href="#417">417</a>         .wrapException(address, <strong class="jxr_keyword">new</strong> CallTimeoutException(<span class="jxr_string">"Test AbstractRpcClient#wrapException"</span>))
-<a class="jxr_linenumber" name="418" href="#418">418</a>         .getCause() instanceof CallTimeoutException);
-<a class="jxr_linenumber" name="419" href="#419">419</a>   }
-<a class="jxr_linenumber" name="420" href="#420">420</a> }
+<a class="jxr_linenumber" name="60" href="#60">60</a>  <strong class="jxr_keyword">import</strong> org.junit.Assert;
+<a class="jxr_linenumber" name="61" href="#61">61</a>  <strong class="jxr_keyword">import</strong> org.junit.Test;
+<a class="jxr_linenumber" name="62" href="#62">62</a>  
+<a class="jxr_linenumber" name="63" href="#63">63</a>  <strong class="jxr_keyword">import</strong> com.google.common.collect.ImmutableList;
+<a class="jxr_linenumber" name="64" href="#64">64</a>  <strong class="jxr_keyword">import</strong> com.google.common.collect.Lists;
+<a class="jxr_linenumber" name="65" href="#65">65</a>  <strong class="jxr_keyword">import</strong> com.google.protobuf.BlockingRpcChannel;
+<a class="jxr_linenumber" name="66" href="#66">66</a>  <strong class="jxr_keyword">import</strong> com.google.protobuf.BlockingService;
+<a class="jxr_linenumber" name="67" href="#67">67</a>  <strong class="jxr_keyword">import</strong> com.google.protobuf.Descriptors.MethodDescriptor;
+<a class="jxr_linenumber" name="68" href="#68">68</a>  <strong class="jxr_keyword">import</strong> com.google.protobuf.Message;
+<a class="jxr_linenumber" name="69" href="#69">69</a>  <strong class="jxr_keyword">import</strong> com.google.protobuf.RpcController;
+<a class="jxr_linenumber" name="70" href="#70">70</a>  <strong class="jxr_keyword">import</strong> com.google.protobuf.ServiceException;
+<a class="jxr_linenumber" name="71" href="#71">71</a>  
+<a class="jxr_linenumber" name="72" href="#72">72</a>  <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="73" href="#73">73</a>  <em class="jxr_javadoccomment"> * Some basic ipc tests.</em>
+<a class="jxr_linenumber" name="74" href="#74">74</a>  <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="75" href="#75">75</a>  <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">abstract</strong> <strong class="jxr_keyword">class</strong> <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">AbstractTestIPC</a> {
+<a class="jxr_linenumber" name="76" href="#76">76</a>  
+<a class="jxr_linenumber" name="77" href="#77">77</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> Log LOG = LogFactory.getLog(AbstractTestIPC.<strong class="jxr_keyword">class</strong>);
+<a class="jxr_linenumber" name="78" href="#78">78</a>  
+<a class="jxr_linenumber" name="79" href="#79">79</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> byte[] CELL_BYTES = Bytes.toBytes(<span class="jxr_string">"xyz"</span>);
+<a class="jxr_linenumber" name="80" href="#80">80</a>    <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> KeyValue CELL = <strong class="jxr_keyword">new</strong> KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, CELL_BYTES);
+<a class="jxr_linenumber" name="81" href="#81">81</a>    <strong class="jxr_keyword">static</strong> byte[] BIG_CELL_BYTES = <strong class="jxr_keyword">new</strong> byte[10 * 1024];
+<a class="jxr_linenumber" name="82" href="#82">82</a>    <strong class="jxr_keyword">static</strong> KeyValue BIG_CELL = <strong class="jxr_keyword">new</strong> KeyValue(CELL_BYTES, CELL_BYTES, CELL_BYTES, BIG_CELL_BYTES);
+<a class="jxr_linenumber" name="83" href="#83">83</a>    <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> Configuration CONF = HBaseConfiguration.create();
+<a class="jxr_linenumber" name="84" href="#84">84</a>    <em class="jxr_comment">// We are using the test TestRpcServiceProtos generated classes and Service because they are</em>
+<a class="jxr_linenumber" name="85" href="#85">85</a>    <em class="jxr_comment">// available and basic with methods like 'echo', and ping. Below we make a blocking service</em>
+<a class="jxr_linenumber" name="86" href="#86">86</a>    <em class="jxr_comment">// by passing in implementation of blocking interface. We use this service in all tests that</em>
+<a class="jxr_linenumber" name="87" href="#87">87</a>    <em class="jxr_comment">// follow.</em>
+<a class="jxr_linenumber" name="88" href="#88">88</a>    <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> BlockingService SERVICE =
+<a class="jxr_linenumber" name="89" href="#89">89</a>        TestRpcServiceProtos.TestProtobufRpcProto
+<a class="jxr_linenumber" name="90" href="#90">90</a>            .newReflectiveBlockingService(<strong class="jxr_keyword">new</strong> TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface() {
+<a class="jxr_linenumber" name="91" href="#91">91</a>  
+<a class="jxr_linenumber" name="92" href="#92">92</a>              @Override
+<a class="jxr_linenumber" name="93" href="#93">93</a>              <strong class="jxr_keyword">public</strong> EmptyResponseProto ping(RpcController controller, EmptyRequestProto request)
+<a class="jxr_linenumber" name="94" href="#94">94</a>                  <strong class="jxr_keyword">throws</strong> ServiceException {
+<a class="jxr_linenumber" name="95" href="#95">95</a>                <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="96" href="#96">96</a>              }
+<a class="jxr_linenumber" name="97" href="#97">97</a>  
+<a class="jxr_linenumber" name="98" href="#98">98</a>              @Override
+<a class="jxr_linenumber" name="99" href="#99">99</a>              <strong class="jxr_keyword">public</strong> EmptyResponseProto error(RpcController controller, EmptyRequestProto request)
+<a class="jxr_linenumber" name="100" href="#100">100</a>                 <strong class="jxr_keyword">throws</strong> ServiceException {
+<a class="jxr_linenumber" name="101" href="#101">101</a>               <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="102" href="#102">102</a>             }
+<a class="jxr_linenumber" name="103" href="#103">103</a> 
+<a class="jxr_linenumber" name="104" href="#104">104</a>             @Override
+<a class="jxr_linenumber" name="105" href="#105">105</a>             <strong class="jxr_keyword">public</strong> EchoResponseProto echo(RpcController controller, EchoRequestProto request)
+<a class="jxr_linenumber" name="106" href="#106">106</a>                 <strong class="jxr_keyword">throws</strong> ServiceException {
+<a class="jxr_linenumber" name="107" href="#107">107</a>               <strong class="jxr_keyword">if</strong> (controller instanceof PayloadCarryingRpcController) {
+<a class="jxr_linenumber" name="108" href="#108">108</a>                 PayloadCarryingRpcController pcrc = (PayloadCarryingRpcController) controller;
+<a class="jxr_linenumber" name="109" href="#109">109</a>                 <em class="jxr_comment">// If cells, scan them to check we are able to iterate what we were given and since</em>
+<a class="jxr_linenumber" name="110" href="#110">110</a>                 <em class="jxr_comment">// this is</em>
+<a class="jxr_linenumber" name="111" href="#111">111</a>                 <em class="jxr_comment">// an echo, just put them back on the controller creating a new block. Tests our</em>
+<a class="jxr_linenumber" name="112" href="#112">112</a>                 <em class="jxr_comment">// block</em>
+<a class="jxr_linenumber" name="113" href="#113">113</a>                 <em class="jxr_comment">// building.</em>
+<a class="jxr_linenumber" name="114" href="#114">114</a>                 CellScanner cellScanner = pcrc.cellScanner();
+<a class="jxr_linenumber" name="115" href="#115">115</a>                 List&lt;Cell&gt; list = <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="116" href="#116">116</a>                 <strong class="jxr_keyword">if</strong> (cellScanner != <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="117" href="#117">117</a>                   list = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
+<a class="jxr_linenumber" name="118" href="#118">118</a>                   <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="119" href="#119">119</a>                     <strong class="jxr_keyword">while</strong> (cellScanner.advance()) {
+<a class="jxr_linenumber" name="120" href="#120">120</a>                       list.add(cellScanner.current());
+<a class="jxr_linenumber" name="121" href="#121">121</a>                     }
+<a class="jxr_linenumber" name="122" href="#122">122</a>                   } <strong class="jxr_keyword">catch</strong> (IOException e) {
+<a class="jxr_linenumber" name="123" href="#123">123</a>                     <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> ServiceException(e);
+<a class="jxr_linenumber" name="124" href="#124">124</a>                   }
+<a class="jxr_linenumber" name="125" href="#125">125</a>                 }
+<a class="jxr_linenumber" name="126" href="#126">126</a>                 cellScanner = CellUtil.createCellScanner(list);
+<a class="jxr_linenumber" name="127" href="#127">127</a>                 ((PayloadCarryingRpcController) controller).setCellScanner(cellScanner);
+<a class="jxr_linenumber" name="128" href="#128">128</a>               }
+<a class="jxr_linenumber" name="129" href="#129">129</a>               <strong class="jxr_keyword">return</strong> EchoResponseProto.newBuilder().setMessage(request.getMessage()).build();
+<a class="jxr_linenumber" name="130" href="#130">130</a>             }
+<a class="jxr_linenumber" name="131" href="#131">131</a>           });
+<a class="jxr_linenumber" name="132" href="#132">132</a> 
+<a class="jxr_linenumber" name="133" href="#133">133</a>   <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="134" href="#134">134</a> <em class="jxr_javadoccomment">   * Instance of server. We actually don't do anything speical in here so could just use</em>
+<a class="jxr_linenumber" name="135" href="#135">135</a> <em class="jxr_javadoccomment">   * HBaseRpcServer directly.</em>
+<a class="jxr_linenumber" name="136" href="#136">136</a> <em class="jxr_javadoccomment">   */</em>
+<a class="jxr_linenumber" name="137" href="#137">137</a>   <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">class</strong> <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a> <strong class="jxr_keyword">extends</strong> RpcServer {
+<a class="jxr_linenumber" name="138" href="#138">138</a> 
+<a class="jxr_linenumber" name="139" href="#139">139</a>     <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a>() <strong class="jxr_keyword">throws</strong> IOException {
+<a class="jxr_linenumber" name="140" href="#140">140</a>       <strong class="jxr_keyword">this</strong>(<strong class="jxr_keyword">new</strong> FifoRpcScheduler(CONF, 1), CONF);
+<a class="jxr_linenumber" name="141" href="#141">141</a>     }
+<a class="jxr_linenumber" name="142" href="#142">142</a> 
+<a class="jxr_linenumber" name="143" href="#143">143</a>     <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a>(Configuration conf) <strong class="jxr_keyword">throws</strong> IOException {
+<a class="jxr_linenumber" name="144" href="#144">144</a>       <strong class="jxr_keyword">this</strong>(<strong class="jxr_keyword">new</strong> FifoRpcScheduler(conf, 1), conf);
+<a class="jxr_linenumber" name="145" href="#145">145</a>     }
+<a class="jxr_linenumber" name="146" href="#146">146</a> 
+<a class="jxr_linenumber" name="147" href="#147">147</a>     <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a>(RpcScheduler scheduler, Configuration conf) <strong class="jxr_keyword">throws</strong> IOException {
+<a class="jxr_linenumber" name="148" href="#148">148</a>       <strong class="jxr_keyword">super</strong>(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"testRpcServer"</span>, Lists
+<a class="jxr_linenumber" name="149" href="#149">149</a>           .newArrayList(<strong class="jxr_keyword">new</strong> BlockingServiceAndInterface(SERVICE, <strong class="jxr_keyword">null</strong>)), <strong class="jxr_keyword">new</strong> InetSocketAddress(
+<a class="jxr_linenumber" name="150" href="#150">150</a>           <span class="jxr_string">"localhost"</span>, 0), conf, scheduler);
+<a class="jxr_linenumber" name="151" href="#151">151</a>     }
+<a class="jxr_linenumber" name="152" href="#152">152</a> 
+<a class="jxr_linenumber" name="153" href="#153">153</a>     @Override
+<a class="jxr_linenumber" name="154" href="#154">154</a>     <strong class="jxr_keyword">public</strong> Pair&lt;Message, CellScanner&gt; call(BlockingService service, MethodDescriptor md,
+<a class="jxr_linenumber" name="155" href="#155">155</a>         Message param, CellScanner cellScanner, <strong class="jxr_keyword">long</strong> receiveTime, MonitoredRPCHandler status)
+<a class="jxr_linenumber" name="156" href="#156">156</a>         <strong class="jxr_keyword">throws</strong> IOException {
+<a class="jxr_linenumber" name="157" href="#157">157</a>       <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">super</strong>.call(service, md, param, cellScanner, receiveTime, status);
+<a class="jxr_linenumber" name="158" href="#158">158</a>     }
+<a class="jxr_linenumber" name="159" href="#159">159</a>   }
+<a class="jxr_linenumber" name="160" href="#160">160</a> 
+<a class="jxr_linenumber" name="161" href="#161">161</a>   <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">abstract</strong> AbstractRpcClient createRpcClientNoCodec(Configuration conf);
+<a class="jxr_linenumber" name="162" href="#162">162</a> 
+<a class="jxr_linenumber" name="163" href="#163">163</a>   <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="164" href="#164">164</a> <em class="jxr_javadoccomment">   * Ensure we do not HAVE TO HAVE a codec.</em>
+<a class="jxr_linenumber" name="165" href="#165">165</a> <em class="jxr_javadoccomment">   * @throws InterruptedException</em>
+<a class="jxr_linenumber" name="166" href="#166">166</a> <em class="jxr_javadoccomment">   * @throws IOException</em>
+<a class="jxr_linenumber" name="167" href="#167">167</a> <em class="jxr_javadoccomment">   */</em>
+<a class="jxr_linenumber" name="168" href="#168">168</a>   @Test
+<a class="jxr_linenumber" name="169" href="#169">169</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testNoCodec() <strong class="jxr_keyword">throws</strong> InterruptedException, IOException {
+<a class="jxr_linenumber" name="170" href="#170">170</a>     Configuration conf = HBaseConfiguration.create();
+<a class="jxr_linenumber" name="171" href="#171">171</a>     AbstractRpcClient client = createRpcClientNoCodec(conf);
+<a class="jxr_linenumber" name="172" href="#172">172</a>     <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a> rpcServer = <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a>();
+<a class="jxr_linenumber" name="173" href="#173">173</a>     <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="174" href="#174">174</a>       rpcServer.start();
+<a class="jxr_linenumber" name="175" href="#175">175</a>       MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName(<span class="jxr_string">"echo"</span>);
+<a class="jxr_linenumber" name="176" href="#176">176</a>       <strong class="jxr_keyword">final</strong> String message = <span class="jxr_string">"hello"</span>;
+<a class="jxr_linenumber" name="177" href="#177">177</a>       EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(message).build();
+<a class="jxr_linenumber" name="178" href="#178">178</a>       InetSocketAddress address = rpcServer.getListenerAddress();
+<a class="jxr_linenumber" name="179" href="#179">179</a>       <strong class="jxr_keyword">if</strong> (address == <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="180" href="#180">180</a>         <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IOException(<span class="jxr_string">"Listener channel is closed"</span>);
+<a class="jxr_linenumber" name="181" href="#181">181</a>       }
+<a class="jxr_linenumber" name="182" href="#182">182</a>       Pair&lt;Message, CellScanner&gt; r =
+<a class="jxr_linenumber" name="183" href="#183">183</a>           client.call(<strong class="jxr_keyword">null</strong>, md, param, md.getOutputType().toProto(), User.getCurrent(), address,
+<a class="jxr_linenumber" name="184" href="#184">184</a>               <strong class="jxr_keyword">new</strong> MetricsConnection.CallStats());
+<a class="jxr_linenumber" name="185" href="#185">185</a>       assertTrue(r.getSecond() == <strong class="jxr_keyword">null</strong>);
+<a class="jxr_linenumber" name="186" href="#186">186</a>       <em class="jxr_comment">// Silly assertion that the message is in the returned pb.</em>
+<a class="jxr_linenumber" name="187" href="#187">187</a>       assertTrue(r.getFirst().toString().contains(message));
+<a class="jxr_linenumber" name="188" href="#188">188</a>     } <strong class="jxr_keyword">finally</strong> {
+<a class="jxr_linenumber" name="189" href="#189">189</a>       client.close();
+<a class="jxr_linenumber" name="190" href="#190">190</a>       rpcServer.stop();
+<a class="jxr_linenumber" name="191" href="#191">191</a>     }
+<a class="jxr_linenumber" name="192" href="#192">192</a>   }
+<a class="jxr_linenumber" name="193" href="#193">193</a> 
+<a class="jxr_linenumber" name="194" href="#194">194</a>   <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">abstract</strong> AbstractRpcClient createRpcClient(Configuration conf);
+<a class="jxr_linenumber" name="195" href="#195">195</a> 
+<a class="jxr_linenumber" name="196" href="#196">196</a>   <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="197" href="#197">197</a> <em class="jxr_javadoccomment">   * It is hard to verify the compression is actually happening under the wraps. Hope that if</em>
+<a class="jxr_linenumber" name="198" href="#198">198</a> <em class="jxr_javadoccomment">   * unsupported, we'll get an exception out of some time (meantime, have to trace it manually to</em>
+<a class="jxr_linenumber" name="199" href="#199">199</a> <em class="jxr_javadoccomment">   * confirm that compression is happening down in the client and server).</em>
+<a class="jxr_linenumber" name="200" href="#200">200</a> <em class="jxr_javadoccomment">   * @throws IOException</em>
+<a class="jxr_linenumber" name="201" href="#201">201</a> <em class="jxr_javadoccomment">   * @throws InterruptedException</em>
+<a class="jxr_linenumber" name="202" href="#202">202</a> <em class="jxr_javadoccomment">   * @throws SecurityException</em>
+<a class="jxr_linenumber" name="203" href="#203">203</a> <em class="jxr_javadoccomment">   * @throws NoSuchMethodException</em>
+<a class="jxr_linenumber" name="204" href="#204">204</a> <em class="jxr_javadoccomment">   */</em>
+<a class="jxr_linenumber" name="205" href="#205">205</a>   @Test
+<a class="jxr_linenumber" name="206" href="#206">206</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testCompressCellBlock() <strong class="jxr_keyword">throws</strong> IOException, InterruptedException, SecurityException,
+<a class="jxr_linenumber" name="207" href="#207">207</a>       NoSuchMethodException, ServiceException {
+<a class="jxr_linenumber" name="208" href="#208">208</a>     Configuration conf = <strong class="jxr_keyword">new</strong> Configuration(HBaseConfiguration.create());
+<a class="jxr_linenumber" name="209" href="#209">209</a>     conf.set(<span class="jxr_string">"hbase.client.rpc.compressor"</span>, GzipCodec.<strong class="jxr_keyword">class</strong>.getCanonicalName());
+<a class="jxr_linenumber" name="210" href="#210">210</a>     List&lt;Cell&gt; cells = <strong class="jxr_keyword">new</strong> ArrayList&lt;Cell&gt;();
+<a class="jxr_linenumber" name="211" href="#211">211</a>     <strong class="jxr_keyword">int</strong> count = 3;
+<a class="jxr_linenumber" name="212" href="#212">212</a>     <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">int</strong> i = 0; i &lt; count; i++) {
+<a class="jxr_linenumber" name="213" href="#213">213</a>       cells.add(CELL);
+<a class="jxr_linenumber" name="214" href="#214">214</a>     }
+<a class="jxr_linenumber" name="215" href="#215">215</a>     AbstractRpcClient client = createRpcClient(conf);
+<a class="jxr_linenumber" name="216" href="#216">216</a>     <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a> rpcServer = <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a>();
+<a class="jxr_linenumber" name="217" href="#217">217</a>     <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="218" href="#218">218</a>       rpcServer.start();
+<a class="jxr_linenumber" name="219" href="#219">219</a>       MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName(<span class="jxr_string">"echo"</span>);
+<a class="jxr_linenumber" name="220" href="#220">220</a>       EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(<span class="jxr_string">"hello"</span>).build();
+<a class="jxr_linenumber" name="221" href="#221">221</a>       PayloadCarryingRpcController pcrc =
+<a class="jxr_linenumber" name="222" href="#222">222</a>           <strong class="jxr_keyword">new</strong> PayloadCarryingRpcController(CellUtil.createCellScanner(cells));
+<a class="jxr_linenumber" name="223" href="#223">223</a>       InetSocketAddress address = rpcServer.getListenerAddress();
+<a class="jxr_linenumber" name="224" href="#224">224</a>       <strong class="jxr_keyword">if</strong> (address == <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="225" href="#225">225</a>         <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IOException(<span class="jxr_string">"Listener channel is closed"</span>);
+<a class="jxr_linenumber" name="226" href="#226">226</a>       }
+<a class="jxr_linenumber" name="227" href="#227">227</a>       Pair&lt;Message, CellScanner&gt; r =
+<a class="jxr_linenumber" name="228" href="#228">228</a>           client.call(pcrc, md, param, md.getOutputType().toProto(), User.getCurrent(), address,
+<a class="jxr_linenumber" name="229" href="#229">229</a>               <strong class="jxr_keyword">new</strong> MetricsConnection.CallStats());
+<a class="jxr_linenumber" name="230" href="#230">230</a>       <strong class="jxr_keyword">int</strong> index = 0;
+<a class="jxr_linenumber" name="231" href="#231">231</a>       <strong class="jxr_keyword">while</strong> (r.getSecond().advance()) {
+<a class="jxr_linenumber" name="232" href="#232">232</a>         assertTrue(CELL.equals(r.getSecond().current()));
+<a class="jxr_linenumber" name="233" href="#233">233</a>         index++;
+<a class="jxr_linenumber" name="234" href="#234">234</a>       }
+<a class="jxr_linenumber" name="235" href="#235">235</a>       assertEquals(count, index);
+<a class="jxr_linenumber" name="236" href="#236">236</a>     } <strong class="jxr_keyword">finally</strong> {
+<a class="jxr_linenumber" name="237" href="#237">237</a>       client.close();
+<a class="jxr_linenumber" name="238" href="#238">238</a>       rpcServer.stop();
+<a class="jxr_linenumber" name="239" href="#239">239</a>     }
+<a class="jxr_linenumber" name="240" href="#240">240</a>   }
+<a class="jxr_linenumber" name="241" href="#241">241</a> 
+<a class="jxr_linenumber" name="242" href="#242">242</a>   <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">abstract</strong> AbstractRpcClient createRpcClientRTEDuringConnectionSetup(Configuration conf)
+<a class="jxr_linenumber" name="243" href="#243">243</a>       <strong class="jxr_keyword">throws</strong> IOException;
+<a class="jxr_linenumber" name="244" href="#244">244</a> 
+<a class="jxr_linenumber" name="245" href="#245">245</a>   @Test
+<a class="jxr_linenumber" name="246" href="#246">246</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testRTEDuringConnectionSetup() <strong class="jxr_keyword">throws</strong> Exception {
+<a class="jxr_linenumber" name="247" href="#247">247</a>     Configuration conf = HBaseConfiguration.create();
+<a class="jxr_linenumber" name="248" href="#248">248</a>     <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a> rpcServer = <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a>();
+<a class="jxr_linenumber" name="249" href="#249">249</a>     AbstractRpcClient client = createRpcClientRTEDuringConnectionSetup(conf);
+<a class="jxr_linenumber" name="250" href="#250">250</a>     <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="251" href="#251">251</a>       rpcServer.start();
+<a class="jxr_linenumber" name="252" href="#252">252</a>       MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName(<span class="jxr_string">"echo"</span>);
+<a class="jxr_linenumber" name="253" href="#253">253</a>       EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(<span class="jxr_string">"hello"</span>).build();
+<a class="jxr_linenumber" name="254" href="#254">254</a>       InetSocketAddress address = rpcServer.getListenerAddress();
+<a class="jxr_linenumber" name="255" href="#255">255</a>       <strong class="jxr_keyword">if</strong> (address == <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="256" href="#256">256</a>         <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IOException(<span class="jxr_string">"Listener channel is closed"</span>);
+<a class="jxr_linenumber" name="257" href="#257">257</a>       }
+<a class="jxr_linenumber" name="258" href="#258">258</a>       client.call(<strong class="jxr_keyword">null</strong>, md, param, <strong class="jxr_keyword">null</strong>, User.getCurrent(), address,
+<a class="jxr_linenumber" name="259" href="#259">259</a>           <strong class="jxr_keyword">new</strong> MetricsConnection.CallStats());
+<a class="jxr_linenumber" name="260" href="#260">260</a>       fail(<span class="jxr_string">"Expected an exception to have been thrown!"</span>);
+<a class="jxr_linenumber" name="261" href="#261">261</a>     } <strong class="jxr_keyword">catch</strong> (Exception e) {
+<a class="jxr_linenumber" name="262" href="#262">262</a>       LOG.info(<span class="jxr_string">"Caught expected exception: "</span> + e.toString());
+<a class="jxr_linenumber" name="263" href="#263">263</a>       assertTrue(StringUtils.stringifyException(e).contains(<span class="jxr_string">"Injected fault"</span>));
+<a class="jxr_linenumber" name="264" href="#264">264</a>     } <strong class="jxr_keyword">finally</strong> {
+<a class="jxr_linenumber" name="265" href="#265">265</a>       client.close();
+<a class="jxr_linenumber" name="266" href="#266">266</a>       rpcServer.stop();
+<a class="jxr_linenumber" name="267" href="#267">267</a>     }
+<a class="jxr_linenumber" name="268" href="#268">268</a>   }
+<a class="jxr_linenumber" name="269" href="#269">269</a> 
+<a class="jxr_linenumber" name="270" href="#270">270</a>   <em class="jxr_javadoccomment">/**</em><em class="jxr_javadoccomment"> Tests that the rpc scheduler is called when requests arrive. */</em>
+<a class="jxr_linenumber" name="271" href="#271">271</a>   @Test
+<a class="jxr_linenumber" name="272" href="#272">272</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testRpcScheduler() <strong class="jxr_keyword">throws</strong> IOException, InterruptedException {
+<a class="jxr_linenumber" name="273" href="#273">273</a>     RpcScheduler scheduler = spy(<strong class="jxr_keyword">new</strong> FifoRpcScheduler(CONF, 1));
+<a class="jxr_linenumber" name="274" href="#274">274</a>     RpcServer rpcServer = <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a>(scheduler, CONF);
+<a class="jxr_linenumber" name="275" href="#275">275</a>     verify(scheduler).init((RpcScheduler.Context) anyObject());
+<a class="jxr_linenumber" name="276" href="#276">276</a>     AbstractRpcClient client = createRpcClient(CONF);
+<a class="jxr_linenumber" name="277" href="#277">277</a>     <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="278" href="#278">278</a>       rpcServer.start();
+<a class="jxr_linenumber" name="279" href="#279">279</a>       verify(scheduler).start();
+<a class="jxr_linenumber" name="280" href="#280">280</a>       MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName(<span class="jxr_string">"echo"</span>);
+<a class="jxr_linenumber" name="281" href="#281">281</a>       EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(<span class="jxr_string">"hello"</span>).build();
+<a class="jxr_linenumber" name="282" href="#282">282</a>       InetSocketAddress address = rpcServer.getListenerAddress();
+<a class="jxr_linenumber" name="283" href="#283">283</a>       <strong class="jxr_keyword">if</strong> (address == <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="284" href="#284">284</a>         <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IOException(<span class="jxr_string">"Listener channel is closed"</span>);
+<a class="jxr_linenumber" name="285" href="#285">285</a>       }
+<a class="jxr_linenumber" name="286" href="#286">286</a>       <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">int</strong> i = 0; i &lt; 10; i++) {
+<a class="jxr_linenumber" name="287" href="#287">287</a>         client.call(<strong class="jxr_keyword">new</strong> PayloadCarryingRpcController(
+<a class="jxr_linenumber" name="288" href="#288">288</a>             CellUtil.createCellScanner(ImmutableList.&lt;Cell&gt; of(CELL))), md, param,
+<a class="jxr_linenumber" name="289" href="#289">289</a>             md.getOutputType().toProto(), User.getCurrent(), address,
+<a class="jxr_linenumber" name="290" href="#290">290</a>             <strong class="jxr_keyword">new</strong> MetricsConnection.CallStats());
+<a class="jxr_linenumber" name="291" href="#291">291</a>       }
+<a class="jxr_linenumber" name="292" href="#292">292</a>       verify(scheduler, times(10)).dispatch((CallRunner) anyObject());
+<a class="jxr_linenumber" name="293" href="#293">293</a>     } <strong class="jxr_keyword">finally</strong> {
+<a class="jxr_linenumber" name="294" href="#294">294</a>       rpcServer.stop();
+<a class="jxr_linenumber" name="295" href="#295">295</a>       verify(scheduler).stop();
+<a class="jxr_linenumber" name="296" href="#296">296</a>     }
+<a class="jxr_linenumber" name="297" href="#297">297</a>   }
+<a class="jxr_linenumber" name="298" href="#298">298</a> 
+<a class="jxr_linenumber" name="299" href="#299">299</a>   <em class="jxr_javadoccomment">/**</em><em class="jxr_javadoccomment"> Tests that the rpc scheduler is called when requests arrive. */</em>
+<a class="jxr_linenumber" name="300" href="#300">300</a>   @Test
+<a class="jxr_linenumber" name="301" href="#301">301</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> testRpcMaxRequestSize() <strong class="jxr_keyword">throws</strong> IOException, InterruptedException {
+<a class="jxr_linenumber" name="302" href="#302">302</a>     Configuration conf = <strong class="jxr_keyword">new</strong> Configuration(CONF);
+<a class="jxr_linenumber" name="303" href="#303">303</a>     conf.setInt(RpcServer.MAX_REQUEST_SIZE, 100);
+<a class="jxr_linenumber" name="304" href="#304">304</a>     RpcServer rpcServer = <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer</a>(conf);
+<a class="jxr_linenumber" name="305" href="#305">305</a>     AbstractRpcClient client = createRpcClient(conf);
+<a class="jxr_linenumber" name="306" href="#306">306</a>     <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="307" href="#307">307</a>       rpcServer.start();
+<a class="jxr_linenumber" name="308" href="#308">308</a>       MethodDescriptor md = SERVICE.getDescriptorForType().findMethodByName(<span class="jxr_string">"echo"</span>);
+<a class="jxr_linenumber" name="309" href="#309">309</a>       <em class="jxr_comment">// set total RPC size bigger than 100 bytes</em>
+<a class="jxr_linenumber" name="310" href="#310">310</a>       EchoRequestProto param = EchoRequestProto.newBuilder().setMessage(<span class="jxr_string">"hello.hello.hello.hello."</span>
+<a class="jxr_linenumber" name="311" href="#311">311</a>           + <span class="jxr_string">"hello.hello.hello.hello.hello.hello.hello.hello.hello.hello.hello.hello"</span>).build();
+<a class="jxr_linenumber" name="312" href="#312">312</a>       InetSocketAddress address = rpcServer.getListenerAddress();
+<a class="jxr_linenumber" name="313" href="#313">313</a>       <strong class="jxr_keyword">if</strong> (address == <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="314" href="#314">314</a>         <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> IOException(<span class="jxr_string">"Listener channel is closed"</span>);
+<a class="jxr_linenumber" name="315" href="#315">315</a>       }
+<a class="jxr_linenumber" name="316" href="#316">316</a>       <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="317" href="#317">317</a>         client.call(<strong class="jxr_keyword">new</strong> PayloadCarryingRpcController(
+<a class="jxr_linenumber" name="318" href="#318">318</a>           CellUtil.createCellScanner(ImmutableList.&lt;Cell&gt; of(CELL))), md, param,
+<a class="jxr_linenumber" name="319" href="#319">319</a>           md.getOutputType().toProto(), User.getCurrent(), address,
+<a class="jxr_linenumber" name="320" href="#320">320</a>           <strong class="jxr_keyword">new</strong> MetricsConnection.CallStats());
+<a class="jxr_linenumber" name="321" href="#321">321</a>         fail(<span class="jxr_string">"RPC should have failed because it exceeds max request size"</span>);
+<a class="jxr_linenumber" name="322" href="#322">322</a>       } <strong class="jxr_keyword">catch</strong>(IOException ex) {
+<a class="jxr_linenumber" name="323" href="#323">323</a>         <em class="jxr_comment">// pass</em>
+<a class="jxr_linenumber" name="324" href="#324">324</a>       }
+<a class="jxr_linenumber" name="325" href="#325">325</a>     } <strong class="jxr_keyword">finally</strong> {
+<a class="jxr_linenumber" name="326" href="#326">326</a>       rpcServer.stop();
+<a class="jxr_linenumber" name="327" href="#327">327</a>     }
+<a class="jxr_linenumber" name="328" href="#328">328</a>   }
+<a class="jxr_linenumber" name="329" href="#329">329</a> 
+<a class="jxr_linenumber" name="330" href="#330">330</a>   <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="331" href="#331">331</a> <em class="jxr_javadoccomment">   * Instance of RpcServer that echoes client hostAddress back to client</em>
+<a class="jxr_linenumber" name="332" href="#332">332</a> <em class="jxr_javadoccomment">   */</em>
+<a class="jxr_linenumber" name="333" href="#333">333</a>   <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">class</strong> <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer1</a> <strong class="jxr_keyword">extends</strong> RpcServer {
+<a class="jxr_linenumber" name="334" href="#334">334</a> 
+<a class="jxr_linenumber" name="335" href="#335">335</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> BlockingInterface SERVICE1 =
+<a class="jxr_linenumber" name="336" href="#336">336</a>         <strong class="jxr_keyword">new</strong> TestRpcServiceProtos.TestProtobufRpcProto.BlockingInterface() {
+<a class="jxr_linenumber" name="337" href="#337">337</a>           @Override
+<a class="jxr_linenumber" name="338" href="#338">338</a>           <strong class="jxr_keyword">public</strong> EmptyResponseProto ping(RpcController unused, EmptyRequestProto request)
+<a class="jxr_linenumber" name="339" href="#339">339</a>               <strong class="jxr_keyword">throws</strong> ServiceException {
+<a class="jxr_linenumber" name="340" href="#340">340</a>             <strong class="jxr_keyword">return</strong> EmptyResponseProto.newBuilder().build();
+<a class="jxr_linenumber" name="341" href="#341">341</a>           }
+<a class="jxr_linenumber" name="342" href="#342">342</a> 
+<a class="jxr_linenumber" name="343" href="#343">343</a>           @Override
+<a class="jxr_linenumber" name="344" href="#344">344</a>           <strong class="jxr_keyword">public</strong> EchoResponseProto echo(RpcController unused, EchoRequestProto request)
+<a class="jxr_linenumber" name="345" href="#345">345</a>               <strong class="jxr_keyword">throws</strong> ServiceException {
+<a class="jxr_linenumber" name="346" href="#346">346</a>             <strong class="jxr_keyword">final</strong> InetAddress remoteAddr = TestRpcServer1.getRemoteAddress();
+<a class="jxr_linenumber" name="347" href="#347">347</a>             <strong class="jxr_keyword">final</strong> String message = remoteAddr == <strong class="jxr_keyword">null</strong> ? <span class="jxr_string">"NULL"</span> : remoteAddr.getHostAddress();
+<a class="jxr_linenumber" name="348" href="#348">348</a>             <strong class="jxr_keyword">return</strong> EchoResponseProto.newBuilder().setMessage(message).build();
+<a class="jxr_linenumber" name="349" href="#349">349</a>           }
+<a class="jxr_linenumber" name="350" href="#350">350</a> 
+<a class="jxr_linenumber" name="351" href="#351">351</a>           @Override
+<a class="jxr_linenumber" name="352" href="#352">352</a>           <strong class="jxr_keyword">public</strong> EmptyResponseProto error(RpcController unused, EmptyRequestProto request)
+<a class="jxr_linenumber" name="353" href="#353">353</a>               <strong class="jxr_keyword">throws</strong> ServiceException {
+<a class="jxr_linenumber" name="354" href="#354">354</a>             <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> ServiceException(<span class="jxr_string">"error"</span>, <strong class="jxr_keyword">new</strong> IOException(<span class="jxr_string">"error"</span>));
+<a class="jxr_linenumber" name="355" href="#355">355</a>           }
+<a class="jxr_linenumber" name="356" href="#356">356</a>         };
+<a class="jxr_linenumber" name="357" href="#357">357</a> 
+<a class="jxr_linenumber" name="358" href="#358">358</a>     <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer1</a>() <strong class="jxr_keyword">throws</strong> IOException {
+<a class="jxr_linenumber" name="359" href="#359">359</a>       <strong class="jxr_keyword">this</strong>(<strong class="jxr_keyword">new</strong> FifoRpcScheduler(CONF, 1));
+<a class="jxr_linenumber" name="360" href="#360">360</a>     }
+<a class="jxr_linenumber" name="361" href="#361">361</a> 
+<a class="jxr_linenumber" name="362" href="#362">362</a>     <a href="../../../../../org/apache/hadoop/hbase/ipc/AbstractTestIPC.html">TestRpcServer1</a>(RpcScheduler scheduler) <strong class="jxr_keyword">throws</strong> IOException {
+<a class="jxr_line

<TRUNCATED>

[02/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/xref-test/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html
----------------------------------------------------------------------
diff --git a/xref-test/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html b/xref-test/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html
index 784bc8d..5260fba 100644
--- a/xref-test/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html
+++ b/xref-test/org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html
@@ -32,20 +32,20 @@
 <a class="jxr_linenumber" name="22" href="#22">22</a>  <strong class="jxr_keyword">import</strong> java.util.ArrayList;
 <a class="jxr_linenumber" name="23" href="#23">23</a>  <strong class="jxr_keyword">import</strong> java.util.List;
 <a class="jxr_linenumber" name="24" href="#24">24</a>  
-<a class="jxr_linenumber" name="25" href="#25">25</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.CellComparator;
-<a class="jxr_linenumber" name="26" href="#26">26</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.KeyValue;
-<a class="jxr_linenumber" name="27" href="#27">27</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.util.CollectionBackedScanner;
-<a class="jxr_linenumber" name="28" href="#28">28</a>  
-<a class="jxr_linenumber" name="29" href="#29">29</a>  <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="30" href="#30">30</a>  <em class="jxr_javadoccomment"> * A fixture that implements and presents a KeyValueScanner.</em>
-<a class="jxr_linenumber" name="31" href="#31">31</a>  <em class="jxr_javadoccomment"> * It takes a list of key/values which is then sorted according</em>
-<a class="jxr_linenumber" name="32" href="#32">32</a>  <em class="jxr_javadoccomment"> * to the provided comparator, and then the whole thing pretends</em>
-<a class="jxr_linenumber" name="33" href="#33">33</a>  <em class="jxr_javadoccomment"> * to be a store file scanner.</em>
-<a class="jxr_linenumber" name="34" href="#34">34</a>  <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="35" href="#35">35</a>  <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">class</strong> <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html">KeyValueScanFixture</a> <strong class="jxr_keyword">extends</strong> CollectionBackedScanner {
-<a class="jxr_linenumber" name="36" href="#36">36</a>    <strong class="jxr_keyword">public</strong> <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html">KeyValueScanFixture</a>(CellComparator comparator,
-<a class="jxr_linenumber" name="37" href="#37">37</a>                               KeyValue... incData) {
-<a class="jxr_linenumber" name="38" href="#38">38</a>      <strong class="jxr_keyword">super</strong>(comparator, incData);
+<a class="jxr_linenumber" name="25" href="#25">25</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.Cell;
+<a class="jxr_linenumber" name="26" href="#26">26</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.CellComparator;
+<a class="jxr_linenumber" name="27" href="#27">27</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.KeyValue;
+<a class="jxr_linenumber" name="28" href="#28">28</a>  <strong class="jxr_keyword">import</strong> org.apache.hadoop.hbase.util.CollectionBackedScanner;
+<a class="jxr_linenumber" name="29" href="#29">29</a>  
+<a class="jxr_linenumber" name="30" href="#30">30</a>  <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="31" href="#31">31</a>  <em class="jxr_javadoccomment"> * A fixture that implements and presents a KeyValueScanner.</em>
+<a class="jxr_linenumber" name="32" href="#32">32</a>  <em class="jxr_javadoccomment"> * It takes a list of key/values which is then sorted according</em>
+<a class="jxr_linenumber" name="33" href="#33">33</a>  <em class="jxr_javadoccomment"> * to the provided comparator, and then the whole thing pretends</em>
+<a class="jxr_linenumber" name="34" href="#34">34</a>  <em class="jxr_javadoccomment"> * to be a store file scanner.</em>
+<a class="jxr_linenumber" name="35" href="#35">35</a>  <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="36" href="#36">36</a>  <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">class</strong> <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html">KeyValueScanFixture</a> <strong class="jxr_keyword">extends</strong> CollectionBackedScanner {
+<a class="jxr_linenumber" name="37" href="#37">37</a>    <strong class="jxr_keyword">public</strong> <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html">KeyValueScanFixture</a>(CellComparator comparator, Cell... cells) {
+<a class="jxr_linenumber" name="38" href="#38">38</a>      <strong class="jxr_keyword">super</strong>(comparator, cells);
 <a class="jxr_linenumber" name="39" href="#39">39</a>    }
 <a class="jxr_linenumber" name="40" href="#40">40</a>  
 <a class="jxr_linenumber" name="41" href="#41">41</a>    <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> List&lt;KeyValueScanner&gt; scanFixture(KeyValue[] ... kvArrays) {

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/xref-test/org/apache/hadoop/hbase/regionserver/TestKeyValueScanFixture.html
----------------------------------------------------------------------
diff --git a/xref-test/org/apache/hadoop/hbase/regionserver/TestKeyValueScanFixture.html b/xref-test/org/apache/hadoop/hbase/regionserver/TestKeyValueScanFixture.html
index 0014b0b..d4fd459 100644
--- a/xref-test/org/apache/hadoop/hbase/regionserver/TestKeyValueScanFixture.html
+++ b/xref-test/org/apache/hadoop/hbase/regionserver/TestKeyValueScanFixture.html
@@ -56,35 +56,34 @@
 <a class="jxr_linenumber" name="46" href="#46">46</a>          KeyValueTestUtil.create(<span class="jxr_string">"RowB"</span>, <span class="jxr_string">"family"</span>, <span class="jxr_string">"qf1"</span>,
 <a class="jxr_linenumber" name="47" href="#47">47</a>              10, KeyValue.Type.Put, <span class="jxr_string">"value-10"</span>)
 <a class="jxr_linenumber" name="48" href="#48">48</a>      };
-<a class="jxr_linenumber" name="49" href="#49">49</a>      KeyValueScanner scan = <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html">KeyValueScanFixture</a>(
-<a class="jxr_linenumber" name="50" href="#50">50</a>          CellComparator.COMPARATOR, kvs);
-<a class="jxr_linenumber" name="51" href="#51">51</a>  
-<a class="jxr_linenumber" name="52" href="#52">52</a>      KeyValue kv = KeyValueUtil.createFirstOnRow(Bytes.toBytes(<span class="jxr_string">"RowA"</span>));
-<a class="jxr_linenumber" name="53" href="#53">53</a>      <em class="jxr_comment">// should seek to this:</em>
-<a class="jxr_linenumber" name="54" href="#54">54</a>      assertTrue(scan.seek(kv));
-<a class="jxr_linenumber" name="55" href="#55">55</a>      Cell res = scan.peek();
-<a class="jxr_linenumber" name="56" href="#56">56</a>      assertEquals(kvs[0], res);
-<a class="jxr_linenumber" name="57" href="#57">57</a>  
-<a class="jxr_linenumber" name="58" href="#58">58</a>      kv = KeyValueUtil.createFirstOnRow(Bytes.toBytes(<span class="jxr_string">"RowB"</span>));
-<a class="jxr_linenumber" name="59" href="#59">59</a>      assertTrue(scan.seek(kv));
-<a class="jxr_linenumber" name="60" href="#60">60</a>      res = scan.peek();
-<a class="jxr_linenumber" name="61" href="#61">61</a>      assertEquals(kvs[2], res);
-<a class="jxr_linenumber" name="62" href="#62">62</a>  
-<a class="jxr_linenumber" name="63" href="#63">63</a>      <em class="jxr_comment">// ensure we pull things out properly:</em>
-<a class="jxr_linenumber" name="64" href="#64">64</a>      kv = KeyValueUtil.createFirstOnRow(Bytes.toBytes(<span class="jxr_string">"RowA"</span>));
-<a class="jxr_linenumber" name="65" href="#65">65</a>      assertTrue(scan.seek(kv));
-<a class="jxr_linenumber" name="66" href="#66">66</a>      assertEquals(kvs[0], scan.peek());
-<a class="jxr_linenumber" name="67" href="#67">67</a>      assertEquals(kvs[0], scan.next());
-<a class="jxr_linenumber" name="68" href="#68">68</a>      assertEquals(kvs[1], scan.peek());
-<a class="jxr_linenumber" name="69" href="#69">69</a>      assertEquals(kvs[1], scan.next());
-<a class="jxr_linenumber" name="70" href="#70">70</a>      assertEquals(kvs[2], scan.peek());
-<a class="jxr_linenumber" name="71" href="#71">71</a>      assertEquals(kvs[2], scan.next());
-<a class="jxr_linenumber" name="72" href="#72">72</a>      assertEquals(<strong class="jxr_keyword">null</strong>, scan.peek());
-<a class="jxr_linenumber" name="73" href="#73">73</a>      assertEquals(<strong class="jxr_keyword">null</strong>, scan.next());
-<a class="jxr_linenumber" name="74" href="#74">74</a>    }
-<a class="jxr_linenumber" name="75" href="#75">75</a>  
-<a class="jxr_linenumber" name="76" href="#76">76</a>  }
-<a class="jxr_linenumber" name="77" href="#77">77</a>  
+<a class="jxr_linenumber" name="49" href="#49">49</a>      KeyValueScanner scan = <strong class="jxr_keyword">new</strong> <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanFixture.html">KeyValueScanFixture</a>(CellComparator.COMPARATOR, kvs);
+<a class="jxr_linenumber" name="50" href="#50">50</a>  
+<a class="jxr_linenumber" name="51" href="#51">51</a>      KeyValue kv = KeyValueUtil.createFirstOnRow(Bytes.toBytes(<span class="jxr_string">"RowA"</span>));
+<a class="jxr_linenumber" name="52" href="#52">52</a>      <em class="jxr_comment">// should seek to this:</em>
+<a class="jxr_linenumber" name="53" href="#53">53</a>      assertTrue(scan.seek(kv));
+<a class="jxr_linenumber" name="54" href="#54">54</a>      Cell res = scan.peek();
+<a class="jxr_linenumber" name="55" href="#55">55</a>      assertEquals(kvs[0], res);
+<a class="jxr_linenumber" name="56" href="#56">56</a>  
+<a class="jxr_linenumber" name="57" href="#57">57</a>      kv = KeyValueUtil.createFirstOnRow(Bytes.toBytes(<span class="jxr_string">"RowB"</span>));
+<a class="jxr_linenumber" name="58" href="#58">58</a>      assertTrue(scan.seek(kv));
+<a class="jxr_linenumber" name="59" href="#59">59</a>      res = scan.peek();
+<a class="jxr_linenumber" name="60" href="#60">60</a>      assertEquals(kvs[2], res);
+<a class="jxr_linenumber" name="61" href="#61">61</a>  
+<a class="jxr_linenumber" name="62" href="#62">62</a>      <em class="jxr_comment">// ensure we pull things out properly:</em>
+<a class="jxr_linenumber" name="63" href="#63">63</a>      kv = KeyValueUtil.createFirstOnRow(Bytes.toBytes(<span class="jxr_string">"RowA"</span>));
+<a class="jxr_linenumber" name="64" href="#64">64</a>      assertTrue(scan.seek(kv));
+<a class="jxr_linenumber" name="65" href="#65">65</a>      assertEquals(kvs[0], scan.peek());
+<a class="jxr_linenumber" name="66" href="#66">66</a>      assertEquals(kvs[0], scan.next());
+<a class="jxr_linenumber" name="67" href="#67">67</a>      assertEquals(kvs[1], scan.peek());
+<a class="jxr_linenumber" name="68" href="#68">68</a>      assertEquals(kvs[1], scan.next());
+<a class="jxr_linenumber" name="69" href="#69">69</a>      assertEquals(kvs[2], scan.peek());
+<a class="jxr_linenumber" name="70" href="#70">70</a>      assertEquals(kvs[2], scan.next());
+<a class="jxr_linenumber" name="71" href="#71">71</a>      assertEquals(<strong class="jxr_keyword">null</strong>, scan.peek());
+<a class="jxr_linenumber" name="72" href="#72">72</a>      assertEquals(<strong class="jxr_keyword">null</strong>, scan.next());
+<a class="jxr_linenumber" name="73" href="#73">73</a>    }
+<a class="jxr_linenumber" name="74" href="#74">74</a>  
+<a class="jxr_linenumber" name="75" href="#75">75</a>  }
+<a class="jxr_linenumber" name="76" href="#76">76</a>  
 </pre>
 <hr/><div id="footer">This page was automatically generated by <a href="http://maven.apache.org/">Maven</a></div></body>
 </html>


[18/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 cc3c353..995bce0 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 = "filter", type = "String"),<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    @org.jamon.annotations.Argument(name = "catalogJanitorEnabled", type = "boolean"),<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 = "frags", type = "Map&lt;String,Integer&gt;"),<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    @org.jamon.annotations.Argument(name = "serverManager", type = "ServerManager"),<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    @org.jamon.annotations.Argument(name = "deadServers", type = "Set&lt;ServerName&gt;"),<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    @org.jamon.annotations.Argument(name = "assignmentManager", type = "AssignmentManager"),<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<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 = "format", type = "String"),<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    @org.jamon.annotations.Argument(name = "assignmentManager", type = "AssignmentManager"),<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    @org.jamon.annotations.Argument(name = "filter", type = "String"),<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    @org.jamon.annotations.Argument(name = "servers", type = "List&lt;ServerName&gt;"),<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    @org.jamon.annotations.Argument(name = "deadServers", type = "Set&lt;ServerName&gt;"),<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    @org.jamon.annotations.Argument(name = "serverManager", type = "ServerManager"),<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    @org.jamon.annotations.Argument(name = "catalogJanitorEnabled", type = "boolean"),<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    @org.jamon.annotations.Argument(name = "frags", type = "Map&lt;String,Integer&gt;"),<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    @org.jamon.annotations.Argument(name = "metaLocation", type = "ServerName")})<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>    // 26, 1<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    public void setFilter(String filter)<a name="line.112"></a>
+<span class="sourceLineNo">111</span>    // 27, 1<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    public void setFormat(String format)<a name="line.112"></a>
 <span class="sourceLineNo">113</span>    {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      // 26, 1<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      m_filter = filter;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      m_filter__IsNotDefault = true;<a name="line.116"></a>
+<span class="sourceLineNo">114</span>      // 27, 1<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      m_format = format;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      m_format__IsNotDefault = true;<a name="line.116"></a>
 <span class="sourceLineNo">117</span>    }<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    public String getFilter()<a name="line.118"></a>
+<span class="sourceLineNo">118</span>    public String getFormat()<a name="line.118"></a>
 <span class="sourceLineNo">119</span>    {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      return m_filter;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>      return m_format;<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    private String m_filter;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public boolean getFilter__IsNotDefault()<a name="line.123"></a>
+<span class="sourceLineNo">122</span>    private String m_format;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    public boolean getFormat__IsNotDefault()<a name="line.123"></a>
 <span class="sourceLineNo">124</span>    {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      return m_filter__IsNotDefault;<a name="line.125"></a>
+<span class="sourceLineNo">125</span>      return m_format__IsNotDefault;<a name="line.125"></a>
 <span class="sourceLineNo">126</span>    }<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    private boolean m_filter__IsNotDefault;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    // 25, 1<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    public void setCatalogJanitorEnabled(boolean catalogJanitorEnabled)<a name="line.129"></a>
+<span class="sourceLineNo">127</span>    private boolean m_format__IsNotDefault;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    // 29, 1<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    public void setAssignmentManager(AssignmentManager assignmentManager)<a name="line.129"></a>
 <span class="sourceLineNo">130</span>    {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      // 25, 1<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      m_catalogJanitorEnabled = catalogJanitorEnabled;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      m_catalogJanitorEnabled__IsNotDefault = true;<a name="line.133"></a>
+<span class="sourceLineNo">131</span>      // 29, 1<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      m_assignmentManager = assignmentManager;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      m_assignmentManager__IsNotDefault = true;<a name="line.133"></a>
 <span class="sourceLineNo">134</span>    }<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    public boolean getCatalogJanitorEnabled()<a name="line.135"></a>
+<span class="sourceLineNo">135</span>    public AssignmentManager getAssignmentManager()<a name="line.135"></a>
 <span class="sourceLineNo">136</span>    {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      return m_catalogJanitorEnabled;<a name="line.137"></a>
+<span class="sourceLineNo">137</span>      return m_assignmentManager;<a name="line.137"></a>
 <span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    private boolean m_catalogJanitorEnabled;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    public boolean getCatalogJanitorEnabled__IsNotDefault()<a name="line.140"></a>
+<span class="sourceLineNo">139</span>    private AssignmentManager m_assignmentManager;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    public boolean getAssignmentManager__IsNotDefault()<a name="line.140"></a>
 <span class="sourceLineNo">141</span>    {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return m_catalogJanitorEnabled__IsNotDefault;<a name="line.142"></a>
+<span class="sourceLineNo">142</span>      return m_assignmentManager__IsNotDefault;<a name="line.142"></a>
 <span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    private boolean m_catalogJanitorEnabled__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_assignmentManager__IsNotDefault;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    // 26, 1<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    public void setFilter(String filter)<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>      // 26, 1<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      m_filter = filter;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      m_filter__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 String getFilter()<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_filter;<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 String m_filter;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    public boolean getFilter__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_filter__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>    // 21, 1<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public void setFrags(Map&lt;String,Integer&gt; frags)<a name="line.163"></a>
+<span class="sourceLineNo">161</span>    private boolean m_filter__IsNotDefault;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    // 23, 1<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void setServers(List&lt;ServerName&gt; servers)<a name="line.163"></a>
 <span class="sourceLineNo">164</span>    {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      // 21, 1<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      m_frags = frags;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      m_frags__IsNotDefault = true;<a name="line.167"></a>
+<span class="sourceLineNo">165</span>      // 23, 1<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      m_servers = servers;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      m_servers__IsNotDefault = true;<a name="line.167"></a>
 <span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    public Map&lt;String,Integer&gt; getFrags()<a name="line.169"></a>
+<span class="sourceLineNo">169</span>    public List&lt;ServerName&gt; getServers()<a name="line.169"></a>
 <span class="sourceLineNo">170</span>    {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      return m_frags;<a name="line.171"></a>
+<span class="sourceLineNo">171</span>      return m_servers;<a name="line.171"></a>
 <span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private Map&lt;String,Integer&gt; m_frags;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    public boolean getFrags__IsNotDefault()<a name="line.174"></a>
+<span class="sourceLineNo">173</span>    private List&lt;ServerName&gt; m_servers;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    public boolean getServers__IsNotDefault()<a name="line.174"></a>
 <span class="sourceLineNo">175</span>    {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      return m_frags__IsNotDefault;<a name="line.176"></a>
+<span class="sourceLineNo">176</span>      return m_servers__IsNotDefault;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    private boolean m_frags__IsNotDefault;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    // 28, 1<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    public void setServerManager(ServerManager serverManager)<a name="line.180"></a>
+<span class="sourceLineNo">178</span>    private boolean m_servers__IsNotDefault;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    // 24, 1<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    public void setDeadServers(Set&lt;ServerName&gt; deadServers)<a name="line.180"></a>
 <span class="sourceLineNo">181</span>    {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      // 28, 1<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      m_serverManager = serverManager;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      m_serverManager__IsNotDefault = true;<a name="line.184"></a>
+<span class="sourceLineNo">182</span>      // 24, 1<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      m_deadServers = deadServers;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      m_deadServers__IsNotDefault = true;<a name="line.184"></a>
 <span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    public ServerManager getServerManager()<a name="line.186"></a>
+<span class="sourceLineNo">186</span>    public Set&lt;ServerName&gt; getDeadServers()<a name="line.186"></a>
 <span class="sourceLineNo">187</span>    {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      return m_serverManager;<a name="line.188"></a>
+<span class="sourceLineNo">188</span>      return m_deadServers;<a name="line.188"></a>
 <span class="sourceLineNo">189</span>    }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    private ServerManager m_serverManager;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    public boolean getServerManager__IsNotDefault()<a name="line.191"></a>
+<span class="sourceLineNo">190</span>    private Set&lt;ServerName&gt; m_deadServers;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    public boolean getDeadServers__IsNotDefault()<a name="line.191"></a>
 <span class="sourceLineNo">192</span>    {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      return m_serverManager__IsNotDefault;<a name="line.193"></a>
+<span class="sourceLineNo">193</span>      return m_deadServers__IsNotDefault;<a name="line.193"></a>
 <span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    private boolean m_serverManager__IsNotDefault;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    // 24, 1<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    public void setDeadServers(Set&lt;ServerName&gt; deadServers)<a name="line.197"></a>
+<span class="sourceLineNo">195</span>    private boolean m_deadServers__IsNotDefault;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    // 28, 1<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void setServerManager(ServerManager serverManager)<a name="line.197"></a>
 <span class="sourceLineNo">198</span>    {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      // 24, 1<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      m_deadServers = deadServers;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      m_deadServers__IsNotDefault = true;<a name="line.201"></a>
+<span class="sourceLineNo">199</span>      // 28, 1<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      m_serverManager = serverManager;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      m_serverManager__IsNotDefault = true;<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    }<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    public Set&lt;ServerName&gt; getDeadServers()<a name="line.203"></a>
+<span class="sourceLineNo">203</span>    public ServerManager getServerManager()<a name="line.203"></a>
 <span class="sourceLineNo">204</span>    {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      return m_deadServers;<a name="line.205"></a>
+<span class="sourceLineNo">205</span>      return m_serverManager;<a name="line.205"></a>
 <span class="sourceLineNo">206</span>    }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private Set&lt;ServerName&gt; m_deadServers;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    public boolean getDeadServers__IsNotDefault()<a name="line.208"></a>
+<span class="sourceLineNo">207</span>    private ServerManager m_serverManager;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    public boolean getServerManager__IsNotDefault()<a name="line.208"></a>
 <span class="sourceLineNo">209</span>    {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      return m_deadServers__IsNotDefault;<a name="line.210"></a>
+<span class="sourceLineNo">210</span>      return m_serverManager__IsNotDefault;<a name="line.210"></a>
 <span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    private boolean m_deadServers__IsNotDefault;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    // 29, 1<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    public void setAssignmentManager(AssignmentManager assignmentManager)<a name="line.214"></a>
+<span class="sourceLineNo">212</span>    private boolean m_serverManager__IsNotDefault;<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    // 25, 1<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    public void setCatalogJanitorEnabled(boolean catalogJanitorEnabled)<a name="line.214"></a>
 <span class="sourceLineNo">215</span>    {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      // 29, 1<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      m_assignmentManager = assignmentManager;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      m_assignmentManager__IsNotDefault = true;<a name="line.218"></a>
+<span class="sourceLineNo">216</span>      // 25, 1<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      m_catalogJanitorEnabled = catalogJanitorEnabled;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      m_catalogJanitorEnabled__IsNotDefault = true;<a name="line.218"></a>
 <span class="sourceLineNo">219</span>    }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    public AssignmentManager getAssignmentManager()<a name="line.220"></a>
+<span class="sourceLineNo">220</span>    public boolean getCatalogJanitorEnabled()<a name="line.220"></a>
 <span class="sourceLineNo">221</span>    {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      return m_assignmentManager;<a name="line.222"></a>
+<span class="sourceLineNo">222</span>      return m_catalogJanitorEnabled;<a name="line.222"></a>
 <span class="sourceLineNo">223</span>    }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    private AssignmentManager m_assignmentManager;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    public boolean getAssignmentManager__IsNotDefault()<a name="line.225"></a>
+<span class="sourceLineNo">224</span>    private boolean m_catalogJanitorEnabled;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public boolean getCatalogJanitorEnabled__IsNotDefault()<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return m_assignmentManager__IsNotDefault;<a name="line.227"></a>
+<span class="sourceLineNo">227</span>      return m_catalogJanitorEnabled__IsNotDefault;<a name="line.227"></a>
 <span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    private boolean m_assignmentManager__IsNotDefault;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    // 27, 1<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    public void setFormat(String format)<a name="line.231"></a>
+<span class="sourceLineNo">229</span>    private boolean m_catalogJanitorEnabled__IsNotDefault;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    // 21, 1<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    public void setFrags(Map&lt;String,Integer&gt; frags)<a name="line.231"></a>
 <span class="sourceLineNo">232</span>    {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      // 27, 1<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      m_format = format;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      m_format__IsNotDefault = true;<a name="line.235"></a>
+<span class="sourceLineNo">233</span>      // 21, 1<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      m_frags = frags;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      m_frags__IsNotDefault = true;<a name="line.235"></a>
 <span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    public String getFormat()<a name="line.237"></a>
+<span class="sourceLineNo">237</span>    public Map&lt;String,Integer&gt; getFrags()<a name="line.237"></a>
 <span class="sourceLineNo">238</span>    {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return m_format;<a name="line.239"></a>
+<span class="sourceLineNo">239</span>      return m_frags;<a name="line.239"></a>
 <span class="sourceLineNo">240</span>    }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    private String m_format;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    public boolean getFormat__IsNotDefault()<a name="line.242"></a>
+<span class="sourceLineNo">241</span>    private Map&lt;String,Integer&gt; m_frags;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    public boolean getFrags__IsNotDefault()<a name="line.242"></a>
 <span class="sourceLineNo">243</span>    {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      return m_format__IsNotDefault;<a name="line.244"></a>
+<span class="sourceLineNo">244</span>      return m_frags__IsNotDefault;<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    private boolean m_format__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_frags__IsNotDefault;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // 22, 1<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    public void setMetaLocation(ServerName metaLocation)<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>      // 22, 1<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      m_metaLocation = metaLocation;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      m_metaLocation__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 ServerName getMetaLocation()<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_metaLocation;<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 ServerName m_metaLocation;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    public boolean getMetaLocation__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_metaLocation__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_metaLocation__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 String filter;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFilter(String p_filter)<a name="line.276"></a>
+<span class="sourceLineNo">275</span>  protected String format;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFormat(String p_format)<a name="line.276"></a>
 <span class="sourceLineNo">277</span>  {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    (getImplData()).setFilter(p_filter);<a name="line.278"></a>
+<span class="sourceLineNo">278</span>    (getImplData()).setFormat(p_format);<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 boolean catalogJanitorEnabled;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setCatalogJanitorEnabled(boolean p_catalogJanitorEnabled)<a name="line.283"></a>
+<span class="sourceLineNo">282</span>  protected AssignmentManager assignmentManager;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setAssignmentManager(AssignmentManager p_assignmentManager)<a name="line.283"></a>
 <span class="sourceLineNo">284</span>  {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    (getImplData()).setCatalogJanitorEnabled(p_catalogJanitorEnabled);<a name="line.285"></a>
+<span class="sourceLineNo">285</span>    (getImplData()).setAssignmentManager(p_assignmentManager);<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 String filter;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFilter(String p_filter)<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()).setFilter(p_filter);<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 Map&lt;String,Integer&gt; frags;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFrags(Map&lt;String,Integer&gt; p_frags)<a name="line.297"></a>
+<span class="sourceLineNo">296</span>  protected List&lt;ServerName&gt; servers;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServers(List&lt;ServerName&gt; p_servers)<a name="line.297"></a>
 <span class="sourceLineNo">298</span>  {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    (getImplData()).setFrags(p_frags);<a name="line.299"></a>
+<span class="sourceLineNo">299</span>    (getImplData()).setServers(p_servers);<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 ServerManager serverManager;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServerManager(ServerManager p_serverManager)<a name="line.304"></a>
+<span class="sourceLineNo">303</span>  protected Set&lt;ServerName&gt; deadServers;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setDeadServers(Set&lt;ServerName&gt; p_deadServers)<a name="line.304"></a>
 <span class="sourceLineNo">305</span>  {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    (getImplData()).setServerManager(p_serverManager);<a name="line.306"></a>
+<span class="sourceLineNo">306</span>    (getImplData()).setDeadServers(p_deadServers);<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 Set&lt;ServerName&gt; deadServers;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setDeadServers(Set&lt;ServerName&gt; p_deadServers)<a name="line.311"></a>
+<span class="sourceLineNo">310</span>  protected ServerManager serverManager;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServerManager(ServerManager p_serverManager)<a name="line.311"></a>
 <span class="sourceLineNo">312</span>  {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    (getImplData()).setDeadServers(p_deadServers);<a name="line.313"></a>
+<span class="sourceLineNo">313</span>    (getImplData()).setServerManager(p_serverManager);<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 AssignmentManager assignmentManager;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setAssignmentManager(AssignmentManager p_assignmentManager)<a name="line.318"></a>
+<span class="sourceLineNo">317</span>  protected boolean catalogJanitorEnabled;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setCatalogJanitorEnabled(boolean p_catalogJanitorEnabled)<a name="line.318"></a>
 <span class="sourceLineNo">319</span>  {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    (getImplData()).setAssignmentManager(p_assignmentManager);<a name="line.320"></a>
+<span class="sourceLineNo">320</span>    (getImplData()).setCatalogJanitorEnabled(p_catalogJanitorEnabled);<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 String format;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFormat(String p_format)<a name="line.325"></a>
+<span class="sourceLineNo">324</span>  protected Map&lt;String,Integer&gt; frags;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFrags(Map&lt;String,Integer&gt; p_frags)<a name="line.325"></a>
 <span class="sourceLineNo">326</span>  {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    (getImplData()).setFormat(p_format);<a name="line.327"></a>
+<span class="sourceLineNo">327</span>    (getImplData()).setFrags(p_frags);<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 ServerName metaLocation;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setMetaLocation(ServerName p_metaLocation)<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()).setMetaLocation(p_metaLocation);<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/f30982bd/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 cc3c353..995bce0 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 = "filter", type = "String"),<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    @org.jamon.annotations.Argument(name = "catalogJanitorEnabled", type = "boolean"),<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 = "frags", type = "Map&lt;String,Integer&gt;"),<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    @org.jamon.annotations.Argument(name = "serverManager", type = "ServerManager"),<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    @org.jamon.annotations.Argument(name = "deadServers", type = "Set&lt;ServerName&gt;"),<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    @org.jamon.annotations.Argument(name = "assignmentManager", type = "AssignmentManager"),<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<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 = "format", type = "String"),<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    @org.jamon.annotations.Argument(name = "assignmentManager", type = "AssignmentManager"),<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    @org.jamon.annotations.Argument(name = "filter", type = "String"),<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    @org.jamon.annotations.Argument(name = "servers", type = "List&lt;ServerName&gt;"),<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    @org.jamon.annotations.Argument(name = "deadServers", type = "Set&lt;ServerName&gt;"),<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    @org.jamon.annotations.Argument(name = "serverManager", type = "ServerManager"),<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    @org.jamon.annotations.Argument(name = "catalogJanitorEnabled", type = "boolean"),<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    @org.jamon.annotations.Argument(name = "frags", type = "Map&lt;String,Integer&gt;"),<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    @org.jamon.annotations.Argument(name = "metaLocation", type = "ServerName")})<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>    // 26, 1<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    public void setFilter(String filter)<a name="line.112"></a>
+<span class="sourceLineNo">111</span>    // 27, 1<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    public void setFormat(String format)<a name="line.112"></a>
 <span class="sourceLineNo">113</span>    {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      // 26, 1<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      m_filter = filter;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      m_filter__IsNotDefault = true;<a name="line.116"></a>
+<span class="sourceLineNo">114</span>      // 27, 1<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      m_format = format;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      m_format__IsNotDefault = true;<a name="line.116"></a>
 <span class="sourceLineNo">117</span>    }<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    public String getFilter()<a name="line.118"></a>
+<span class="sourceLineNo">118</span>    public String getFormat()<a name="line.118"></a>
 <span class="sourceLineNo">119</span>    {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      return m_filter;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>      return m_format;<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    private String m_filter;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public boolean getFilter__IsNotDefault()<a name="line.123"></a>
+<span class="sourceLineNo">122</span>    private String m_format;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    public boolean getFormat__IsNotDefault()<a name="line.123"></a>
 <span class="sourceLineNo">124</span>    {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      return m_filter__IsNotDefault;<a name="line.125"></a>
+<span class="sourceLineNo">125</span>      return m_format__IsNotDefault;<a name="line.125"></a>
 <span class="sourceLineNo">126</span>    }<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    private boolean m_filter__IsNotDefault;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    // 25, 1<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    public void setCatalogJanitorEnabled(boolean catalogJanitorEnabled)<a name="line.129"></a>
+<span class="sourceLineNo">127</span>    private boolean m_format__IsNotDefault;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    // 29, 1<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    public void setAssignmentManager(AssignmentManager assignmentManager)<a name="line.129"></a>
 <span class="sourceLineNo">130</span>    {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      // 25, 1<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      m_catalogJanitorEnabled = catalogJanitorEnabled;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      m_catalogJanitorEnabled__IsNotDefault = true;<a name="line.133"></a>
+<span class="sourceLineNo">131</span>      // 29, 1<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      m_assignmentManager = assignmentManager;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      m_assignmentManager__IsNotDefault = true;<a name="line.133"></a>
 <span class="sourceLineNo">134</span>    }<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    public boolean getCatalogJanitorEnabled()<a name="line.135"></a>
+<span class="sourceLineNo">135</span>    public AssignmentManager getAssignmentManager()<a name="line.135"></a>
 <span class="sourceLineNo">136</span>    {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      return m_catalogJanitorEnabled;<a name="line.137"></a>
+<span class="sourceLineNo">137</span>      return m_assignmentManager;<a name="line.137"></a>
 <span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    private boolean m_catalogJanitorEnabled;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    public boolean getCatalogJanitorEnabled__IsNotDefault()<a name="line.140"></a>
+<span class="sourceLineNo">139</span>    private AssignmentManager m_assignmentManager;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    public boolean getAssignmentManager__IsNotDefault()<a name="line.140"></a>
 <span class="sourceLineNo">141</span>    {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return m_catalogJanitorEnabled__IsNotDefault;<a name="line.142"></a>
+<span class="sourceLineNo">142</span>      return m_assignmentManager__IsNotDefault;<a name="line.142"></a>
 <span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    private boolean m_catalogJanitorEnabled__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_assignmentManager__IsNotDefault;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    // 26, 1<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    public void setFilter(String filter)<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>      // 26, 1<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      m_filter = filter;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      m_filter__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 String getFilter()<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_filter;<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 String m_filter;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    public boolean getFilter__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_filter__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>    // 21, 1<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public void setFrags(Map&lt;String,Integer&gt; frags)<a name="line.163"></a>
+<span class="sourceLineNo">161</span>    private boolean m_filter__IsNotDefault;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    // 23, 1<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void setServers(List&lt;ServerName&gt; servers)<a name="line.163"></a>
 <span class="sourceLineNo">164</span>    {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      // 21, 1<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      m_frags = frags;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      m_frags__IsNotDefault = true;<a name="line.167"></a>
+<span class="sourceLineNo">165</span>      // 23, 1<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      m_servers = servers;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      m_servers__IsNotDefault = true;<a name="line.167"></a>
 <span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    public Map&lt;String,Integer&gt; getFrags()<a name="line.169"></a>
+<span class="sourceLineNo">169</span>    public List&lt;ServerName&gt; getServers()<a name="line.169"></a>
 <span class="sourceLineNo">170</span>    {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      return m_frags;<a name="line.171"></a>
+<span class="sourceLineNo">171</span>      return m_servers;<a name="line.171"></a>
 <span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private Map&lt;String,Integer&gt; m_frags;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    public boolean getFrags__IsNotDefault()<a name="line.174"></a>
+<span class="sourceLineNo">173</span>    private List&lt;ServerName&gt; m_servers;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    public boolean getServers__IsNotDefault()<a name="line.174"></a>
 <span class="sourceLineNo">175</span>    {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      return m_frags__IsNotDefault;<a name="line.176"></a>
+<span class="sourceLineNo">176</span>      return m_servers__IsNotDefault;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    private boolean m_frags__IsNotDefault;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    // 28, 1<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    public void setServerManager(ServerManager serverManager)<a name="line.180"></a>
+<span class="sourceLineNo">178</span>    private boolean m_servers__IsNotDefault;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    // 24, 1<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    public void setDeadServers(Set&lt;ServerName&gt; deadServers)<a name="line.180"></a>
 <span class="sourceLineNo">181</span>    {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      // 28, 1<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      m_serverManager = serverManager;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      m_serverManager__IsNotDefault = true;<a name="line.184"></a>
+<span class="sourceLineNo">182</span>      // 24, 1<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      m_deadServers = deadServers;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      m_deadServers__IsNotDefault = true;<a name="line.184"></a>
 <span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    public ServerManager getServerManager()<a name="line.186"></a>
+<span class="sourceLineNo">186</span>    public Set&lt;ServerName&gt; getDeadServers()<a name="line.186"></a>
 <span class="sourceLineNo">187</span>    {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      return m_serverManager;<a name="line.188"></a>
+<span class="sourceLineNo">188</span>      return m_deadServers;<a name="line.188"></a>
 <span class="sourceLineNo">189</span>    }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    private ServerManager m_serverManager;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    public boolean getServerManager__IsNotDefault()<a name="line.191"></a>
+<span class="sourceLineNo">190</span>    private Set&lt;ServerName&gt; m_deadServers;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    public boolean getDeadServers__IsNotDefault()<a name="line.191"></a>
 <span class="sourceLineNo">192</span>    {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      return m_serverManager__IsNotDefault;<a name="line.193"></a>
+<span class="sourceLineNo">193</span>      return m_deadServers__IsNotDefault;<a name="line.193"></a>
 <span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    private boolean m_serverManager__IsNotDefault;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    // 24, 1<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    public void setDeadServers(Set&lt;ServerName&gt; deadServers)<a name="line.197"></a>
+<span class="sourceLineNo">195</span>    private boolean m_deadServers__IsNotDefault;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    // 28, 1<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void setServerManager(ServerManager serverManager)<a name="line.197"></a>
 <span class="sourceLineNo">198</span>    {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      // 24, 1<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      m_deadServers = deadServers;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      m_deadServers__IsNotDefault = true;<a name="line.201"></a>
+<span class="sourceLineNo">199</span>      // 28, 1<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      m_serverManager = serverManager;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      m_serverManager__IsNotDefault = true;<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    }<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    public Set&lt;ServerName&gt; getDeadServers()<a name="line.203"></a>
+<span class="sourceLineNo">203</span>    public ServerManager getServerManager()<a name="line.203"></a>
 <span class="sourceLineNo">204</span>    {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      return m_deadServers;<a name="line.205"></a>
+<span class="sourceLineNo">205</span>      return m_serverManager;<a name="line.205"></a>
 <span class="sourceLineNo">206</span>    }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private Set&lt;ServerName&gt; m_deadServers;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    public boolean getDeadServers__IsNotDefault()<a name="line.208"></a>
+<span class="sourceLineNo">207</span>    private ServerManager m_serverManager;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    public boolean getServerManager__IsNotDefault()<a name="line.208"></a>
 <span class="sourceLineNo">209</span>    {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      return m_deadServers__IsNotDefault;<a name="line.210"></a>
+<span class="sourceLineNo">210</span>      return m_serverManager__IsNotDefault;<a name="line.210"></a>
 <span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    private boolean m_deadServers__IsNotDefault;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    // 29, 1<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    public void setAssignmentManager(AssignmentManager assignmentManager)<a name="line.214"></a>
+<span class="sourceLineNo">212</span>    private boolean m_serverManager__IsNotDefault;<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    // 25, 1<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    public void setCatalogJanitorEnabled(boolean catalogJanitorEnabled)<a name="line.214"></a>
 <span class="sourceLineNo">215</span>    {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      // 29, 1<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      m_assignmentManager = assignmentManager;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      m_assignmentManager__IsNotDefault = true;<a name="line.218"></a>
+<span class="sourceLineNo">216</span>      // 25, 1<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      m_catalogJanitorEnabled = catalogJanitorEnabled;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      m_catalogJanitorEnabled__IsNotDefault = true;<a name="line.218"></a>
 <span class="sourceLineNo">219</span>    }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    public AssignmentManager getAssignmentManager()<a name="line.220"></a>
+<span class="sourceLineNo">220</span>    public boolean getCatalogJanitorEnabled()<a name="line.220"></a>
 <span class="sourceLineNo">221</span>    {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      return m_assignmentManager;<a name="line.222"></a>
+<span class="sourceLineNo">222</span>      return m_catalogJanitorEnabled;<a name="line.222"></a>
 <span class="sourceLineNo">223</span>    }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    private AssignmentManager m_assignmentManager;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    public boolean getAssignmentManager__IsNotDefault()<a name="line.225"></a>
+<span class="sourceLineNo">224</span>    private boolean m_catalogJanitorEnabled;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public boolean getCatalogJanitorEnabled__IsNotDefault()<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return m_assignmentManager__IsNotDefault;<a name="line.227"></a>
+<span class="sourceLineNo">227</span>      return m_catalogJanitorEnabled__IsNotDefault;<a name="line.227"></a>
 <span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    private boolean m_assignmentManager__IsNotDefault;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    // 27, 1<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    public void setFormat(String format)<a name="line.231"></a>
+<span class="sourceLineNo">229</span>    private boolean m_catalogJanitorEnabled__IsNotDefault;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    // 21, 1<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    public void setFrags(Map&lt;String,Integer&gt; frags)<a name="line.231"></a>
 <span class="sourceLineNo">232</span>    {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      // 27, 1<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      m_format = format;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      m_format__IsNotDefault = true;<a name="line.235"></a>
+<span class="sourceLineNo">233</span>      // 21, 1<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      m_frags = frags;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      m_frags__IsNotDefault = true;<a name="line.235"></a>
 <span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    public String getFormat()<a name="line.237"></a>
+<span class="sourceLineNo">237</span>    public Map&lt;String,Integer&gt; getFrags()<a name="line.237"></a>
 <span class="sourceLineNo">238</span>    {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return m_format;<a name="line.239"></a>
+<span class="sourceLineNo">239</span>      return m_frags;<a name="line.239"></a>
 <span class="sourceLineNo">240</span>    }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    private String m_format;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    public boolean getFormat__IsNotDefault()<a name="line.242"></a>
+<span class="sourceLineNo">241</span>    private Map&lt;String,Integer&gt; m_frags;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    public boolean getFrags__IsNotDefault()<a name="line.242"></a>
 <span class="sourceLineNo">243</span>    {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      return m_format__IsNotDefault;<a name="line.244"></a>
+<span class="sourceLineNo">244</span>      return m_frags__IsNotDefault;<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    private boolean m_format__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_frags__IsNotDefault;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // 22, 1<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    public void setMetaLocation(ServerName metaLocation)<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>      // 22, 1<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      m_metaLocation = metaLocation;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      m_metaLocation__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 ServerName getMetaLocation()<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_metaLocation;<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 ServerName m_metaLocation;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    public boolean getMetaLocation__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_metaLocation__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_metaLocation__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 String filter;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFilter(String p_filter)<a name="line.276"></a>
+<span class="sourceLineNo">275</span>  protected String format;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFormat(String p_format)<a name="line.276"></a>
 <span class="sourceLineNo">277</span>  {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    (getImplData()).setFilter(p_filter);<a name="line.278"></a>
+<span class="sourceLineNo">278</span>    (getImplData()).setFormat(p_format);<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 boolean catalogJanitorEnabled;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setCatalogJanitorEnabled(boolean p_catalogJanitorEnabled)<a name="line.283"></a>
+<span class="sourceLineNo">282</span>  protected AssignmentManager assignmentManager;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setAssignmentManager(AssignmentManager p_assignmentManager)<a name="line.283"></a>
 <span class="sourceLineNo">284</span>  {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    (getImplData()).setCatalogJanitorEnabled(p_catalogJanitorEnabled);<a name="line.285"></a>
+<span class="sourceLineNo">285</span>    (getImplData()).setAssignmentManager(p_assignmentManager);<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 String filter;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFilter(String p_filter)<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()).setFilter(p_filter);<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 Map&lt;String,Integer&gt; frags;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFrags(Map&lt;String,Integer&gt; p_frags)<a name="line.297"></a>
+<span class="sourceLineNo">296</span>  protected List&lt;ServerName&gt; servers;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServers(List&lt;ServerName&gt; p_servers)<a name="line.297"></a>
 <span class="sourceLineNo">298</span>  {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    (getImplData()).setFrags(p_frags);<a name="line.299"></a>
+<span class="sourceLineNo">299</span>    (getImplData()).setServers(p_servers);<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 ServerManager serverManager;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServerManager(ServerManager p_serverManager)<a name="line.304"></a>
+<span class="sourceLineNo">303</span>  protected Set&lt;ServerName&gt; deadServers;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setDeadServers(Set&lt;ServerName&gt; p_deadServers)<a name="line.304"></a>
 <span class="sourceLineNo">305</span>  {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    (getImplData()).setServerManager(p_serverManager);<a name="line.306"></a>
+<span class="sourceLineNo">306</span>    (getImplData()).setDeadServers(p_deadServers);<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 Set&lt;ServerName&gt; deadServers;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setDeadServers(Set&lt;ServerName&gt; p_deadServers)<a name="line.311"></a>
+<span class="sourceLineNo">310</span>  protected ServerManager serverManager;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServerManager(ServerManager p_serverManager)<a name="line.311"></a>
 <span class="sourceLineNo">312</span>  {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    (getImplData()).setDeadServers(p_deadServers);<a name="line.313"></a>
+<span class="sourceLineNo">313</span>    (getImplData()).setServerManager(p_serverManager);<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 AssignmentManager assignmentManager;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setAssignmentManager(AssignmentManager p_assignmentManager)<a name="line.318"></a>
+<span class="sourceLineNo">317</span>  protected boolean catalogJanitorEnabled;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setCatalogJanitorEnabled(boolean p_catalogJanitorEnabled)<a name="line.318"></a>
 <span class="sourceLineNo">319</span>  {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    (getImplData()).setAssignmentManager(p_assignmentManager);<a name="line.320"></a>
+<span class="sourceLineNo">320</span>    (getImplData()).setCatalogJanitorEnabled(p_catalogJanitorEnabled);<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 String format;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFormat(String p_format)<a name="line.325"></a>
+<span class="sourceLineNo">324</span>  protected Map&lt;String,Integer&gt; frags;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFrags(Map&lt;String,Integer&gt; p_frags)<a name="line.325"></a>
 <span class="sourceLineNo">326</span>  {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    (getImplData()).setFormat(p_format);<a name="line.327"></a>
+<span class="sourceLineNo">327</span>    (getImplData()).setFrags(p_frags);<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 ServerName metaLocation;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setMetaLocation(ServerName p_metaLocation)<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()).setMetaLocation(p_metaLocation);<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>


[19/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html
index 3529a44..4556e83 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html
@@ -141,7 +141,7 @@
 <span class="sourceLineNo">133</span>  protected List&lt;KeyValueScanner&gt; currentScanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.133"></a>
 <span class="sourceLineNo">134</span>  // flush update lock<a name="line.134"></a>
 <span class="sourceLineNo">135</span>  private ReentrantLock flushLock = new ReentrantLock();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  <a name="line.136"></a>
+<span class="sourceLineNo">136</span><a name="line.136"></a>
 <span class="sourceLineNo">137</span>  protected final long readPt;<a name="line.137"></a>
 <span class="sourceLineNo">138</span><a name="line.138"></a>
 <span class="sourceLineNo">139</span>  // used by the injection framework to test race between StoreScanner construction and compaction<a name="line.139"></a>
@@ -608,317 +608,378 @@
 <span class="sourceLineNo">600</span>        continue;<a name="line.600"></a>
 <span class="sourceLineNo">601</span><a name="line.601"></a>
 <span class="sourceLineNo">602</span>      case DONE:<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        matcher.curCell = null;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>      case DONE_SCAN:<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        close(false);// Do all cleanup except heap.close()<a name="line.607"></a>
-<span class="sourceLineNo">608</span>        return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>      case SEEK_NEXT_ROW:<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        // This is just a relatively simple end of scan fix, to short-cut end<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        // us if there is an endKey in the scan.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>        if (!matcher.moreRowsMayExistAfter(cell)) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>          close(false);// Do all cleanup except heap.close()<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>        matcher.curCell = null;<a name="line.617"></a>
-<span class="sourceLineNo">618</span>        seekToNextRow(cell);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>        break;<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>      case SEEK_NEXT_COL:<a name="line.621"></a>
-<span class="sourceLineNo">622</span>        seekAsDirection(matcher.getKeyForNextColumn(cell));<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        break;<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>      case SKIP:<a name="line.625"></a>
-<span class="sourceLineNo">626</span>        this.heap.next();<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        break;<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>      case SEEK_NEXT_USING_HINT:<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Cell nextKV = matcher.getNextKeyHint(cell);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (nextKV != null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          seekAsDirection(nextKV);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          heap.next();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        break;<a name="line.636"></a>
-<span class="sourceLineNo">637</span><a name="line.637"></a>
-<span class="sourceLineNo">638</span>      default:<a name="line.638"></a>
-<span class="sourceLineNo">639</span>        throw new RuntimeException("UNEXPECTED");<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      }<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    } while ((cell = this.heap.peek()) != null);<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    if (count &gt; 0) {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<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>    // No more keys<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    close(false);// Do all cleanup except heap.close()<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  /*<a name="line.652"></a>
-<span class="sourceLineNo">653</span>   * See if we should actually SEEK or rather just SKIP to the next Cell.<a name="line.653"></a>
-<span class="sourceLineNo">654</span>   * (see HBASE-13109)<a name="line.654"></a>
-<span class="sourceLineNo">655</span>   */<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private ScanQueryMatcher.MatchCode optimize(ScanQueryMatcher.MatchCode qcode, Cell cell) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    switch(qcode) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    case INCLUDE_AND_SEEK_NEXT_COL:<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    case SEEK_NEXT_COL:<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    {<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      Cell nextIndexedKey = getNextIndexedKey();<a name="line.661"></a>
-<span class="sourceLineNo">662</span>      if (nextIndexedKey != null &amp;&amp; nextIndexedKey != KeyValueScanner.NO_NEXT_INDEXED_KEY<a name="line.662"></a>
-<span class="sourceLineNo">663</span>          &amp;&amp; matcher.compareKeyForNextColumn(nextIndexedKey, cell) &gt;= 0) {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        return qcode == MatchCode.SEEK_NEXT_COL ? MatchCode.SKIP : MatchCode.INCLUDE;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      break;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    case INCLUDE_AND_SEEK_NEXT_ROW:<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    case SEEK_NEXT_ROW:<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      Cell nextIndexedKey = getNextIndexedKey();<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      if (nextIndexedKey != null &amp;&amp; nextIndexedKey != KeyValueScanner.NO_NEXT_INDEXED_KEY<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          &amp;&amp; matcher.compareKeyForNextRow(nextIndexedKey, cell) &gt;= 0) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>        return qcode == MatchCode.SEEK_NEXT_ROW ? MatchCode.SKIP : MatchCode.INCLUDE;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      }<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      break;<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    }<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    default:<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      break;<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    }<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    return qcode;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  }<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>  // Implementation of ChangedReadersObserver<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  @Override<a name="line.685"></a>
-<span class="sourceLineNo">686</span>  public void updateReaders(List&lt;StoreFile&gt; sfs) throws IOException {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    flushed = true;<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    flushLock.lock();<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    try {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      flushedStoreFiles.addAll(sfs);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>    } finally {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      flushLock.unlock();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    }<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    // Let the next() call handle re-creating and seeking<a name="line.694"></a>
-<span class="sourceLineNo">695</span>  }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>  /**<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * @param flushed indicates if there was a flush<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @return true if top of heap has changed (and KeyValueHeap has to try the<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   *         next KV)<a name="line.700"></a>
-<span class="sourceLineNo">701</span>   * @throws IOException<a name="line.701"></a>
-<span class="sourceLineNo">702</span>   */<a name="line.702"></a>
-<span class="sourceLineNo">703</span>  protected boolean checkReseek(boolean flushed) throws IOException {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    if (flushed &amp;&amp; this.lastTop != null) {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      resetScannerStack(this.lastTop);<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      if (this.heap.peek() == null<a name="line.706"></a>
-<span class="sourceLineNo">707</span>          || store.getComparator().compareRows(this.lastTop, this.heap.peek()) != 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        LOG.debug("Storescanner.peek() is changed where before = "<a name="line.708"></a>
-<span class="sourceLineNo">709</span>            + this.lastTop.toString() + ",and after = " + this.heap.peek());<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        this.lastTop = null;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>        return true;<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      }<a name="line.712"></a>
-<span class="sourceLineNo">713</span>      this.lastTop = null; // gone!<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    // else dont need to reseek<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    return false;<a name="line.716"></a>
-<span class="sourceLineNo">717</span>  }<a name="line.717"></a>
-<span class="sourceLineNo">718</span><a name="line.718"></a>
-<span class="sourceLineNo">719</span>  protected void resetScannerStack(Cell lastTopKey) throws IOException {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    /* When we have the scan object, should we not pass it to getScanners()<a name="line.720"></a>
-<span class="sourceLineNo">721</span>     * to get a limited set of scanners? We did so in the constructor and we<a name="line.721"></a>
-<span class="sourceLineNo">722</span>     * could have done it now by storing the scan object from the constructor<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>    final boolean isCompaction = false;<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    boolean usePread = get || scanUsePread;<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    List&lt;KeyValueScanner&gt; scanners = null;<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    try {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      flushLock.lock();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      scanners = selectScannersFrom(store.getScanners(flushedStoreFiles, cacheBlocks, get, usePread,<a name="line.730"></a>
-<span class="sourceLineNo">731</span>        isCompaction, matcher, scan.getStartRow(), scan.getStopRow(), this.readPt, true));<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      // Clear the current set of flushed store files so that they don't get added again<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      flushedStoreFiles.clear();<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    } finally {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      flushLock.unlock();<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>    // Seek the new scanners to the last key<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    seekScanners(scanners, lastTopKey, false, parallelSeekEnabled);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    // remove the older memstore scanner<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    for (int i = 0; i &lt; currentScanners.size(); i++) {<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      if (!currentScanners.get(i).isFileScanner()) {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>        currentScanners.remove(i);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        break;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      }<a name="line.745"></a>
-<span class="sourceLineNo">746</span>    }<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    // add the newly created scanners on the flushed files and the current active memstore scanner<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    addCurrentScanners(scanners);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>    // Combine all seeked scanners with a heap<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    resetKVHeap(this.currentScanners, store.getComparator());<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    // Reset the state of the Query Matcher and set to top row.<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    // Only reset and call setRow if the row changes; avoids confusing the<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    // query matcher if scanning intra-row.<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    Cell cell = heap.peek();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    if (cell == null) {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      cell = lastTopKey;<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    }<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    if ((matcher.curCell == null) || !CellUtil.matchingRows(cell, matcher.curCell)) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>      this.countPerRow = 0;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>      // The setToNewRow will call reset internally<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      matcher.setToNewRow(cell);<a name="line.761"></a>
-<span class="sourceLineNo">762</span>    }<a name="line.762"></a>
-<span class="sourceLineNo">763</span>  }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>  /**<a name="line.765"></a>
-<span class="sourceLineNo">766</span>   * Check whether scan as expected order<a name="line.766"></a>
-<span class="sourceLineNo">767</span>   * @param prevKV<a name="line.767"></a>
-<span class="sourceLineNo">768</span>   * @param kv<a name="line.768"></a>
-<span class="sourceLineNo">769</span>   * @param comparator<a name="line.769"></a>
-<span class="sourceLineNo">770</span>   * @throws IOException<a name="line.770"></a>
-<span class="sourceLineNo">771</span>   */<a name="line.771"></a>
-<span class="sourceLineNo">772</span>  protected void checkScanOrder(Cell prevKV, Cell kv,<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      CellComparator comparator) throws IOException {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    // Check that the heap gives us KVs in an increasing order.<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    assert prevKV == null || comparator == null<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        || comparator.compare(prevKV, kv) &lt;= 0 : "Key " + prevKV<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        + " followed by a " + "smaller key " + kv + " in cf " + store;<a name="line.777"></a>
+<span class="sourceLineNo">603</span>        // Optimization for Gets! If DONE, no more to get on this row, early exit!<a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (this.scan.isGetScan()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          // Then no more to this row... exit.<a name="line.605"></a>
+<span class="sourceLineNo">606</span>          close(false);// Do all cleanup except heap.close()<a name="line.606"></a>
+<span class="sourceLineNo">607</span>          return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        matcher.curCell = null;<a name="line.609"></a>
+<span class="sourceLineNo">610</span>        return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.610"></a>
+<span class="sourceLineNo">611</span><a name="line.611"></a>
+<span class="sourceLineNo">612</span>      case DONE_SCAN:<a name="line.612"></a>
+<span class="sourceLineNo">613</span>        close(false);// Do all cleanup except heap.close()<a name="line.613"></a>
+<span class="sourceLineNo">614</span>        return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.614"></a>
+<span class="sourceLineNo">615</span><a name="line.615"></a>
+<span class="sourceLineNo">616</span>      case SEEK_NEXT_ROW:<a name="line.616"></a>
+<span class="sourceLineNo">617</span>        // This is just a relatively simple end of scan fix, to short-cut end<a name="line.617"></a>
+<span class="sourceLineNo">618</span>        // us if there is an endKey in the scan.<a name="line.618"></a>
+<span class="sourceLineNo">619</span>        if (!matcher.moreRowsMayExistAfter(cell)) {<a name="line.619"></a>
+<span class="sourceLineNo">620</span>          close(false);// Do all cleanup except heap.close()<a name="line.620"></a>
+<span class="sourceLineNo">621</span>          return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.621"></a>
+<span class="sourceLineNo">622</span>        }<a name="line.622"></a>
+<span class="sourceLineNo">623</span>        matcher.curCell = null;<a name="line.623"></a>
+<span class="sourceLineNo">624</span>        seekToNextRow(cell);<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>      case SEEK_NEXT_COL:<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        seekAsDirection(matcher.getKeyForNextColumn(cell));<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        break;<a name="line.629"></a>
+<span class="sourceLineNo">630</span><a name="line.630"></a>
+<span class="sourceLineNo">631</span>      case SKIP:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        this.heap.next();<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        break;<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>      case SEEK_NEXT_USING_HINT:<a name="line.635"></a>
+<span class="sourceLineNo">636</span>        Cell nextKV = matcher.getNextKeyHint(cell);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>        if (nextKV != null) {<a name="line.637"></a>
+<span class="sourceLineNo">638</span>          seekAsDirection(nextKV);<a name="line.638"></a>
+<span class="sourceLineNo">639</span>        } else {<a name="line.639"></a>
+<span class="sourceLineNo">640</span>          heap.next();<a name="line.640"></a>
+<span class="sourceLineNo">641</span>        }<a name="line.641"></a>
+<span class="sourceLineNo">642</span>        break;<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>      default:<a name="line.644"></a>
+<span class="sourceLineNo">645</span>        throw new RuntimeException("UNEXPECTED");<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    } while ((cell = this.heap.peek()) != null);<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    if (count &gt; 0) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>      return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    }<a name="line.651"></a>
+<span class="sourceLineNo">652</span><a name="line.652"></a>
+<span class="sourceLineNo">653</span>    // No more keys<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    close(false);// Do all cleanup except heap.close()<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
+<span class="sourceLineNo">659</span>   * See if we should actually SEEK or rather just SKIP to the next Cell (see HBASE-13109).<a name="line.659"></a>
+<span class="sourceLineNo">660</span>   * This method works together with ColumnTrackers and Filters. ColumnTrackers may issue SEEK<a name="line.660"></a>
+<span class="sourceLineNo">661</span>   * hints, such as seek to next column, next row, or seek to an arbitrary seek key.<a name="line.661"></a>
+<span class="sourceLineNo">662</span>   * This method intercepts these qcodes and decides whether a seek is the most efficient _actual_<a name="line.662"></a>
+<span class="sourceLineNo">663</span>   * way to get us to the requested cell (SEEKs are more expensive than SKIP, SKIP, SKIP inside the<a name="line.663"></a>
+<span class="sourceLineNo">664</span>   * current, loaded block).<a name="line.664"></a>
+<span class="sourceLineNo">665</span>   * It does this by looking at the next indexed key of the current HFile. This key<a name="line.665"></a>
+<span class="sourceLineNo">666</span>   * is then compared with the _SEEK_ key, where a SEEK key is an artificial 'last possible key<a name="line.666"></a>
+<span class="sourceLineNo">667</span>   * on the row' (only in here, we avoid actually creating a SEEK key; in the compare we work with<a name="line.667"></a>
+<span class="sourceLineNo">668</span>   * the current Cell but compare as though it were a seek key; see down in<a name="line.668"></a>
+<span class="sourceLineNo">669</span>   * matcher.compareKeyForNextRow, etc). If the compare gets us onto the<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * next block we *_SEEK, otherwise we just INCLUDE or SKIP, and let the ColumnTrackers or Filters<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * go through the next Cell, and so on)<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * &lt;p&gt;The ColumnTrackers and Filters must behave correctly in all cases, i.e. if they are past the<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * Cells they care about they must issues a SKIP or SEEK.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   * &lt;p&gt;Other notes:<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   * &lt;ul&gt;<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   * &lt;li&gt;Rows can straddle block boundaries&lt;/li&gt;<a name="line.678"></a>
+<span class="sourceLineNo">679</span>   * &lt;li&gt;Versions of columns can straddle block boundaries (i.e. column C1 at T1 might be in a<a name="line.679"></a>
+<span class="sourceLineNo">680</span>   * different block than column C1 at T2)&lt;/li&gt;<a name="line.680"></a>
+<span class="sourceLineNo">681</span>   * &lt;li&gt;We want to SKIP and INCLUDE if the chance is high that we'll find the desired Cell after a<a name="line.681"></a>
+<span class="sourceLineNo">682</span>   * few SKIPs...&lt;/li&gt;<a name="line.682"></a>
+<span class="sourceLineNo">683</span>   * &lt;li&gt;We want to INCLUDE_AND_SEEK and SEEK when the chance is high that we'll be able to seek<a name="line.683"></a>
+<span class="sourceLineNo">684</span>   * past many Cells, especially if we know we need to go to the next block.&lt;/li&gt;<a name="line.684"></a>
+<span class="sourceLineNo">685</span>   * &lt;/ul&gt;<a name="line.685"></a>
+<span class="sourceLineNo">686</span>   * &lt;p&gt;A good proxy (best effort) to determine whether INCLUDE/SKIP is better than SEEK is whether<a name="line.686"></a>
+<span class="sourceLineNo">687</span>   * we'll likely end up seeking to the next block (or past the next block) to get our next column.<a name="line.687"></a>
+<span class="sourceLineNo">688</span>   * Example:<a name="line.688"></a>
+<span class="sourceLineNo">689</span>   * &lt;pre&gt;<a name="line.689"></a>
+<span class="sourceLineNo">690</span>   * |    BLOCK 1              |     BLOCK 2                   |<a name="line.690"></a>
+<span class="sourceLineNo">691</span>   * |  r1/c1, r1/c2, r1/c3    |    r1/c4, r1/c5, r2/c1        |<a name="line.691"></a>
+<span class="sourceLineNo">692</span>   *                                   ^         ^<a name="line.692"></a>
+<span class="sourceLineNo">693</span>   *                                   |         |<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   *                           Next Index Key   SEEK_NEXT_ROW (before r2/c1)<a name="line.694"></a>
+<span class="sourceLineNo">695</span>   *<a name="line.695"></a>
+<span class="sourceLineNo">696</span>   *<a name="line.696"></a>
+<span class="sourceLineNo">697</span>   * |    BLOCK 1                       |     BLOCK 2                      |<a name="line.697"></a>
+<span class="sourceLineNo">698</span>   * |  r1/c1/t5, r1/c1/t4, r1/c1/t3    |    r1/c1/t2, r1/c1/T1, r1/c2/T3  |<a name="line.698"></a>
+<span class="sourceLineNo">699</span>   *                                            ^              ^<a name="line.699"></a>
+<span class="sourceLineNo">700</span>   *                                            |              |<a name="line.700"></a>
+<span class="sourceLineNo">701</span>   *                                    Next Index Key        SEEK_NEXT_COL<a name="line.701"></a>
+<span class="sourceLineNo">702</span>   * &lt;/pre&gt;<a name="line.702"></a>
+<span class="sourceLineNo">703</span>   * Now imagine we want columns c1 and c3 (see first diagram above), the 'Next Index Key' of r1/c4<a name="line.703"></a>
+<span class="sourceLineNo">704</span>   * is &gt; r1/c3 so we should seek to get to the c1 on the next row, r2. In second case, say we only<a name="line.704"></a>
+<span class="sourceLineNo">705</span>   * want one version of c1, after we have it, a SEEK_COL will be issued to get to c2. Looking at<a name="line.705"></a>
+<span class="sourceLineNo">706</span>   * the 'Next Index Key', it would land us in the next block, so we should SEEK. In other scenarios<a name="line.706"></a>
+<span class="sourceLineNo">707</span>   * where the SEEK will not land us in the next block, it is very likely better to issues a series<a name="line.707"></a>
+<span class="sourceLineNo">708</span>   * of SKIPs.<a name="line.708"></a>
+<span class="sourceLineNo">709</span>   */<a name="line.709"></a>
+<span class="sourceLineNo">710</span>  @VisibleForTesting<a name="line.710"></a>
+<span class="sourceLineNo">711</span>  protected ScanQueryMatcher.MatchCode optimize(ScanQueryMatcher.MatchCode qcode, Cell cell) {<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    switch(qcode) {<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    case INCLUDE_AND_SEEK_NEXT_COL:<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    case SEEK_NEXT_COL:<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      Cell nextIndexedKey = getNextIndexedKey();<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      if (nextIndexedKey != null &amp;&amp; nextIndexedKey != KeyValueScanner.NO_NEXT_INDEXED_KEY<a name="line.717"></a>
+<span class="sourceLineNo">718</span>          &amp;&amp; matcher.compareKeyForNextColumn(nextIndexedKey, cell) &gt;= 0) {<a name="line.718"></a>
+<span class="sourceLineNo">719</span>        return qcode == MatchCode.SEEK_NEXT_COL ? MatchCode.SKIP : MatchCode.INCLUDE;<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      }<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      break;<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    }<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    case INCLUDE_AND_SEEK_NEXT_ROW:<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    case SEEK_NEXT_ROW:<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      // If it is a Get Scan, then we know that we are done with this row; there are no more<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      // rows beyond the current one: don't try to optimize. We are DONE. Return the *_NEXT_ROW<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      // qcode as is. When the caller gets these flags on a Get Scan, it knows it can shut down the<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      // Scan.<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      if (!this.scan.isGetScan()) {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        Cell nextIndexedKey = getNextIndexedKey();<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        if (nextIndexedKey != null &amp;&amp; nextIndexedKey != KeyValueScanner.NO_NEXT_INDEXED_KEY<a name="line.732"></a>
+<span class="sourceLineNo">733</span>            &amp;&amp; matcher.compareKeyForNextRow(nextIndexedKey, cell) &gt; 0) {<a name="line.733"></a>
+<span class="sourceLineNo">734</span>          return qcode == MatchCode.SEEK_NEXT_ROW ? MatchCode.SKIP : MatchCode.INCLUDE;<a name="line.734"></a>
+<span class="sourceLineNo">735</span>        }<a name="line.735"></a>
+<span class="sourceLineNo">736</span>      }<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      break;<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    default:<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      break;<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
+<span class="sourceLineNo">742</span>    return qcode;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>  }<a name="line.743"></a>
+<span class="sourceLineNo">744</span><a name="line.744"></a>
+<span class="sourceLineNo">745</span>  // Implementation of ChangedReadersObserver<a name="line.745"></a>
+<span class="sourceLineNo">746</span>  @Override<a name="line.746"></a>
+<span class="sourceLineNo">747</span>  public void updateReaders(List&lt;StoreFile&gt; sfs) throws IOException {<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    flushed = true;<a name="line.748"></a>
+<span class="sourceLineNo">749</span>    flushLock.lock();<a name="line.749"></a>
+<span class="sourceLineNo">750</span>    try {<a name="line.750"></a>
+<span class="sourceLineNo">751</span>      flushedStoreFiles.addAll(sfs);<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    } finally {<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      flushLock.unlock();<a name="line.753"></a>
+<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
+<span class="sourceLineNo">755</span>    // Let the next() call handle re-creating and seeking<a name="line.755"></a>
+<span class="sourceLineNo">756</span>  }<a name="line.756"></a>
+<span class="sourceLineNo">757</span><a name="line.757"></a>
+<span class="sourceLineNo">758</span>  /**<a name="line.758"></a>
+<span class="sourceLineNo">759</span>   * @param flushed indicates if there was a flush<a name="line.759"></a>
+<span class="sourceLineNo">760</span>   * @return true if top of heap has changed (and KeyValueHeap has to try the<a name="line.760"></a>
+<span class="sourceLineNo">761</span>   *         next KV)<a name="line.761"></a>
+<span class="sourceLineNo">762</span>   * @throws IOException<a name="line.762"></a>
+<span class="sourceLineNo">763</span>   */<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  protected boolean checkReseek(boolean flushed) throws IOException {<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    if (flushed &amp;&amp; this.lastTop != null) {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      resetScannerStack(this.lastTop);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      if (this.heap.peek() == null<a name="line.767"></a>
+<span class="sourceLineNo">768</span>          || store.getComparator().compareRows(this.lastTop, this.heap.peek()) != 0) {<a name="line.768"></a>
+<span class="sourceLineNo">769</span>        LOG.debug("Storescanner.peek() is changed where before = "<a name="line.769"></a>
+<span class="sourceLineNo">770</span>            + this.lastTop.toString() + ",and after = " + this.heap.peek());<a name="line.770"></a>
+<span class="sourceLineNo">771</span>        this.lastTop = null;<a name="line.771"></a>
+<span class="sourceLineNo">772</span>        return true;<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      }<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      this.lastTop = null; // gone!<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    }<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    // else dont need to reseek<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    return false;<a name="line.777"></a>
 <span class="sourceLineNo">778</span>  }<a name="line.778"></a>
 <span class="sourceLineNo">779</span><a name="line.779"></a>
-<span class="sourceLineNo">780</span>  protected boolean seekToNextRow(Cell c) throws IOException {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    return reseek(CellUtil.createLastOnRow(c));<a name="line.781"></a>
-<span class="sourceLineNo">782</span>  }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>  /**<a name="line.784"></a>
-<span class="sourceLineNo">785</span>   * Do a reseek in a normal StoreScanner(scan forward)<a name="line.785"></a>
-<span class="sourceLineNo">786</span>   * @param kv<a name="line.786"></a>
-<span class="sourceLineNo">787</span>   * @return true if scanner has values left, false if end of scanner<a name="line.787"></a>
-<span class="sourceLineNo">788</span>   * @throws IOException<a name="line.788"></a>
-<span class="sourceLineNo">789</span>   */<a name="line.789"></a>
-<span class="sourceLineNo">790</span>  protected boolean seekAsDirection(Cell kv)<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      throws IOException {<a name="line.791"></a>
-<span class="sourceLineNo">792</span>    return reseek(kv);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>  }<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>  @Override<a name="line.795"></a>
-<span class="sourceLineNo">796</span>  public boolean reseek(Cell kv) throws IOException {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    boolean flushed = checkFlushed();<a name="line.797"></a>
-<span class="sourceLineNo">798</span>    // Heap will not be null, if this is called from next() which.<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    // If called from RegionScanner.reseek(...) make sure the scanner<a name="line.799"></a>
-<span class="sourceLineNo">800</span>    // stack is reset if needed.<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    checkReseek(flushed);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    if (explicitColumnQuery &amp;&amp; lazySeekEnabledGlobally) {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      return heap.requestSeek(kv, true, useRowColBloom);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    return heap.reseek(kv);<a name="line.805"></a>
-<span class="sourceLineNo">806</span>  }<a name="line.806"></a>
-<span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>  protected boolean checkFlushed() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    // check the var without any lock. Suppose even if we see the old<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    // value here still it is ok to continue because we will not be resetting<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    // the heap but will continue with the referenced memstore's snapshot. For compactions<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    // any way we don't need the updateReaders at all to happen as we still continue with <a name="line.812"></a>
-<span class="sourceLineNo">813</span>    // the older files<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    if (flushed) {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      // If there is a flush and the current scan is notified on the flush ensure that the <a name="line.815"></a>
-<span class="sourceLineNo">816</span>      // scan's heap gets reset and we do a seek on the newly flushed file.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      if(!this.closing) {<a name="line.817"></a>
-<span class="sourceLineNo">818</span>        this.lastTop = this.peek();<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      } else {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        return false;<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      }<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // reset the flag<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      flushed = false;<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      return true;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    }<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return false;<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>  @Override<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  public long getSequenceID() {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    return 0;<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>  /**<a name="line.834"></a>
-<span class="sourceLineNo">835</span>   * Seek storefiles in parallel to optimize IO latency as much as possible<a name="line.835"></a>
-<span class="sourceLineNo">836</span>   * @param scanners the list {@link KeyValueScanner}s to be read from<a name="line.836"></a>
-<span class="sourceLineNo">837</span>   * @param kv the KeyValue on which the operation is being requested<a name="line.837"></a>
-<span class="sourceLineNo">838</span>   * @throws IOException<a name="line.838"></a>
-<span class="sourceLineNo">839</span>   */<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  private void parallelSeek(final List&lt;? extends KeyValueScanner&gt;<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      scanners, final Cell kv) throws IOException {<a name="line.841"></a>
-<span class="sourceLineNo">842</span>    if (scanners.isEmpty()) return;<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    int storeFileScannerCount = scanners.size();<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    CountDownLatch latch = new CountDownLatch(storeFileScannerCount);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    List&lt;ParallelSeekHandler&gt; handlers = <a name="line.845"></a>
-<span class="sourceLineNo">846</span>        new ArrayList&lt;ParallelSeekHandler&gt;(storeFileScannerCount);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    for (KeyValueScanner scanner : scanners) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      if (scanner instanceof StoreFileScanner) {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        ParallelSeekHandler seekHandler = new ParallelSeekHandler(scanner, kv,<a name="line.849"></a>
-<span class="sourceLineNo">850</span>          this.readPt, latch);<a name="line.850"></a>
-<span class="sourceLineNo">851</span>        executor.submit(seekHandler);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        handlers.add(seekHandler);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      } else {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        scanner.seek(kv);<a name="line.854"></a>
-<span class="sourceLineNo">855</span>        latch.countDown();<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    }<a name="line.857"></a>
-<span class="sourceLineNo">858</span><a name="line.858"></a>
-<span class="sourceLineNo">859</span>    try {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      latch.await();<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    } catch (InterruptedException ie) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      throw (InterruptedIOException)new InterruptedIOException().initCause(ie);<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    for (ParallelSeekHandler handler : handlers) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      if (handler.getErr() != null) {<a name="line.866"></a>
-<span class="sourceLineNo">867</span>        throw new IOException(handler.getErr());<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>  }<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>  /**<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * Used in testing.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * @return all scanners in no particular order<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   */<a name="line.875"></a>
-<span class="sourceLineNo">876</span>  List&lt;KeyValueScanner&gt; getAllScannersForTesting() {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    List&lt;KeyValueScanner&gt; allScanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    KeyValueScanner current = heap.getCurrentForTesting();<a name="line.878"></a>
-<span class="sourceLineNo">879</span>    if (current != null)<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      allScanners.add(current);<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    for (KeyValueScanner scanner : heap.getHeap())<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      allScanners.add(scanner);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    return allScanners;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>  }<a name="line.884"></a>
-<span class="sourceLineNo">885</span><a name="line.885"></a>
-<span class="sourceLineNo">886</span>  static void enableLazySeekGlobally(boolean enable) {<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    lazySeekEnabledGlobally = enable;<a name="line.887"></a>
+<span class="sourceLineNo">780</span>  protected void resetScannerStack(Cell lastTopKey) throws IOException {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    /* When we have the scan object, should we not pass it to getScanners()<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * to get a limited set of scanners? We did so in the constructor and we<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * could have done it now by storing the scan object from the constructor<a name="line.783"></a>
+<span class="sourceLineNo">784</span>     */<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>    final boolean isCompaction = false;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    boolean usePread = get || scanUsePread;<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    List&lt;KeyValueScanner&gt; scanners = null;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    try {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      flushLock.lock();<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      scanners = selectScannersFrom(store.getScanners(flushedStoreFiles, cacheBlocks, get, usePread,<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        isCompaction, matcher, scan.getStartRow(), scan.getStopRow(), this.readPt, true));<a name="line.792"></a>
+<span class="sourceLineNo">793</span>      // Clear the current set of flushed store files so that they don't get added again<a name="line.793"></a>
+<span class="sourceLineNo">794</span>      flushedStoreFiles.clear();<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    } finally {<a name="line.795"></a>
+<span class="sourceLineNo">796</span>      flushLock.unlock();<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    }<a name="line.797"></a>
+<span class="sourceLineNo">798</span><a name="line.798"></a>
+<span class="sourceLineNo">799</span>    // Seek the new scanners to the last key<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    seekScanners(scanners, lastTopKey, false, parallelSeekEnabled);<a name="line.800"></a>
+<span class="sourceLineNo">801</span>    // remove the older memstore scanner<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    for (int i = 0; i &lt; currentScanners.size(); i++) {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      if (!currentScanners.get(i).isFileScanner()) {<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        currentScanners.remove(i);<a name="line.804"></a>
+<span class="sourceLineNo">805</span>        break;<a name="line.805"></a>
+<span class="sourceLineNo">806</span>      }<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    }<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    // add the newly created scanners on the flushed files and the current active memstore scanner<a name="line.808"></a>
+<span class="sourceLineNo">809</span>    addCurrentScanners(scanners);<a name="line.809"></a>
+<span class="sourceLineNo">810</span>    // Combine all seeked scanners with a heap<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    resetKVHeap(this.currentScanners, store.getComparator());<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    // Reset the state of the Query Matcher and set to top row.<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    // Only reset and call setRow if the row changes; avoids confusing the<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    // query matcher if scanning intra-row.<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    Cell cell = heap.peek();<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    if (cell == null) {<a name="line.816"></a>
+<span class="sourceLineNo">817</span>      cell = lastTopKey;<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    }<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    if ((matcher.curCell == null) || !CellUtil.matchingRows(cell, matcher.curCell)) {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>      this.countPerRow = 0;<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      // The setToNewRow will call reset internally<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      matcher.setToNewRow(cell);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>  }<a name="line.824"></a>
+<span class="sourceLineNo">825</span><a name="line.825"></a>
+<span class="sourceLineNo">826</span>  /**<a name="line.826"></a>
+<span class="sourceLineNo">827</span>   * Check whether scan as expected order<a name="line.827"></a>
+<span class="sourceLineNo">828</span>   * @param prevKV<a name="line.828"></a>
+<span class="sourceLineNo">829</span>   * @param kv<a name="line.829"></a>
+<span class="sourceLineNo">830</span>   * @param comparator<a name="line.830"></a>
+<span class="sourceLineNo">831</span>   * @throws IOException<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   */<a name="line.832"></a>
+<span class="sourceLineNo">833</span>  protected void checkScanOrder(Cell prevKV, Cell kv,<a name="line.833"></a>
+<span class="sourceLineNo">834</span>      CellComparator comparator) throws IOException {<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    // Check that the heap gives us KVs in an increasing order.<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    assert prevKV == null || comparator == null<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        || comparator.compare(prevKV, kv) &lt;= 0 : "Key " + prevKV<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        + " followed by a " + "smaller key " + kv + " in cf " + store;<a name="line.838"></a>
+<span class="sourceLineNo">839</span>  }<a name="line.839"></a>
+<span class="sourceLineNo">840</span><a name="line.840"></a>
+<span class="sourceLineNo">841</span>  protected boolean seekToNextRow(Cell c) throws IOException {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    return reseek(CellUtil.createLastOnRow(c));<a name="line.842"></a>
+<span class="sourceLineNo">843</span>  }<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>   * Do a reseek in a normal StoreScanner(scan forward)<a name="line.846"></a>
+<span class="sourceLineNo">847</span>   * @param kv<a name="line.847"></a>
+<span class="sourceLineNo">848</span>   * @return true if scanner has values left, false if end of scanner<a name="line.848"></a>
+<span class="sourceLineNo">849</span>   * @throws IOException<a name="line.849"></a>
+<span class="sourceLineNo">850</span>   */<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  protected boolean seekAsDirection(Cell kv)<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      throws IOException {<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    return reseek(kv);<a name="line.853"></a>
+<span class="sourceLineNo">854</span>  }<a name="line.854"></a>
+<span class="sourceLineNo">855</span><a name="line.855"></a>
+<span class="sourceLineNo">856</span>  @Override<a name="line.856"></a>
+<span class="sourceLineNo">857</span>  public boolean reseek(Cell kv) throws IOException {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    boolean flushed = checkFlushed();<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    // Heap will not be null, if this is called from next() which.<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    // If called from RegionScanner.reseek(...) make sure the scanner<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    // stack is reset if needed.<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    checkReseek(flushed);<a name="line.862"></a>
+<span class="sourceLineNo">863</span>    if (explicitColumnQuery &amp;&amp; lazySeekEnabledGlobally) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      return heap.requestSeek(kv, true, useRowColBloom);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    }<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    return heap.reseek(kv);<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>  protected boolean checkFlushed() {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    // check the var without any lock. Suppose even if we see the old<a name="line.870"></a>
+<span class="sourceLineNo">871</span>    // value here still it is ok to continue because we will not be resetting<a name="line.871"></a>
+<span class="sourceLineNo">872</span>    // the heap but will continue with the referenced memstore's snapshot. For compactions<a name="line.872"></a>
+<span class="sourceLineNo">873</span>    // any way we don't need the updateReaders at all to happen as we still continue with<a name="line.873"></a>
+<span class="sourceLineNo">874</span>    // the older files<a name="line.874"></a>
+<span class="sourceLineNo">875</span>    if (flushed) {<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      // If there is a flush and the current scan is notified on the flush ensure that the<a name="line.876"></a>
+<span class="sourceLineNo">877</span>      // scan's heap gets reset and we do a seek on the newly flushed file.<a name="line.877"></a>
+<span class="sourceLineNo">878</span>      if(!this.closing) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>        this.lastTop = this.peek();<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      } else {<a name="line.880"></a>
+<span class="sourceLineNo">881</span>        return false;<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      }<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      // reset the flag<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      flushed = false;<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      return true;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    }<a name="line.886"></a>
+<span class="sourceLineNo">887</span>    return false;<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>   * @return The estimated number of KVs seen by this scanner (includes some skipped KVs).<a name="line.891"></a>
-<span class="sourceLineNo">892</span>   */<a name="line.892"></a>
-<span class="sourceLineNo">893</span>  public long getEstimatedNumberOfKvsScanned() {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    return this.kvsScanned;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>  }<a name="line.895"></a>
-<span class="sourceLineNo">896</span><a name="line.896"></a>
-<span class="sourceLineNo">897</span>  @Override<a name="line.897"></a>
-<span class="sourceLineNo">898</span>  public Cell getNextIndexedKey() {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    return this.heap.getNextIndexedKey();<a name="line.899"></a>
-<span class="sourceLineNo">900</span>  }<a name="line.900"></a>
-<span class="sourceLineNo">901</span><a name="line.901"></a>
-<span class="sourceLineNo">902</span>  @Override<a name="line.902"></a>
-<span class="sourceLineNo">903</span>  public void shipped() throws IOException {<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    for (KeyValueHeap h : this.heapsForDelayedClose) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      h.close();// There wont be further fetch of Cells from these scanners. Just close.<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    this.heapsForDelayedClose.clear();<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    if (this.heap != null) {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.heap.shipped();<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span>  }<a name="line.911"></a>
-<span class="sourceLineNo">912</span>}<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
+<span class="sourceLineNo">890</span>  @Override<a name="line.890"></a>
+<span class="sourceLineNo">891</span>  public long getSequenceID() {<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    return 0;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>  }<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>  /**<a name="line.895"></a>
+<span class="sourceLineNo">896</span>   * Seek storefiles in parallel to optimize IO latency as much as possible<a name="line.896"></a>
+<span class="sourceLineNo">897</span>   * @param scanners the list {@link KeyValueScanner}s to be read from<a name="line.897"></a>
+<span class="sourceLineNo">898</span>   * @param kv the KeyValue on which the operation is being requested<a name="line.898"></a>
+<span class="sourceLineNo">899</span>   * @throws IOException<a name="line.899"></a>
+<span class="sourceLineNo">900</span>   */<a name="line.900"></a>
+<span class="sourceLineNo">901</span>  private void parallelSeek(final List&lt;? extends KeyValueScanner&gt;<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      scanners, final Cell kv) throws IOException {<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    if (scanners.isEmpty()) return;<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    int storeFileScannerCount = scanners.size();<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    CountDownLatch latch = new CountDownLatch(storeFileScannerCount);<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    List&lt;ParallelSeekHandler&gt; handlers =<a name="line.906"></a>
+<span class="sourceLineNo">907</span>        new ArrayList&lt;ParallelSeekHandler&gt;(storeFileScannerCount);<a name="line.907"></a>
+<span class="sourceLineNo">908</span>    for (KeyValueScanner scanner : scanners) {<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      if (scanner instanceof StoreFileScanner) {<a name="line.909"></a>
+<span class="sourceLineNo">910</span>        ParallelSeekHandler seekHandler = new ParallelSeekHandler(scanner, kv,<a name="line.910"></a>
+<span class="sourceLineNo">911</span>          this.readPt, latch);<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        executor.submit(seekHandler);<a name="line.912"></a>
+<span class="sourceLineNo">913</span>        handlers.add(seekHandler);<a name="line.913"></a>
+<span class="sourceLineNo">914</span>      } else {<a name="line.914"></a>
+<span class="sourceLineNo">915</span>        scanner.seek(kv);<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        latch.countDown();<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<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>    try {<a name="line.920"></a>
+<span class="sourceLineNo">921</span>      latch.await();<a name="line.921"></a>
+<span class="sourceLineNo">922</span>    } catch (InterruptedException ie) {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      throw (InterruptedIOException)new InterruptedIOException().initCause(ie);<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span><a name="line.925"></a>
+<span class="sourceLineNo">926</span>    for (ParallelSeekHandler handler : handlers) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      if (handler.getErr() != null) {<a name="line.927"></a>
+<span class="sourceLineNo">928</span>        throw new IOException(handler.getErr());<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
+<span class="sourceLineNo">930</span>    }<a name="line.930"></a>
+<span class="sourceLineNo">931</span>  }<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>  /**<a name="line.933"></a>
+<span class="sourceLineNo">934</span>   * Used in testing.<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * @return all scanners in no particular order<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   */<a name="line.936"></a>
+<span class="sourceLineNo">937</span>  List&lt;KeyValueScanner&gt; getAllScannersForTesting() {<a name="line.937"></a>
+<span class="sourceLineNo">938</span>    List&lt;KeyValueScanner&gt; allScanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    KeyValueScanner current = heap.getCurrentForTesting();<a name="line.939"></a>
+<span class="sourceLineNo">940</span>    if (current != null)<a name="line.940"></a>
+<span class="sourceLineNo">941</span>      allScanners.add(current);<a name="line.941"></a>
+<span class="sourceLineNo">942</span>    for (KeyValueScanner scanner : heap.getHeap())<a name="line.942"></a>
+<span class="sourceLineNo">943</span>      allScanners.add(scanner);<a name="line.943"></a>
+<span class="sourceLineNo">944</span>    return allScanners;<a name="line.944"></a>
+<span class="sourceLineNo">945</span>  }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>  static void enableLazySeekGlobally(boolean enable) {<a name="line.947"></a>
+<span class="sourceLineNo">948</span>    lazySeekEnabledGlobally = enable;<a name="line.948"></a>
+<span class="sourceLineNo">949</span>  }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>  /**<a name="line.951"></a>
+<span class="sourceLineNo">952</span>   * @return The estimated number of KVs seen by this scanner (includes some skipped KVs).<a name="line.952"></a>
+<span class="sourceLineNo">953</span>   */<a name="line.953"></a>
+<span class="sourceLineNo">954</span>  public long getEstimatedNumberOfKvsScanned() {<a name="line.954"></a>
+<span class="sourceLineNo">955</span>    return this.kvsScanned;<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>  @Override<a name="line.958"></a>
+<span class="sourceLineNo">959</span>  public Cell getNextIndexedKey() {<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    return this.heap.getNextIndexedKey();<a name="line.960"></a>
+<span class="sourceLineNo">961</span>  }<a name="line.961"></a>
+<span class="sourceLineNo">962</span><a name="line.962"></a>
+<span class="sourceLineNo">963</span>  @Override<a name="line.963"></a>
+<span class="sourceLineNo">964</span>  public void shipped() throws IOException {<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    for (KeyValueHeap h : this.heapsForDelayedClose) {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      h.close();// There wont be further fetch of Cells from these scanners. Just close.<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    }<a name="line.967"></a>
+<span class="sourceLineNo">968</span>    this.heapsForDelayedClose.clear();<a name="line.968"></a>
+<span class="sourceLineNo">969</span>    if (this.heap != null) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      this.heap.shipped();<a name="line.970"></a>
+<span class="sourceLineNo">971</span>    }<a name="line.971"></a>
+<span class="sourceLineNo">972</span>  }<a name="line.972"></a>
+<span class="sourceLineNo">973</span>}<a name="line.973"></a>
+<span class="sourceLineNo">974</span><a name="line.974"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Counter.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Counter.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Counter.html
index 14327de..0a8e897 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Counter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.Counter.html
@@ -1065,11 +1065,11 @@
 <span class="sourceLineNo">1057</span>    System.err.println("  -bandwidth              Limit bandwidth to this value in MB/second.");<a name="line.1057"></a>
 <span class="sourceLineNo">1058</span>    System.err.println();<a name="line.1058"></a>
 <span class="sourceLineNo">1059</span>    System.err.println("Examples:");<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    System.err.println("  hbase " + getClass().getName() + " \\");<a name="line.1060"></a>
+<span class="sourceLineNo">1060</span>    System.err.println("  hbase snapshot export \\");<a name="line.1060"></a>
 <span class="sourceLineNo">1061</span>    System.err.println("    -snapshot MySnapshot -copy-to hdfs://srv2:8082/hbase \\");<a name="line.1061"></a>
 <span class="sourceLineNo">1062</span>    System.err.println("    -chuser MyUser -chgroup MyGroup -chmod 700 -mappers 16");<a name="line.1062"></a>
 <span class="sourceLineNo">1063</span>    System.err.println();<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    System.err.println("  hbase " + getClass().getName() + " \\");<a name="line.1064"></a>
+<span class="sourceLineNo">1064</span>    System.err.println("  hbase snapshot export \\");<a name="line.1064"></a>
 <span class="sourceLineNo">1065</span>    System.err.println("    -snapshot MySnapshot -copy-from hdfs://srv2:8082/hbase \\");<a name="line.1065"></a>
 <span class="sourceLineNo">1066</span>    System.err.println("    -copy-to hdfs://srv1:50070/hbase \\");<a name="line.1066"></a>
 <span class="sourceLineNo">1067</span>    System.exit(1);<a name="line.1067"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportMapper.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportMapper.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportMapper.html
index 14327de..0a8e897 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportMapper.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportMapper.html
@@ -1065,11 +1065,11 @@
 <span class="sourceLineNo">1057</span>    System.err.println("  -bandwidth              Limit bandwidth to this value in MB/second.");<a name="line.1057"></a>
 <span class="sourceLineNo">1058</span>    System.err.println();<a name="line.1058"></a>
 <span class="sourceLineNo">1059</span>    System.err.println("Examples:");<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    System.err.println("  hbase " + getClass().getName() + " \\");<a name="line.1060"></a>
+<span class="sourceLineNo">1060</span>    System.err.println("  hbase snapshot export \\");<a name="line.1060"></a>
 <span class="sourceLineNo">1061</span>    System.err.println("    -snapshot MySnapshot -copy-to hdfs://srv2:8082/hbase \\");<a name="line.1061"></a>
 <span class="sourceLineNo">1062</span>    System.err.println("    -chuser MyUser -chgroup MyGroup -chmod 700 -mappers 16");<a name="line.1062"></a>
 <span class="sourceLineNo">1063</span>    System.err.println();<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    System.err.println("  hbase " + getClass().getName() + " \\");<a name="line.1064"></a>
+<span class="sourceLineNo">1064</span>    System.err.println("  hbase snapshot export \\");<a name="line.1064"></a>
 <span class="sourceLineNo">1065</span>    System.err.println("    -snapshot MySnapshot -copy-from hdfs://srv2:8082/hbase \\");<a name="line.1065"></a>
 <span class="sourceLineNo">1066</span>    System.err.println("    -copy-to hdfs://srv1:50070/hbase \\");<a name="line.1066"></a>
 <span class="sourceLineNo">1067</span>    System.exit(1);<a name="line.1067"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotInputSplit.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotInputSplit.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotInputSplit.html
index 14327de..0a8e897 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotInputSplit.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotInputSplit.html
@@ -1065,11 +1065,11 @@
 <span class="sourceLineNo">1057</span>    System.err.println("  -bandwidth              Limit bandwidth to this value in MB/second.");<a name="line.1057"></a>
 <span class="sourceLineNo">1058</span>    System.err.println();<a name="line.1058"></a>
 <span class="sourceLineNo">1059</span>    System.err.println("Examples:");<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    System.err.println("  hbase " + getClass().getName() + " \\");<a name="line.1060"></a>
+<span class="sourceLineNo">1060</span>    System.err.println("  hbase snapshot export \\");<a name="line.1060"></a>
 <span class="sourceLineNo">1061</span>    System.err.println("    -snapshot MySnapshot -copy-to hdfs://srv2:8082/hbase \\");<a name="line.1061"></a>
 <span class="sourceLineNo">1062</span>    System.err.println("    -chuser MyUser -chgroup MyGroup -chmod 700 -mappers 16");<a name="line.1062"></a>
 <span class="sourceLineNo">1063</span>    System.err.println();<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    System.err.println("  hbase " + getClass().getName() + " \\");<a name="line.1064"></a>
+<span class="sourceLineNo">1064</span>    System.err.println("  hbase snapshot export \\");<a name="line.1064"></a>
 <span class="sourceLineNo">1065</span>    System.err.println("    -snapshot MySnapshot -copy-from hdfs://srv2:8082/hbase \\");<a name="line.1065"></a>
 <span class="sourceLineNo">1066</span>    System.err.println("    -copy-to hdfs://srv1:50070/hbase \\");<a name="line.1066"></a>
 <span class="sourceLineNo">1067</span>    System.exit(1);<a name="line.1067"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotRecordReader.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotRecordReader.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotRecordReader.html
index 14327de..0a8e897 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotRecordReader.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.ExportSnapshotRecordReader.html
@@ -1065,11 +1065,11 @@
 <span class="sourceLineNo">1057</span>    System.err.println("  -bandwidth              Limit bandwidth to this value in MB/second.");<a name="line.1057"></a>
 <span class="sourceLineNo">1058</span>    System.err.println();<a name="line.1058"></a>
 <span class="sourceLineNo">1059</span>    System.err.println("Examples:");<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    System.err.println("  hbase " + getClass().getName() + " \\");<a name="line.1060"></a>
+<span class="sourceLineNo">1060</span>    System.err.println("  hbase snapshot export \\");<a name="line.1060"></a>
 <span class="sourceLineNo">1061</span>    System.err.println("    -snapshot MySnapshot -copy-to hdfs://srv2:8082/hbase \\");<a name="line.1061"></a>
 <span class="sourceLineNo">1062</span>    System.err.println("    -chuser MyUser -chgroup MyGroup -chmod 700 -mappers 16");<a name="line.1062"></a>
 <span class="sourceLineNo">1063</span>    System.err.println();<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    System.err.println("  hbase " + getClass().getName() + " \\");<a name="line.1064"></a>
+<span class="sourceLineNo">1064</span>    System.err.println("  hbase snapshot export \\");<a name="line.1064"></a>
 <span class="sourceLineNo">1065</span>    System.err.println("    -snapshot MySnapshot -copy-from hdfs://srv2:8082/hbase \\");<a name="line.1065"></a>
 <span class="sourceLineNo">1066</span>    System.err.println("    -copy-to hdfs://srv1:50070/hbase \\");<a name="line.1066"></a>
 <span class="sourceLineNo">1067</span>    System.exit(1);<a name="line.1067"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.html
index 14327de..0a8e897 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.ExportSnapshotInputFormat.html
@@ -1065,11 +1065,11 @@
 <span class="sourceLineNo">1057</span>    System.err.println("  -bandwidth              Limit bandwidth to this value in MB/second.");<a name="line.1057"></a>
 <span class="sourceLineNo">1058</span>    System.err.println();<a name="line.1058"></a>
 <span class="sourceLineNo">1059</span>    System.err.println("Examples:");<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    System.err.println("  hbase " + getClass().getName() + " \\");<a name="line.1060"></a>
+<span class="sourceLineNo">1060</span>    System.err.println("  hbase snapshot export \\");<a name="line.1060"></a>
 <span class="sourceLineNo">1061</span>    System.err.println("    -snapshot MySnapshot -copy-to hdfs://srv2:8082/hbase \\");<a name="line.1061"></a>
 <span class="sourceLineNo">1062</span>    System.err.println("    -chuser MyUser -chgroup MyGroup -chmod 700 -mappers 16");<a name="line.1062"></a>
 <span class="sourceLineNo">1063</span>    System.err.println();<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    System.err.println("  hbase " + getClass().getName() + " \\");<a name="line.1064"></a>
+<span class="sourceLineNo">1064</span>    System.err.println("  hbase snapshot export \\");<a name="line.1064"></a>
 <span class="sourceLineNo">1065</span>    System.err.println("    -snapshot MySnapshot -copy-from hdfs://srv2:8082/hbase \\");<a name="line.1065"></a>
 <span class="sourceLineNo">1066</span>    System.err.println("    -copy-to hdfs://srv1:50070/hbase \\");<a name="line.1066"></a>
 <span class="sourceLineNo">1067</span>    System.exit(1);<a name="line.1067"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
index 14327de..0a8e897 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/ExportSnapshot.html
@@ -1065,11 +1065,11 @@
 <span class="sourceLineNo">1057</span>    System.err.println("  -bandwidth              Limit bandwidth to this value in MB/second.");<a name="line.1057"></a>
 <span class="sourceLineNo">1058</span>    System.err.println();<a name="line.1058"></a>
 <span class="sourceLineNo">1059</span>    System.err.println("Examples:");<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    System.err.println("  hbase " + getClass().getName() + " \\");<a name="line.1060"></a>
+<span class="sourceLineNo">1060</span>    System.err.println("  hbase snapshot export \\");<a name="line.1060"></a>
 <span class="sourceLineNo">1061</span>    System.err.println("    -snapshot MySnapshot -copy-to hdfs://srv2:8082/hbase \\");<a name="line.1061"></a>
 <span class="sourceLineNo">1062</span>    System.err.println("    -chuser MyUser -chgroup MyGroup -chmod 700 -mappers 16");<a name="line.1062"></a>
 <span class="sourceLineNo">1063</span>    System.err.println();<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    System.err.println("  hbase " + getClass().getName() + " \\");<a name="line.1064"></a>
+<span class="sourceLineNo">1064</span>    System.err.println("  hbase snapshot export \\");<a name="line.1064"></a>
 <span class="sourceLineNo">1065</span>    System.err.println("    -snapshot MySnapshot -copy-from hdfs://srv2:8082/hbase \\");<a name="line.1065"></a>
 <span class="sourceLineNo">1066</span>    System.err.println("    -copy-to hdfs://srv1:50070/hbase \\");<a name="line.1066"></a>
 <span class="sourceLineNo">1067</span>    System.exit(1);<a name="line.1067"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.SnapshotStats.FileInfo.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.SnapshotStats.FileInfo.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.SnapshotStats.FileInfo.html
index dc0de15..2662234 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.SnapshotStats.FileInfo.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.SnapshotStats.FileInfo.html
@@ -475,7 +475,7 @@
 <span class="sourceLineNo">467</span>  }<a name="line.467"></a>
 <span class="sourceLineNo">468</span><a name="line.468"></a>
 <span class="sourceLineNo">469</span>  private void printUsageAndExit() {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    System.err.printf("Usage: bin/hbase %s [options]%n", getClass().getName());<a name="line.470"></a>
+<span class="sourceLineNo">470</span>    System.err.printf("Usage: bin/hbase snapshot info [options]%n");<a name="line.470"></a>
 <span class="sourceLineNo">471</span>    System.err.println(" where [options] are:");<a name="line.471"></a>
 <span class="sourceLineNo">472</span>    System.err.println("  -h|-help                Show this help and exit.");<a name="line.472"></a>
 <span class="sourceLineNo">473</span>    System.err.println("  -remote-dir             Root directory that contains the snapshots.");<a name="line.473"></a>
@@ -487,7 +487,7 @@
 <span class="sourceLineNo">479</span>    System.err.println("  -schema                 Describe the snapshotted table.");<a name="line.479"></a>
 <span class="sourceLineNo">480</span>    System.err.println();<a name="line.480"></a>
 <span class="sourceLineNo">481</span>    System.err.println("Examples:");<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    System.err.println("  hbase " + getClass() + " \\");<a name="line.482"></a>
+<span class="sourceLineNo">482</span>    System.err.println("  hbase snapshot info \\");<a name="line.482"></a>
 <span class="sourceLineNo">483</span>    System.err.println("    -snapshot MySnapshot -files");<a name="line.483"></a>
 <span class="sourceLineNo">484</span>    System.exit(1);<a name="line.484"></a>
 <span class="sourceLineNo">485</span>  }<a name="line.485"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.SnapshotStats.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.SnapshotStats.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.SnapshotStats.html
index dc0de15..2662234 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.SnapshotStats.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.SnapshotStats.html
@@ -475,7 +475,7 @@
 <span class="sourceLineNo">467</span>  }<a name="line.467"></a>
 <span class="sourceLineNo">468</span><a name="line.468"></a>
 <span class="sourceLineNo">469</span>  private void printUsageAndExit() {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    System.err.printf("Usage: bin/hbase %s [options]%n", getClass().getName());<a name="line.470"></a>
+<span class="sourceLineNo">470</span>    System.err.printf("Usage: bin/hbase snapshot info [options]%n");<a name="line.470"></a>
 <span class="sourceLineNo">471</span>    System.err.println(" where [options] are:");<a name="line.471"></a>
 <span class="sourceLineNo">472</span>    System.err.println("  -h|-help                Show this help and exit.");<a name="line.472"></a>
 <span class="sourceLineNo">473</span>    System.err.println("  -remote-dir             Root directory that contains the snapshots.");<a name="line.473"></a>
@@ -487,7 +487,7 @@
 <span class="sourceLineNo">479</span>    System.err.println("  -schema                 Describe the snapshotted table.");<a name="line.479"></a>
 <span class="sourceLineNo">480</span>    System.err.println();<a name="line.480"></a>
 <span class="sourceLineNo">481</span>    System.err.println("Examples:");<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    System.err.println("  hbase " + getClass() + " \\");<a name="line.482"></a>
+<span class="sourceLineNo">482</span>    System.err.println("  hbase snapshot info \\");<a name="line.482"></a>
 <span class="sourceLineNo">483</span>    System.err.println("    -snapshot MySnapshot -files");<a name="line.483"></a>
 <span class="sourceLineNo">484</span>    System.exit(1);<a name="line.484"></a>
 <span class="sourceLineNo">485</span>  }<a name="line.485"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html
index dc0de15..2662234 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/snapshot/SnapshotInfo.html
@@ -475,7 +475,7 @@
 <span class="sourceLineNo">467</span>  }<a name="line.467"></a>
 <span class="sourceLineNo">468</span><a name="line.468"></a>
 <span class="sourceLineNo">469</span>  private void printUsageAndExit() {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    System.err.printf("Usage: bin/hbase %s [options]%n", getClass().getName());<a name="line.470"></a>
+<span class="sourceLineNo">470</span>    System.err.printf("Usage: bin/hbase snapshot info [options]%n");<a name="line.470"></a>
 <span class="sourceLineNo">471</span>    System.err.println(" where [options] are:");<a name="line.471"></a>
 <span class="sourceLineNo">472</span>    System.err.println("  -h|-help                Show this help and exit.");<a name="line.472"></a>
 <span class="sourceLineNo">473</span>    System.err.println("  -remote-dir             Root directory that contains the snapshots.");<a name="line.473"></a>
@@ -487,7 +487,7 @@
 <span class="sourceLineNo">479</span>    System.err.println("  -schema                 Describe the snapshotted table.");<a name="line.479"></a>
 <span class="sourceLineNo">480</span>    System.err.println();<a name="line.480"></a>
 <span class="sourceLineNo">481</span>    System.err.println("Examples:");<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    System.err.println("  hbase " + getClass() + " \\");<a name="line.482"></a>
+<span class="sourceLineNo">482</span>    System.err.println("  hbase snapshot info \\");<a name="line.482"></a>
 <span class="sourceLineNo">483</span>    System.err.println("    -snapshot MySnapshot -files");<a name="line.483"></a>
 <span class="sourceLineNo">484</span>    System.exit(1);<a name="line.484"></a>
 <span class="sourceLineNo">485</span>  }<a name="line.485"></a>


[39/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.SingleServerRequestRunnable.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.SingleServerRequestRunnable.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.SingleServerRequestRunnable.html
index ed7bc7f..e65df71 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.SingleServerRequestRunnable.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/AsyncProcess.AsyncRequestFutureImpl.SingleServerRequestRunnable.html
@@ -1198,681 +1198,699 @@
 <span class="sourceLineNo">1190</span>        byte[] row = e.getValue().iterator().next().getAction().getRow();<a name="line.1190"></a>
 <span class="sourceLineNo">1191</span>        // Do not use the exception for updating cache because it might be coming from<a name="line.1191"></a>
 <span class="sourceLineNo">1192</span>        // any of the regions in the MultiAction.<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>        if (tableName != null) {<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>          connection.updateCachedLocations(tableName, regionName, row,<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>              ClientExceptionsUtil.isMetaClearingException(t) ? null : t, server);<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>        }<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>        for (Action&lt;Row&gt; action : e.getValue()) {<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          Retry retry = manageError(<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>              action.getOriginalIndex(), action.getAction(), canRetry, t, server);<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>          if (retry == Retry.YES) {<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>            toReplay.add(action);<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>            ++stopped;<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>          } else {<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>            ++failed;<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>          }<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>        }<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>      }<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span><a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>      if (toReplay.isEmpty()) {<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>        logNoResubmit(server, numAttempt, rsActions.size(), t, failed, stopped);<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>      } else {<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>        resubmit(server, toReplay, numAttempt, rsActions.size(), t);<a name="line.1213"></a>
+<span class="sourceLineNo">1193</span>        try {<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          if (tableName != null) {<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>            connection.updateCachedLocations(tableName, regionName, row,<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>              ClientExceptionsUtil.isMetaClearingException(t) ? null : t, server);<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>          }<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>        } catch (Throwable ex) {<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>          // That should never happen, but if it did, we want to make sure<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>          // we still process errors<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>          LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>        }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>        for (Action&lt;Row&gt; action : e.getValue()) {<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>          Retry retry = manageError(<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>              action.getOriginalIndex(), action.getAction(), canRetry, t, server);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>          if (retry == Retry.YES) {<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>            toReplay.add(action);<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>            ++stopped;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>          } else {<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>            ++failed;<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>          }<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>        }<a name="line.1213"></a>
 <span class="sourceLineNo">1214</span>      }<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>     * Log as much info as possible, and, if there is something to replay,<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>     * submit it again after a back off sleep.<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>     */<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    private void resubmit(ServerName oldServer, List&lt;Action&lt;Row&gt;&gt; toReplay,<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>        int numAttempt, int failureCount, Throwable throwable) {<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      // We have something to replay. We're going to sleep a little before.<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span><a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // We have two contradicting needs here:<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>      //  1) We want to get the new location after having slept, as it may change.<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>      //  2) We want to take into account the location when calculating the sleep time.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>      //  3) If all this is just because the response needed to be chunked try again FAST.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>      // It should be possible to have some heuristics to take the right decision. Short term,<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>      //  we go for one.<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>      boolean retryImmediately = throwable instanceof RetryImmediatelyException;<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      int nextAttemptNumber = retryImmediately ? numAttempt : numAttempt + 1;<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>      long backOffTime = retryImmediately ? 0 :<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>          errorsByServer.calculateBackoffTime(oldServer, pause);<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>      if (numAttempt &gt; startLogErrorsCnt) {<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>        // We use this value to have some logs when we have multiple failures, but not too many<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>        //  logs, as errors are to be expected when a region moves, splits and so on<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>        LOG.info(createLog(numAttempt, failureCount, toReplay.size(),<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>            oldServer, throwable, backOffTime, true, null, -1, -1));<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>      }<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span><a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>      try {<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>        if (backOffTime &gt; 0) {<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>          Thread.sleep(backOffTime);<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span>        }<a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>      } catch (InterruptedException e) {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>        LOG.warn("#" + id + ", not sent: " + toReplay.size() + " operations, " + oldServer, e);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>        Thread.currentThread().interrupt();<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>        return;<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      }<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span><a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>      groupAndSendMultiAction(toReplay, nextAttemptNumber);<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    }<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span><a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>    private void logNoResubmit(ServerName oldServer, int numAttempt,<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>        int failureCount, Throwable throwable, int failed, int stopped) {<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>      if (failureCount != 0 || numAttempt &gt; startLogErrorsCnt + 1) {<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>        String timeStr = new Date(errorsByServer.getStartTrackingTime()).toString();<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>        String logMessage = createLog(numAttempt, failureCount, 0, oldServer,<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>            throwable, -1, false, timeStr, failed, stopped);<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>        if (failed != 0) {<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>          // Only log final failures as warning<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>          LOG.warn(logMessage);<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>        } else {<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>          LOG.info(logMessage);<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>        }<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>      }<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    }<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span><a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    /**<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>     * Called when we receive the result of a server query.<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>     *<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>     * @param multiAction    - the multiAction we sent<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>     * @param server       - the location. It's used as a server name.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>     * @param responses      - the response, if any<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>     * @param numAttempt     - the attempt<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>     */<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    private void receiveMultiAction(MultiAction&lt;Row&gt; multiAction,<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>        ServerName server, MultiResponse responses, int numAttempt) {<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>       assert responses != null;<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span><a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      // Success or partial success<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      // Analyze detailed results. We can still have individual failures to be redo.<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>      // two specific throwables are managed:<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>      //  - DoNotRetryIOException: we continue to retry for other actions<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>      //  - RegionMovedException: we update the cache with the new region location<a name="line.1286"></a>
+<span class="sourceLineNo">1215</span><a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>      if (toReplay.isEmpty()) {<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span>        logNoResubmit(server, numAttempt, rsActions.size(), t, failed, stopped);<a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>      } else {<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>        resubmit(server, toReplay, numAttempt, rsActions.size(), t);<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      }<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    }<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>     * Log as much info as possible, and, if there is something to replay,<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>     * submit it again after a back off sleep.<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>     */<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    private void resubmit(ServerName oldServer, List&lt;Action&lt;Row&gt;&gt; toReplay,<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>        int numAttempt, int failureCount, Throwable throwable) {<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>      // We have something to replay. We're going to sleep a little before.<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span><a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>      // We have two contradicting needs here:<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>      //  1) We want to get the new location after having slept, as it may change.<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>      //  2) We want to take into account the location when calculating the sleep time.<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>      //  3) If all this is just because the response needed to be chunked try again FAST.<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>      // It should be possible to have some heuristics to take the right decision. Short term,<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>      //  we go for one.<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>      boolean retryImmediately = throwable instanceof RetryImmediatelyException;<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>      int nextAttemptNumber = retryImmediately ? numAttempt : numAttempt + 1;<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      long backOffTime = retryImmediately ? 0 :<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>          errorsByServer.calculateBackoffTime(oldServer, pause);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>      if (numAttempt &gt; startLogErrorsCnt) {<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>        // We use this value to have some logs when we have multiple failures, but not too many<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>        //  logs, as errors are to be expected when a region moves, splits and so on<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>        LOG.info(createLog(numAttempt, failureCount, toReplay.size(),<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>            oldServer, throwable, backOffTime, true, null, -1, -1));<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>      }<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span><a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      try {<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>        if (backOffTime &gt; 0) {<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>          Thread.sleep(backOffTime);<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>        }<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      } catch (InterruptedException e) {<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>        LOG.warn("#" + id + ", not sent: " + toReplay.size() + " operations, " + oldServer, e);<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>        Thread.currentThread().interrupt();<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>        return;<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>      }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span><a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>      groupAndSendMultiAction(toReplay, nextAttemptNumber);<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    }<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span><a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    private void logNoResubmit(ServerName oldServer, int numAttempt,<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>        int failureCount, Throwable throwable, int failed, int stopped) {<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span>      if (failureCount != 0 || numAttempt &gt; startLogErrorsCnt + 1) {<a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>        String timeStr = new Date(errorsByServer.getStartTrackingTime()).toString();<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>        String logMessage = createLog(numAttempt, failureCount, 0, oldServer,<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>            throwable, -1, false, timeStr, failed, stopped);<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>        if (failed != 0) {<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>          // Only log final failures as warning<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>          LOG.warn(logMessage);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>        } else {<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>          LOG.info(logMessage);<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>        }<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>      }<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    }<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span><a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>    /**<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>     * Called when we receive the result of a server query.<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>     *<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>     * @param multiAction    - the multiAction we sent<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>     * @param server       - the location. It's used as a server name.<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>     * @param responses      - the response, if any<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>     * @param numAttempt     - the attempt<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>     */<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    private void receiveMultiAction(MultiAction&lt;Row&gt; multiAction,<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        ServerName server, MultiResponse responses, int numAttempt) {<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>       assert responses != null;<a name="line.1286"></a>
 <span class="sourceLineNo">1287</span><a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>      List&lt;Action&lt;Row&gt;&gt; toReplay = new ArrayList&lt;Action&lt;Row&gt;&gt;();<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      Throwable throwable = null;<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>      int failureCount = 0;<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      boolean canRetry = true;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span><a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      Map&lt;byte[], MultiResponse.RegionResult&gt; results = responses.getResults();<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>      updateStats(server, results);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span><a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      int failed = 0, stopped = 0;<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>      // Go by original action.<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      for (Map.Entry&lt;byte[], List&lt;Action&lt;Row&gt;&gt;&gt; regionEntry : multiAction.actions.entrySet()) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        byte[] regionName = regionEntry.getKey();<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>        Map&lt;Integer, Object&gt; regionResults = results.get(regionName) == null<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>            ?  null : results.get(regionName).result;<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        if (regionResults == null) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>          if (!responses.getExceptions().containsKey(regionName)) {<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>            LOG.error("Server sent us neither results nor exceptions for "<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>                + Bytes.toStringBinary(regionName));<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>            responses.getExceptions().put(regionName, new RuntimeException("Invalid response"));<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>          }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>          continue;<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>        }<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>        boolean regionFailureRegistered = false;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>        for (Action&lt;Row&gt; sentAction : regionEntry.getValue()) {<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>          Object result = regionResults.get(sentAction.getOriginalIndex());<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>          // Failure: retry if it's make sense else update the errors lists<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>          if (result == null || result instanceof Throwable) {<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>            Row row = sentAction.getAction();<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>            throwable = ClientExceptionsUtil.findException(result);<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>            // Register corresponding failures once per server/once per region.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>            if (!regionFailureRegistered) {<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>              regionFailureRegistered = true;<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>              connection.updateCachedLocations(<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>                  tableName, regionName, row.getRow(), result, server);<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>            }<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>            if (failureCount == 0) {<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>              errorsByServer.reportServerError(server);<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>              // We determine canRetry only once for all calls, after reporting server failure.<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>              canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>            }<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>            ++failureCount;<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>            Retry retry = manageError(sentAction.getOriginalIndex(), row,<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>                canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, (Throwable) result, server);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>            if (retry == Retry.YES) {<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>              toReplay.add(sentAction);<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>            } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>              ++stopped;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>            } else {<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>              ++failed;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>            }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>          } else {<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>            if (callback != null) {<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>              try {<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>                //noinspection unchecked<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>                // TODO: would callback expect a replica region name if it gets one?<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>                this.callback.update(regionName, sentAction.getAction().getRow(), (CResult) result);<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>              } catch (Throwable t) {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>                LOG.error("User callback threw an exception for "<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>                    + Bytes.toStringBinary(regionName) + ", ignoring", t);<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>              }<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>            }<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>            setResult(sentAction, result);<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>          }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>        }<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>      }<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span><a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>      // The failures global to a region. We will use for multiAction we sent previously to find the<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>      //   actions to replay.<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>      for (Map.Entry&lt;byte[], Throwable&gt; throwableEntry : responses.getExceptions().entrySet()) {<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>        throwable = throwableEntry.getValue();<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>        byte[] region = throwableEntry.getKey();<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>        List&lt;Action&lt;Row&gt;&gt; actions = multiAction.actions.get(region);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>        if (actions == null || actions.isEmpty()) {<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>          throw new IllegalStateException("Wrong response for the region: " +<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>              HRegionInfo.encodeRegionName(region));<a name="line.1362"></a>
+<span class="sourceLineNo">1288</span>      // Success or partial success<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>      // Analyze detailed results. We can still have individual failures to be redo.<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      // two specific throwables are managed:<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>      //  - DoNotRetryIOException: we continue to retry for other actions<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>      //  - RegionMovedException: we update the cache with the new region location<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span><a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>      List&lt;Action&lt;Row&gt;&gt; toReplay = new ArrayList&lt;Action&lt;Row&gt;&gt;();<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>      Throwable throwable = null;<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>      int failureCount = 0;<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      boolean canRetry = true;<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span><a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      Map&lt;byte[], MultiResponse.RegionResult&gt; results = responses.getResults();<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>      updateStats(server, results);<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span><a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      int failed = 0, stopped = 0;<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>      // Go by original action.<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>      for (Map.Entry&lt;byte[], List&lt;Action&lt;Row&gt;&gt;&gt; regionEntry : multiAction.actions.entrySet()) {<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>        byte[] regionName = regionEntry.getKey();<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>        Map&lt;Integer, Object&gt; regionResults = results.get(regionName) == null<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>            ?  null : results.get(regionName).result;<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>        if (regionResults == null) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>          if (!responses.getExceptions().containsKey(regionName)) {<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>            LOG.error("Server sent us neither results nor exceptions for "<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>                + Bytes.toStringBinary(regionName));<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>            responses.getExceptions().put(regionName, new RuntimeException("Invalid response"));<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>          }<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>          continue;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>        }<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>        boolean regionFailureRegistered = false;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>        for (Action&lt;Row&gt; sentAction : regionEntry.getValue()) {<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span>          Object result = regionResults.get(sentAction.getOriginalIndex());<a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>          // Failure: retry if it's make sense else update the errors lists<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>          if (result == null || result instanceof Throwable) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>            Row row = sentAction.getAction();<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>            throwable = ClientExceptionsUtil.findException(result);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>            // Register corresponding failures once per server/once per region.<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>            if (!regionFailureRegistered) {<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>              regionFailureRegistered = true;<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>              try {<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>                connection.updateCachedLocations(<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>                  tableName, regionName, row.getRow(), result, server);<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>              } catch (Throwable ex) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>                // That should never happen, but if it did, we want to make sure<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>                // we still process errors<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>                LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>              }<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>            }<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>            if (failureCount == 0) {<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>              errorsByServer.reportServerError(server);<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>              // We determine canRetry only once for all calls, after reporting server failure.<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>              canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>            }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>            ++failureCount;<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>            Retry retry = manageError(sentAction.getOriginalIndex(), row,<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>                canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, (Throwable) result, server);<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>            if (retry == Retry.YES) {<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>              toReplay.add(sentAction);<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>            } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>              ++stopped;<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>            } else {<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>              ++failed;<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>            }<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>          } else {<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>            if (callback != null) {<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>              try {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>                //noinspection unchecked<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>                // TODO: would callback expect a replica region name if it gets one?<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>                this.callback.update(regionName, sentAction.getAction().getRow(), (CResult) result);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>              } catch (Throwable t) {<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>                LOG.error("User callback threw an exception for "<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>                    + Bytes.toStringBinary(regionName) + ", ignoring", t);<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>            setResult(sentAction, result);<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>          }<a name="line.1362"></a>
 <span class="sourceLineNo">1363</span>        }<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span><a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        if (failureCount == 0) {<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>          errorsByServer.reportServerError(server);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>          canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>        }<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>        if (null == tableName &amp;&amp; ClientExceptionsUtil.isMetaClearingException(throwable)) {<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>          // For multi-actions, we don't have a table name, but we want to make sure to clear the<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>          // cache in case there were location-related exceptions. We don't to clear the cache<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>          // for every possible exception that comes through, however.<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>          connection.clearCaches(server);<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        } else {<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>          connection.updateCachedLocations(<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>              tableName, region, actions.get(0).getAction().getRow(), throwable, server);<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>        }<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        failureCount += actions.size();<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span><a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>        for (Action&lt;Row&gt; action : actions) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>          Row row = action.getAction();<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>          Retry retry = manageError(action.getOriginalIndex(), row,<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>              canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, throwable, server);<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>          if (retry == Retry.YES) {<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>            toReplay.add(action);<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>            ++stopped;<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>          } else {<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>            ++failed;<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>          }<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>        }<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>      }<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      if (toReplay.isEmpty()) {<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>        logNoResubmit(server, numAttempt, failureCount, throwable, failed, stopped);<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>      } else {<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>        resubmit(server, toReplay, numAttempt, failureCount, throwable);<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>      }<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    }<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span><a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    private String createLog(int numAttempt, int failureCount, int replaySize, ServerName sn,<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>        Throwable error, long backOffTime, boolean willRetry, String startTime,<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>        int failed, int stopped) {<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>      StringBuilder sb = new StringBuilder();<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      sb.append("#").append(id).append(", table=").append(tableName).append(", ")<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>        .append("attempt=").append(numAttempt)<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>        .append("/").append(numTries).append(" ");<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span><a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>      if (failureCount &gt; 0 || error != null){<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>        sb.append("failed=").append(failureCount).append("ops").append(", last exception: ").<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>            append(error == null ? "null" : error);<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>      } else {<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>        sb.append("succeeded");<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>      }<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span><a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>      sb.append(" on ").append(sn).append(", tracking started ").append(startTime);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span><a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>      if (willRetry) {<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>        sb.append(", retrying after=").append(backOffTime).append("ms").<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>            append(", replay=").append(replaySize).append("ops");<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      } else if (failureCount &gt; 0) {<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>        if (stopped &gt; 0) {<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>          sb.append("; not retrying ").append(stopped).append(" due to success from other replica");<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>        }<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        if (failed &gt; 0) {<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>          sb.append("; not retrying ").append(failed).append(" - final failure");<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>        }<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span><a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      }<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span><a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>      return sb.toString();<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    }<a name="line.1431"></a>
+<span class="sourceLineNo">1364</span>      }<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span><a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>      // The failures global to a region. We will use for multiAction we sent previously to find the<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>      //   actions to replay.<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>      for (Map.Entry&lt;byte[], Throwable&gt; throwableEntry : responses.getExceptions().entrySet()) {<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        throwable = throwableEntry.getValue();<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>        byte[] region = throwableEntry.getKey();<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>        List&lt;Action&lt;Row&gt;&gt; actions = multiAction.actions.get(region);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>        if (actions == null || actions.isEmpty()) {<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>          throw new IllegalStateException("Wrong response for the region: " +<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>              HRegionInfo.encodeRegionName(region));<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        }<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span><a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        if (failureCount == 0) {<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>          errorsByServer.reportServerError(server);<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>          canRetry = errorsByServer.canTryMore(numAttempt);<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>        }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>        if (null == tableName &amp;&amp; ClientExceptionsUtil.isMetaClearingException(throwable)) {<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>          // For multi-actions, we don't have a table name, but we want to make sure to clear the<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>          // cache in case there were location-related exceptions. We don't to clear the cache<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>          // for every possible exception that comes through, however.<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>          connection.clearCaches(server);<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>        } else {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>          try {<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>            connection.updateCachedLocations(<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>              tableName, region, actions.get(0).getAction().getRow(), throwable, server);<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>          } catch (Throwable ex) {<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>            // That should never happen, but if it did, we want to make sure<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            // we still process errors<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>            LOG.error("Couldn't update cached region locations: " + ex);<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>          }<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>        }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>        failureCount += actions.size();<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span><a name="line.1397"></a>
+<span class="sourceLineNo">1398</span>        for (Action&lt;Row&gt; action : actions) {<a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>          Row row = action.getAction();<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>          Retry retry = manageError(action.getOriginalIndex(), row,<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>              canRetry ? Retry.YES : Retry.NO_RETRIES_EXHAUSTED, throwable, server);<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>          if (retry == Retry.YES) {<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>            toReplay.add(action);<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>          } else if (retry == Retry.NO_OTHER_SUCCEEDED) {<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>            ++stopped;<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>          } else {<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>            ++failed;<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>          }<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>        }<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      }<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>      if (toReplay.isEmpty()) {<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>        logNoResubmit(server, numAttempt, failureCount, throwable, failed, stopped);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>      } else {<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span>        resubmit(server, toReplay, numAttempt, failureCount, throwable);<a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>      }<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    }<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span><a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    private String createLog(int numAttempt, int failureCount, int replaySize, ServerName sn,<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>        Throwable error, long backOffTime, boolean willRetry, String startTime,<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>        int failed, int stopped) {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      StringBuilder sb = new StringBuilder();<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>      sb.append("#").append(id).append(", table=").append(tableName).append(", ")<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>        .append("attempt=").append(numAttempt)<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>        .append("/").append(numTries).append(" ");<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span><a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      if (failureCount &gt; 0 || error != null){<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>        sb.append("failed=").append(failureCount).append("ops").append(", last exception: ").<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>            append(error == null ? "null" : error);<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      } else {<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>        sb.append("succeeded");<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>      }<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>     * Sets the non-error result from a particular action.<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>     * @param action Action (request) that the server responded to.<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>     * @param result The result.<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>     */<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    private void setResult(Action&lt;Row&gt; action, Object result) {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      if (result == null) {<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>        throw new RuntimeException("Result cannot be null");<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>      }<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      ReplicaResultState state = null;<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>      boolean isStale = !RegionReplicaUtil.isDefaultReplica(action.getReplicaId());<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      int index = action.getOriginalIndex();<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>      if (results == null) {<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>        decActionCounter(index);<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>        return; // Simple case, no replica requests.<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>      }<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>      state = trySetResultSimple(index, action.getAction(), false, result, null, isStale);<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>      if (state == null) {<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span>        return; // Simple case, no replica requests.<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>      }<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      // At this point we know that state is set to replica tracking class.<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>      // It could be that someone else is also looking at it; however, we know there can<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>      // only be one state object, and only one thread can set callCount to 0. Other threads<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>      // will either see state with callCount 0 after locking it; or will not see state at all<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>      // we will replace it with the result.<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>      synchronized (state) {<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>        if (state.callCount == 0) {<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>          return; // someone already set the result<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>        }<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>        state.callCount = 0;<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>      }<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>      synchronized (replicaResultLock) {<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>        if (results[index] != state) {<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>          throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>        }<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>        results[index] = result;<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>      }<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span><a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>      decActionCounter(index);<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    }<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span><a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>    /**<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>     * Sets the error from a particular action.<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>     * @param index Original action index.<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>     * @param row Original request.<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>     * @param throwable The resulting error.<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>     * @param server The source server.<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>     */<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>    private void setError(int index, Row row, Throwable throwable, ServerName server) {<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      ReplicaResultState state = null;<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>      if (results == null) {<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>        // Note that we currently cannot have replica requests with null results. So it shouldn't<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>        // happen that multiple replica calls will call dAC for same actions with results == null.<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span>        // Only one call per action should be present in this case.<a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>        errors.add(throwable, row, server);<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>        decActionCounter(index);<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>        return; // Simple case, no replica requests.<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>      }<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>      state = trySetResultSimple(index, row, true, throwable, server, false);<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>      if (state == null) {<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>        return; // Simple case, no replica requests.<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>      }<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>      BatchErrors target = null; // Error will be added to final errors, or temp replica errors.<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      boolean isActionDone = false;<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>      synchronized (state) {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>        switch (state.callCount) {<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>          case 0: return; // someone already set the result<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>          case 1: { // All calls failed, we are the last error.<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>            target = errors;<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>            isActionDone = true;<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>            break;<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>          }<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>          default: {<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>            assert state.callCount &gt; 1;<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>            if (state.replicaErrors == null) {<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span>              state.replicaErrors = new BatchErrors();<a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>            }<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>            target = state.replicaErrors;<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>            break;<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>        --state.callCount;<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>      }<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      target.add(throwable, row, server);<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>      if (isActionDone) {<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>        if (state.replicaErrors != null) { // last call, no need to lock<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>          errors.merge(state.replicaErrors);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>        }<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>        // See setResult for explanations.<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>        synchronized (replicaResultLock) {<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>          if (results[index] != state) {<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>            throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>          }<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>          results[index] = throwable;<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>        }<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>        decActionCounter(index);<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>      }<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    }<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span><a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    /**<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>     * Checks if the action is complete; used on error to prevent needless retries.<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>     * Does not synchronize, assuming element index/field accesses are atomic.<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>     * This is an opportunistic optimization check, doesn't have to be strict.<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>     * @param index Original action index.<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>     * @param row Original request.<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>     */<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    private boolean isActionComplete(int index, Row row) {<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      if (!isReplicaGet(row)) return false;<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>      Object resObj = results[index];<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>      return (resObj != null) &amp;&amp; (!(resObj instanceof ReplicaResultState)<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>          || ((ReplicaResultState)resObj).callCount == 0);<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>     * Tries to set the result or error for a particular action as if there were no replica calls.<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>     * @return null if successful; replica state if there were in fact replica calls.<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>     */<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    private ReplicaResultState trySetResultSimple(int index, Row row, boolean isError,<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>        Object result, ServerName server, boolean isFromReplica) {<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>      Object resObj = null;<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>      if (!isReplicaGet(row)) {<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>        if (isFromReplica) {<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>          throw new AssertionError("Unexpected stale result for " + row);<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>        }<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>        results[index] = result;<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>      } else {<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>        synchronized (replicaResultLock) {<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>          resObj = results[index];<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>          if (resObj == null) {<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>            if (isFromReplica) {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>              throw new AssertionError("Unexpected stale result for " + row);<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>            }<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>            results[index] = result;<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>          }<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>        }<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>      }<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span><a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>      ReplicaResultState rrs =<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>          (resObj instanceof ReplicaResultState) ? (ReplicaResultState)resObj : null;<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>      if (rrs == null &amp;&amp; isError) {<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>        // The resObj is not replica state (null or already set).<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>        errors.add((Throwable)result, row, server);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>      }<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span><a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>      if (resObj == null) {<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>        // resObj is null - no replica calls were made.<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>        decActionCounter(index);<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>        return null;<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      }<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>      return rrs;<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    }<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span><a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    private void decActionCounter(int index) {<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>      long actionsRemaining = actionsInProgress.decrementAndGet();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>      if (actionsRemaining &lt; 0) {<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>        String error = buildDetailedErrorMsg("Incorrect actions in progress", index);<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>        throw new AssertionError(error);<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>      } else if (actionsRemaining == 0) {<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>        synchronized (actionsInProgress) {<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>          actionsInProgress.notifyAll();<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>        }<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>      }<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    }<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span><a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>    private String buildDetailedErrorMsg(String string, int index) {<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>      StringBuilder error = new StringBuilder(128);<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>      error.append(string).append("; called for ").append(index).append(", actionsInProgress ")<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>          .append(actionsInProgress.get()).append("; replica gets: ");<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>      if (replicaGetIndices != null) {<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>        for (int i = 0; i &lt; replicaGetIndices.length; ++i) {<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>          error.append(replicaGetIndices[i]).append(", ");<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>        }<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>      } else {<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>        error.append(hasAnyReplicaGets ? "all" : "none");<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>      }<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      error.append("; results ");<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      if (results != null) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>        for (int i = 0; i &lt; results.length; ++i) {<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>          Object o = results[i];<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>          error.append(((o == null) ? "null" : o.toString())).append(", ");<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>        }<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>      }<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>      return error.toString();<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    }<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span><a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    @Override<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    public void waitUntilDone() throws InterruptedIOException {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      try {<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>        waitUntilDone(Long.MAX_VALUE);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>      } catch (InterruptedException iex) {<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>        throw new InterruptedIOException(iex.getMessage());<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>      } finally {<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>        if (callsInProgress != null) {<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>          for (PayloadCarryingServerCallable clb : callsInProgress) {<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>            clb.cancel();<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>          }<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>        }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>      }<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>    }<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span><a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    private boolean waitUntilDone(long cutoff) throws InterruptedException {<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>      boolean hasWait = cutoff != Long.MAX_VALUE;<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>      long lastLog = EnvironmentEdgeManager.currentTime();<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>      long currentInProgress;<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>      while (0 != (currentInProgress = actionsInProgress.get())) {<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>        long now = EnvironmentEdgeManager.currentTime();<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>        if (hasWait &amp;&amp; (now * 1000L) &gt; cutoff) {<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>          return false;<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>        }<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>        if (!hasWait) { // Only log if wait is infinite.<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>          if (now &gt; lastLog + 10000) {<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>            lastLog = now;<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>            LOG.info("#" + id + ", waiting for " + currentInProgress + "  actions to finish");<a name="line.1645"></a>
+<span class="sourceLineNo">1433</span>      sb.append(" on ").append(sn).append(", tracking started ").append(startTime);<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span><a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>      if (willRetry) {<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>        sb.append(", retrying after=").append(backOffTime).append("ms").<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>            append(", replay=").append(replaySize).append("ops");<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>      } else if (failureCount &gt; 0) {<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>        if (stopped &gt; 0) {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>          sb.append("; not retrying ").append(stopped).append(" due to success from other replica");<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>        }<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        if (failed &gt; 0) {<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>          sb.append("; not retrying ").append(failed).append(" - final failure");<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>        }<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><a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      return sb.toString();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>    }<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span><a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>    /**<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span>     * Sets the non-error result from a particular action.<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>     * @param action Action (request) that the server responded to.<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>     * @param result The result.<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>     */<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    private void setResult(Action&lt;Row&gt; action, Object result) {<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>      if (result == null) {<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>        throw new RuntimeException("Result cannot be null");<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>      }<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>      ReplicaResultState state = null;<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>      boolean isStale = !RegionReplicaUtil.isDefaultReplica(action.getReplicaId());<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>      int index = action.getOriginalIndex();<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>      if (results == null) {<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>        decActionCounter(index);<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>        return; // Simple case, no replica requests.<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>      }<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>      state = trySetResultSimple(index, action.getAction(), false, result, null, isStale);<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>      if (state == null) {<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>        return; // Simple case, no replica requests.<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>      }<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>      // At this point we know that state is set to replica tracking class.<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>      // It could be that someone else is also looking at it; however, we know there can<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>      // only be one state object, and only one thread can set callCount to 0. Other threads<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>      // will either see state with callCount 0 after locking it; or will not see state at all<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>      // we will replace it with the result.<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>      synchronized (state) {<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>        if (state.callCount == 0) {<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>          return; // someone already set the result<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>        }<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>        state.callCount = 0;<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      }<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      synchronized (replicaResultLock) {<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>        if (results[index] != state) {<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>          throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>        }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>        results[index] = result;<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>      decActionCounter(index);<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    }<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span><a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    /**<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>     * Sets the error from a particular action.<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>     * @param index Original action index.<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>     * @param row Original request.<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>     * @param throwable The resulting error.<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>     * @param server The source server.<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>     */<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>    private void setError(int index, Row row, Throwable throwable, ServerName server) {<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>      ReplicaResultState state = null;<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>      if (results == null) {<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>        // Note that we currently cannot have replica requests with null results. So it shouldn't<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>        // happen that multiple replica calls will call dAC for same actions with results == null.<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>        // Only one call per action should be present in this case.<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>        errors.add(throwable, row, server);<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>        decActionCounter(index);<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>        return; // Simple case, no replica requests.<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>      }<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>      state = trySetResultSimple(index, row, true, throwable, server, false);<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      if (state == null) {<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>        return; // Simple case, no replica requests.<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>      }<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      BatchErrors target = null; // Error will be added to final errors, or temp replica errors.<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>      boolean isActionDone = false;<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>      synchronized (state) {<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>        switch (state.callCount) {<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>          case 0: return; // someone already set the result<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>          case 1: { // All calls failed, we are the last error.<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>            target = errors;<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>            isActionDone = true;<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>            break;<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>          }<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          default: {<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>            assert state.callCount &gt; 1;<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>            if (state.replicaErrors == null) {<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>              state.replicaErrors = new BatchErrors();<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>            }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>            target = state.replicaErrors;<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>            break;<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>          }<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>        }<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>        --state.callCount;<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>      }<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span>      target.add(throwable, row, server);<a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>      if (isActionDone) {<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>        if (state.replicaErrors != null) { // last call, no need to lock<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>          errors.merge(state.replicaErrors);<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>        }<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>        // See setResult for explanations.<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>        synchronized (replicaResultLock) {<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>          if (results[index] != state) {<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>            throw new AssertionError("We set the callCount but someone else replaced the result");<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>          }<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>          results[index] = throwable;<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>        }<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>        decActionCounter(index);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>      }<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>    }<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span><a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>    /**<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>     * Checks if the action is complete; used on error to prevent needless retries.<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>     * Does not synchronize, assuming element index/field accesses are atomic.<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>     * This is an opportunistic optimization check, doesn't have to be strict.<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>     * @param index Original action index.<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>     * @param row Original request.<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>     */<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    private boolean isActionComplete(int index, Row row) {<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>      if (!isReplicaGet(row)) return false;<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>      Object resObj = results[index];<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>      return (resObj != null) &amp;&amp; (!(resObj instanceof ReplicaResultState)<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>          || ((ReplicaResultState)resObj).callCount == 0);<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    }<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span><a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>    /**<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>     * Tries to set the result or error for a particular action as if there were no replica calls.<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>     * @return null if successful; replica state if there were in fact replica calls.<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>     */<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>    private ReplicaResultState trySetResultSimple(int index, Row row, boolean isError,<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>        Object result, ServerName server, boolean isFromReplica) {<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>      Object resObj = null;<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>      if (!isReplicaGet(row)) {<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>        if (isFromReplica) {<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>          throw new AssertionError("Unexpected stale result for " + row);<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>        }<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>        results[index] = result;<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>      } else {<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>        synchronized (replicaResultLock) {<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>          resObj = results[index];<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>          if (resObj == null) {<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>            if (isFromReplica) {<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>              throw new AssertionError("Unexpected stale result for " + row);<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>            }<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>            results[index] = result;<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>          }<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>        }<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>      }<a name="line.1586"></a>
+<span class="sourceLineNo">1587</

<TRUNCATED>

[20/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.StoreScannerCompactionRace.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.StoreScannerCompactionRace.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.StoreScannerCompactionRace.html
index 3529a44..4556e83 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.StoreScannerCompactionRace.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.StoreScannerCompactionRace.html
@@ -141,7 +141,7 @@
 <span class="sourceLineNo">133</span>  protected List&lt;KeyValueScanner&gt; currentScanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.133"></a>
 <span class="sourceLineNo">134</span>  // flush update lock<a name="line.134"></a>
 <span class="sourceLineNo">135</span>  private ReentrantLock flushLock = new ReentrantLock();<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  <a name="line.136"></a>
+<span class="sourceLineNo">136</span><a name="line.136"></a>
 <span class="sourceLineNo">137</span>  protected final long readPt;<a name="line.137"></a>
 <span class="sourceLineNo">138</span><a name="line.138"></a>
 <span class="sourceLineNo">139</span>  // used by the injection framework to test race between StoreScanner construction and compaction<a name="line.139"></a>
@@ -608,317 +608,378 @@
 <span class="sourceLineNo">600</span>        continue;<a name="line.600"></a>
 <span class="sourceLineNo">601</span><a name="line.601"></a>
 <span class="sourceLineNo">602</span>      case DONE:<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        matcher.curCell = null;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>      case DONE_SCAN:<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        close(false);// Do all cleanup except heap.close()<a name="line.607"></a>
-<span class="sourceLineNo">608</span>        return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>      case SEEK_NEXT_ROW:<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        // This is just a relatively simple end of scan fix, to short-cut end<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        // us if there is an endKey in the scan.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>        if (!matcher.moreRowsMayExistAfter(cell)) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>          close(false);// Do all cleanup except heap.close()<a name="line.614"></a>
-<span class="sourceLineNo">615</span>          return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>        matcher.curCell = null;<a name="line.617"></a>
-<span class="sourceLineNo">618</span>        seekToNextRow(cell);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>        break;<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>      case SEEK_NEXT_COL:<a name="line.621"></a>
-<span class="sourceLineNo">622</span>        seekAsDirection(matcher.getKeyForNextColumn(cell));<a name="line.622"></a>
-<span class="sourceLineNo">623</span>        break;<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>      case SKIP:<a name="line.625"></a>
-<span class="sourceLineNo">626</span>        this.heap.next();<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        break;<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>      case SEEK_NEXT_USING_HINT:<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        Cell nextKV = matcher.getNextKeyHint(cell);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (nextKV != null) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          seekAsDirection(nextKV);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        } else {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>          heap.next();<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        break;<a name="line.636"></a>
-<span class="sourceLineNo">637</span><a name="line.637"></a>
-<span class="sourceLineNo">638</span>      default:<a name="line.638"></a>
-<span class="sourceLineNo">639</span>        throw new RuntimeException("UNEXPECTED");<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      }<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    } while ((cell = this.heap.peek()) != null);<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    if (count &gt; 0) {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<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>    // No more keys<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    close(false);// Do all cleanup except heap.close()<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>  /*<a name="line.652"></a>
-<span class="sourceLineNo">653</span>   * See if we should actually SEEK or rather just SKIP to the next Cell.<a name="line.653"></a>
-<span class="sourceLineNo">654</span>   * (see HBASE-13109)<a name="line.654"></a>
-<span class="sourceLineNo">655</span>   */<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private ScanQueryMatcher.MatchCode optimize(ScanQueryMatcher.MatchCode qcode, Cell cell) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    switch(qcode) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    case INCLUDE_AND_SEEK_NEXT_COL:<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    case SEEK_NEXT_COL:<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    {<a name="line.660"></a>
-<span class="sourceLineNo">661</span>      Cell nextIndexedKey = getNextIndexedKey();<a name="line.661"></a>
-<span class="sourceLineNo">662</span>      if (nextIndexedKey != null &amp;&amp; nextIndexedKey != KeyValueScanner.NO_NEXT_INDEXED_KEY<a name="line.662"></a>
-<span class="sourceLineNo">663</span>          &amp;&amp; matcher.compareKeyForNextColumn(nextIndexedKey, cell) &gt;= 0) {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>        return qcode == MatchCode.SEEK_NEXT_COL ? MatchCode.SKIP : MatchCode.INCLUDE;<a name="line.664"></a>
-<span class="sourceLineNo">665</span>      }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>      break;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    case INCLUDE_AND_SEEK_NEXT_ROW:<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    case SEEK_NEXT_ROW:<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>      Cell nextIndexedKey = getNextIndexedKey();<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      if (nextIndexedKey != null &amp;&amp; nextIndexedKey != KeyValueScanner.NO_NEXT_INDEXED_KEY<a name="line.672"></a>
-<span class="sourceLineNo">673</span>          &amp;&amp; matcher.compareKeyForNextRow(nextIndexedKey, cell) &gt;= 0) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>        return qcode == MatchCode.SEEK_NEXT_ROW ? MatchCode.SKIP : MatchCode.INCLUDE;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      }<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      break;<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    }<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    default:<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      break;<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    }<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    return qcode;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  }<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>  // Implementation of ChangedReadersObserver<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  @Override<a name="line.685"></a>
-<span class="sourceLineNo">686</span>  public void updateReaders(List&lt;StoreFile&gt; sfs) throws IOException {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    flushed = true;<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    flushLock.lock();<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    try {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      flushedStoreFiles.addAll(sfs);<a name="line.690"></a>
-<span class="sourceLineNo">691</span>    } finally {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      flushLock.unlock();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    }<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    // Let the next() call handle re-creating and seeking<a name="line.694"></a>
-<span class="sourceLineNo">695</span>  }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>  /**<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * @param flushed indicates if there was a flush<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @return true if top of heap has changed (and KeyValueHeap has to try the<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   *         next KV)<a name="line.700"></a>
-<span class="sourceLineNo">701</span>   * @throws IOException<a name="line.701"></a>
-<span class="sourceLineNo">702</span>   */<a name="line.702"></a>
-<span class="sourceLineNo">703</span>  protected boolean checkReseek(boolean flushed) throws IOException {<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    if (flushed &amp;&amp; this.lastTop != null) {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      resetScannerStack(this.lastTop);<a name="line.705"></a>
-<span class="sourceLineNo">706</span>      if (this.heap.peek() == null<a name="line.706"></a>
-<span class="sourceLineNo">707</span>          || store.getComparator().compareRows(this.lastTop, this.heap.peek()) != 0) {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        LOG.debug("Storescanner.peek() is changed where before = "<a name="line.708"></a>
-<span class="sourceLineNo">709</span>            + this.lastTop.toString() + ",and after = " + this.heap.peek());<a name="line.709"></a>
-<span class="sourceLineNo">710</span>        this.lastTop = null;<a name="line.710"></a>
-<span class="sourceLineNo">711</span>        return true;<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      }<a name="line.712"></a>
-<span class="sourceLineNo">713</span>      this.lastTop = null; // gone!<a name="line.713"></a>
-<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    // else dont need to reseek<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    return false;<a name="line.716"></a>
-<span class="sourceLineNo">717</span>  }<a name="line.717"></a>
-<span class="sourceLineNo">718</span><a name="line.718"></a>
-<span class="sourceLineNo">719</span>  protected void resetScannerStack(Cell lastTopKey) throws IOException {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    /* When we have the scan object, should we not pass it to getScanners()<a name="line.720"></a>
-<span class="sourceLineNo">721</span>     * to get a limited set of scanners? We did so in the constructor and we<a name="line.721"></a>
-<span class="sourceLineNo">722</span>     * could have done it now by storing the scan object from the constructor<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>    final boolean isCompaction = false;<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    boolean usePread = get || scanUsePread;<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    List&lt;KeyValueScanner&gt; scanners = null;<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    try {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      flushLock.lock();<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      scanners = selectScannersFrom(store.getScanners(flushedStoreFiles, cacheBlocks, get, usePread,<a name="line.730"></a>
-<span class="sourceLineNo">731</span>        isCompaction, matcher, scan.getStartRow(), scan.getStopRow(), this.readPt, true));<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      // Clear the current set of flushed store files so that they don't get added again<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      flushedStoreFiles.clear();<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    } finally {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      flushLock.unlock();<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>    // Seek the new scanners to the last key<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    seekScanners(scanners, lastTopKey, false, parallelSeekEnabled);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    // remove the older memstore scanner<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    for (int i = 0; i &lt; currentScanners.size(); i++) {<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      if (!currentScanners.get(i).isFileScanner()) {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>        currentScanners.remove(i);<a name="line.743"></a>
-<span class="sourceLineNo">744</span>        break;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      }<a name="line.745"></a>
-<span class="sourceLineNo">746</span>    }<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    // add the newly created scanners on the flushed files and the current active memstore scanner<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    addCurrentScanners(scanners);<a name="line.748"></a>
-<span class="sourceLineNo">749</span>    // Combine all seeked scanners with a heap<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    resetKVHeap(this.currentScanners, store.getComparator());<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    // Reset the state of the Query Matcher and set to top row.<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    // Only reset and call setRow if the row changes; avoids confusing the<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    // query matcher if scanning intra-row.<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    Cell cell = heap.peek();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    if (cell == null) {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      cell = lastTopKey;<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    }<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    if ((matcher.curCell == null) || !CellUtil.matchingRows(cell, matcher.curCell)) {<a name="line.758"></a>
-<span class="sourceLineNo">759</span>      this.countPerRow = 0;<a name="line.759"></a>
-<span class="sourceLineNo">760</span>      // The setToNewRow will call reset internally<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      matcher.setToNewRow(cell);<a name="line.761"></a>
-<span class="sourceLineNo">762</span>    }<a name="line.762"></a>
-<span class="sourceLineNo">763</span>  }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>  /**<a name="line.765"></a>
-<span class="sourceLineNo">766</span>   * Check whether scan as expected order<a name="line.766"></a>
-<span class="sourceLineNo">767</span>   * @param prevKV<a name="line.767"></a>
-<span class="sourceLineNo">768</span>   * @param kv<a name="line.768"></a>
-<span class="sourceLineNo">769</span>   * @param comparator<a name="line.769"></a>
-<span class="sourceLineNo">770</span>   * @throws IOException<a name="line.770"></a>
-<span class="sourceLineNo">771</span>   */<a name="line.771"></a>
-<span class="sourceLineNo">772</span>  protected void checkScanOrder(Cell prevKV, Cell kv,<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      CellComparator comparator) throws IOException {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    // Check that the heap gives us KVs in an increasing order.<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    assert prevKV == null || comparator == null<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        || comparator.compare(prevKV, kv) &lt;= 0 : "Key " + prevKV<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        + " followed by a " + "smaller key " + kv + " in cf " + store;<a name="line.777"></a>
+<span class="sourceLineNo">603</span>        // Optimization for Gets! If DONE, no more to get on this row, early exit!<a name="line.603"></a>
+<span class="sourceLineNo">604</span>        if (this.scan.isGetScan()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>          // Then no more to this row... exit.<a name="line.605"></a>
+<span class="sourceLineNo">606</span>          close(false);// Do all cleanup except heap.close()<a name="line.606"></a>
+<span class="sourceLineNo">607</span>          return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        }<a name="line.608"></a>
+<span class="sourceLineNo">609</span>        matcher.curCell = null;<a name="line.609"></a>
+<span class="sourceLineNo">610</span>        return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.610"></a>
+<span class="sourceLineNo">611</span><a name="line.611"></a>
+<span class="sourceLineNo">612</span>      case DONE_SCAN:<a name="line.612"></a>
+<span class="sourceLineNo">613</span>        close(false);// Do all cleanup except heap.close()<a name="line.613"></a>
+<span class="sourceLineNo">614</span>        return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.614"></a>
+<span class="sourceLineNo">615</span><a name="line.615"></a>
+<span class="sourceLineNo">616</span>      case SEEK_NEXT_ROW:<a name="line.616"></a>
+<span class="sourceLineNo">617</span>        // This is just a relatively simple end of scan fix, to short-cut end<a name="line.617"></a>
+<span class="sourceLineNo">618</span>        // us if there is an endKey in the scan.<a name="line.618"></a>
+<span class="sourceLineNo">619</span>        if (!matcher.moreRowsMayExistAfter(cell)) {<a name="line.619"></a>
+<span class="sourceLineNo">620</span>          close(false);// Do all cleanup except heap.close()<a name="line.620"></a>
+<span class="sourceLineNo">621</span>          return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.621"></a>
+<span class="sourceLineNo">622</span>        }<a name="line.622"></a>
+<span class="sourceLineNo">623</span>        matcher.curCell = null;<a name="line.623"></a>
+<span class="sourceLineNo">624</span>        seekToNextRow(cell);<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>      case SEEK_NEXT_COL:<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        seekAsDirection(matcher.getKeyForNextColumn(cell));<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        break;<a name="line.629"></a>
+<span class="sourceLineNo">630</span><a name="line.630"></a>
+<span class="sourceLineNo">631</span>      case SKIP:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        this.heap.next();<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        break;<a name="line.633"></a>
+<span class="sourceLineNo">634</span><a name="line.634"></a>
+<span class="sourceLineNo">635</span>      case SEEK_NEXT_USING_HINT:<a name="line.635"></a>
+<span class="sourceLineNo">636</span>        Cell nextKV = matcher.getNextKeyHint(cell);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>        if (nextKV != null) {<a name="line.637"></a>
+<span class="sourceLineNo">638</span>          seekAsDirection(nextKV);<a name="line.638"></a>
+<span class="sourceLineNo">639</span>        } else {<a name="line.639"></a>
+<span class="sourceLineNo">640</span>          heap.next();<a name="line.640"></a>
+<span class="sourceLineNo">641</span>        }<a name="line.641"></a>
+<span class="sourceLineNo">642</span>        break;<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>      default:<a name="line.644"></a>
+<span class="sourceLineNo">645</span>        throw new RuntimeException("UNEXPECTED");<a name="line.645"></a>
+<span class="sourceLineNo">646</span>      }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    } while ((cell = this.heap.peek()) != null);<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    if (count &gt; 0) {<a name="line.649"></a>
+<span class="sourceLineNo">650</span>      return scannerContext.setScannerState(NextState.MORE_VALUES).hasMoreValues();<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    }<a name="line.651"></a>
+<span class="sourceLineNo">652</span><a name="line.652"></a>
+<span class="sourceLineNo">653</span>    // No more keys<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    close(false);// Do all cleanup except heap.close()<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    return scannerContext.setScannerState(NextState.NO_MORE_VALUES).hasMoreValues();<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  /**<a name="line.658"></a>
+<span class="sourceLineNo">659</span>   * See if we should actually SEEK or rather just SKIP to the next Cell (see HBASE-13109).<a name="line.659"></a>
+<span class="sourceLineNo">660</span>   * This method works together with ColumnTrackers and Filters. ColumnTrackers may issue SEEK<a name="line.660"></a>
+<span class="sourceLineNo">661</span>   * hints, such as seek to next column, next row, or seek to an arbitrary seek key.<a name="line.661"></a>
+<span class="sourceLineNo">662</span>   * This method intercepts these qcodes and decides whether a seek is the most efficient _actual_<a name="line.662"></a>
+<span class="sourceLineNo">663</span>   * way to get us to the requested cell (SEEKs are more expensive than SKIP, SKIP, SKIP inside the<a name="line.663"></a>
+<span class="sourceLineNo">664</span>   * current, loaded block).<a name="line.664"></a>
+<span class="sourceLineNo">665</span>   * It does this by looking at the next indexed key of the current HFile. This key<a name="line.665"></a>
+<span class="sourceLineNo">666</span>   * is then compared with the _SEEK_ key, where a SEEK key is an artificial 'last possible key<a name="line.666"></a>
+<span class="sourceLineNo">667</span>   * on the row' (only in here, we avoid actually creating a SEEK key; in the compare we work with<a name="line.667"></a>
+<span class="sourceLineNo">668</span>   * the current Cell but compare as though it were a seek key; see down in<a name="line.668"></a>
+<span class="sourceLineNo">669</span>   * matcher.compareKeyForNextRow, etc). If the compare gets us onto the<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   * next block we *_SEEK, otherwise we just INCLUDE or SKIP, and let the ColumnTrackers or Filters<a name="line.670"></a>
+<span class="sourceLineNo">671</span>   * go through the next Cell, and so on)<a name="line.671"></a>
+<span class="sourceLineNo">672</span>   *<a name="line.672"></a>
+<span class="sourceLineNo">673</span>   * &lt;p&gt;The ColumnTrackers and Filters must behave correctly in all cases, i.e. if they are past the<a name="line.673"></a>
+<span class="sourceLineNo">674</span>   * Cells they care about they must issues a SKIP or SEEK.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>   *<a name="line.675"></a>
+<span class="sourceLineNo">676</span>   * &lt;p&gt;Other notes:<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   * &lt;ul&gt;<a name="line.677"></a>
+<span class="sourceLineNo">678</span>   * &lt;li&gt;Rows can straddle block boundaries&lt;/li&gt;<a name="line.678"></a>
+<span class="sourceLineNo">679</span>   * &lt;li&gt;Versions of columns can straddle block boundaries (i.e. column C1 at T1 might be in a<a name="line.679"></a>
+<span class="sourceLineNo">680</span>   * different block than column C1 at T2)&lt;/li&gt;<a name="line.680"></a>
+<span class="sourceLineNo">681</span>   * &lt;li&gt;We want to SKIP and INCLUDE if the chance is high that we'll find the desired Cell after a<a name="line.681"></a>
+<span class="sourceLineNo">682</span>   * few SKIPs...&lt;/li&gt;<a name="line.682"></a>
+<span class="sourceLineNo">683</span>   * &lt;li&gt;We want to INCLUDE_AND_SEEK and SEEK when the chance is high that we'll be able to seek<a name="line.683"></a>
+<span class="sourceLineNo">684</span>   * past many Cells, especially if we know we need to go to the next block.&lt;/li&gt;<a name="line.684"></a>
+<span class="sourceLineNo">685</span>   * &lt;/ul&gt;<a name="line.685"></a>
+<span class="sourceLineNo">686</span>   * &lt;p&gt;A good proxy (best effort) to determine whether INCLUDE/SKIP is better than SEEK is whether<a name="line.686"></a>
+<span class="sourceLineNo">687</span>   * we'll likely end up seeking to the next block (or past the next block) to get our next column.<a name="line.687"></a>
+<span class="sourceLineNo">688</span>   * Example:<a name="line.688"></a>
+<span class="sourceLineNo">689</span>   * &lt;pre&gt;<a name="line.689"></a>
+<span class="sourceLineNo">690</span>   * |    BLOCK 1              |     BLOCK 2                   |<a name="line.690"></a>
+<span class="sourceLineNo">691</span>   * |  r1/c1, r1/c2, r1/c3    |    r1/c4, r1/c5, r2/c1        |<a name="line.691"></a>
+<span class="sourceLineNo">692</span>   *                                   ^         ^<a name="line.692"></a>
+<span class="sourceLineNo">693</span>   *                                   |         |<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   *                           Next Index Key   SEEK_NEXT_ROW (before r2/c1)<a name="line.694"></a>
+<span class="sourceLineNo">695</span>   *<a name="line.695"></a>
+<span class="sourceLineNo">696</span>   *<a name="line.696"></a>
+<span class="sourceLineNo">697</span>   * |    BLOCK 1                       |     BLOCK 2                      |<a name="line.697"></a>
+<span class="sourceLineNo">698</span>   * |  r1/c1/t5, r1/c1/t4, r1/c1/t3    |    r1/c1/t2, r1/c1/T1, r1/c2/T3  |<a name="line.698"></a>
+<span class="sourceLineNo">699</span>   *                                            ^              ^<a name="line.699"></a>
+<span class="sourceLineNo">700</span>   *                                            |              |<a name="line.700"></a>
+<span class="sourceLineNo">701</span>   *                                    Next Index Key        SEEK_NEXT_COL<a name="line.701"></a>
+<span class="sourceLineNo">702</span>   * &lt;/pre&gt;<a name="line.702"></a>
+<span class="sourceLineNo">703</span>   * Now imagine we want columns c1 and c3 (see first diagram above), the 'Next Index Key' of r1/c4<a name="line.703"></a>
+<span class="sourceLineNo">704</span>   * is &gt; r1/c3 so we should seek to get to the c1 on the next row, r2. In second case, say we only<a name="line.704"></a>
+<span class="sourceLineNo">705</span>   * want one version of c1, after we have it, a SEEK_COL will be issued to get to c2. Looking at<a name="line.705"></a>
+<span class="sourceLineNo">706</span>   * the 'Next Index Key', it would land us in the next block, so we should SEEK. In other scenarios<a name="line.706"></a>
+<span class="sourceLineNo">707</span>   * where the SEEK will not land us in the next block, it is very likely better to issues a series<a name="line.707"></a>
+<span class="sourceLineNo">708</span>   * of SKIPs.<a name="line.708"></a>
+<span class="sourceLineNo">709</span>   */<a name="line.709"></a>
+<span class="sourceLineNo">710</span>  @VisibleForTesting<a name="line.710"></a>
+<span class="sourceLineNo">711</span>  protected ScanQueryMatcher.MatchCode optimize(ScanQueryMatcher.MatchCode qcode, Cell cell) {<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    switch(qcode) {<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    case INCLUDE_AND_SEEK_NEXT_COL:<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    case SEEK_NEXT_COL:<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      Cell nextIndexedKey = getNextIndexedKey();<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      if (nextIndexedKey != null &amp;&amp; nextIndexedKey != KeyValueScanner.NO_NEXT_INDEXED_KEY<a name="line.717"></a>
+<span class="sourceLineNo">718</span>          &amp;&amp; matcher.compareKeyForNextColumn(nextIndexedKey, cell) &gt;= 0) {<a name="line.718"></a>
+<span class="sourceLineNo">719</span>        return qcode == MatchCode.SEEK_NEXT_COL ? MatchCode.SKIP : MatchCode.INCLUDE;<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      }<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      break;<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    }<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    case INCLUDE_AND_SEEK_NEXT_ROW:<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    case SEEK_NEXT_ROW:<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    {<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      // If it is a Get Scan, then we know that we are done with this row; there are no more<a name="line.726"></a>
+<span class="sourceLineNo">727</span>      // rows beyond the current one: don't try to optimize. We are DONE. Return the *_NEXT_ROW<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      // qcode as is. When the caller gets these flags on a Get Scan, it knows it can shut down the<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      // Scan.<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      if (!this.scan.isGetScan()) {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>        Cell nextIndexedKey = getNextIndexedKey();<a name="line.731"></a>
+<span class="sourceLineNo">732</span>        if (nextIndexedKey != null &amp;&amp; nextIndexedKey != KeyValueScanner.NO_NEXT_INDEXED_KEY<a name="line.732"></a>
+<span class="sourceLineNo">733</span>            &amp;&amp; matcher.compareKeyForNextRow(nextIndexedKey, cell) &gt; 0) {<a name="line.733"></a>
+<span class="sourceLineNo">734</span>          return qcode == MatchCode.SEEK_NEXT_ROW ? MatchCode.SKIP : MatchCode.INCLUDE;<a name="line.734"></a>
+<span class="sourceLineNo">735</span>        }<a name="line.735"></a>
+<span class="sourceLineNo">736</span>      }<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      break;<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    }<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    default:<a name="line.739"></a>
+<span class="sourceLineNo">740</span>      break;<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    }<a name="line.741"></a>
+<span class="sourceLineNo">742</span>    return qcode;<a name="line.742"></a>
+<span class="sourceLineNo">743</span>  }<a name="line.743"></a>
+<span class="sourceLineNo">744</span><a name="line.744"></a>
+<span class="sourceLineNo">745</span>  // Implementation of ChangedReadersObserver<a name="line.745"></a>
+<span class="sourceLineNo">746</span>  @Override<a name="line.746"></a>
+<span class="sourceLineNo">747</span>  public void updateReaders(List&lt;StoreFile&gt; sfs) throws IOException {<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    flushed = true;<a name="line.748"></a>
+<span class="sourceLineNo">749</span>    flushLock.lock();<a name="line.749"></a>
+<span class="sourceLineNo">750</span>    try {<a name="line.750"></a>
+<span class="sourceLineNo">751</span>      flushedStoreFiles.addAll(sfs);<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    } finally {<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      flushLock.unlock();<a name="line.753"></a>
+<span class="sourceLineNo">754</span>    }<a name="line.754"></a>
+<span class="sourceLineNo">755</span>    // Let the next() call handle re-creating and seeking<a name="line.755"></a>
+<span class="sourceLineNo">756</span>  }<a name="line.756"></a>
+<span class="sourceLineNo">757</span><a name="line.757"></a>
+<span class="sourceLineNo">758</span>  /**<a name="line.758"></a>
+<span class="sourceLineNo">759</span>   * @param flushed indicates if there was a flush<a name="line.759"></a>
+<span class="sourceLineNo">760</span>   * @return true if top of heap has changed (and KeyValueHeap has to try the<a name="line.760"></a>
+<span class="sourceLineNo">761</span>   *         next KV)<a name="line.761"></a>
+<span class="sourceLineNo">762</span>   * @throws IOException<a name="line.762"></a>
+<span class="sourceLineNo">763</span>   */<a name="line.763"></a>
+<span class="sourceLineNo">764</span>  protected boolean checkReseek(boolean flushed) throws IOException {<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    if (flushed &amp;&amp; this.lastTop != null) {<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      resetScannerStack(this.lastTop);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      if (this.heap.peek() == null<a name="line.767"></a>
+<span class="sourceLineNo">768</span>          || store.getComparator().compareRows(this.lastTop, this.heap.peek()) != 0) {<a name="line.768"></a>
+<span class="sourceLineNo">769</span>        LOG.debug("Storescanner.peek() is changed where before = "<a name="line.769"></a>
+<span class="sourceLineNo">770</span>            + this.lastTop.toString() + ",and after = " + this.heap.peek());<a name="line.770"></a>
+<span class="sourceLineNo">771</span>        this.lastTop = null;<a name="line.771"></a>
+<span class="sourceLineNo">772</span>        return true;<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      }<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      this.lastTop = null; // gone!<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    }<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    // else dont need to reseek<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    return false;<a name="line.777"></a>
 <span class="sourceLineNo">778</span>  }<a name="line.778"></a>
 <span class="sourceLineNo">779</span><a name="line.779"></a>
-<span class="sourceLineNo">780</span>  protected boolean seekToNextRow(Cell c) throws IOException {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    return reseek(CellUtil.createLastOnRow(c));<a name="line.781"></a>
-<span class="sourceLineNo">782</span>  }<a name="line.782"></a>
-<span class="sourceLineNo">783</span><a name="line.783"></a>
-<span class="sourceLineNo">784</span>  /**<a name="line.784"></a>
-<span class="sourceLineNo">785</span>   * Do a reseek in a normal StoreScanner(scan forward)<a name="line.785"></a>
-<span class="sourceLineNo">786</span>   * @param kv<a name="line.786"></a>
-<span class="sourceLineNo">787</span>   * @return true if scanner has values left, false if end of scanner<a name="line.787"></a>
-<span class="sourceLineNo">788</span>   * @throws IOException<a name="line.788"></a>
-<span class="sourceLineNo">789</span>   */<a name="line.789"></a>
-<span class="sourceLineNo">790</span>  protected boolean seekAsDirection(Cell kv)<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      throws IOException {<a name="line.791"></a>
-<span class="sourceLineNo">792</span>    return reseek(kv);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>  }<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>  @Override<a name="line.795"></a>
-<span class="sourceLineNo">796</span>  public boolean reseek(Cell kv) throws IOException {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    boolean flushed = checkFlushed();<a name="line.797"></a>
-<span class="sourceLineNo">798</span>    // Heap will not be null, if this is called from next() which.<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    // If called from RegionScanner.reseek(...) make sure the scanner<a name="line.799"></a>
-<span class="sourceLineNo">800</span>    // stack is reset if needed.<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    checkReseek(flushed);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    if (explicitColumnQuery &amp;&amp; lazySeekEnabledGlobally) {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      return heap.requestSeek(kv, true, useRowColBloom);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    return heap.reseek(kv);<a name="line.805"></a>
-<span class="sourceLineNo">806</span>  }<a name="line.806"></a>
-<span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>  protected boolean checkFlushed() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    // check the var without any lock. Suppose even if we see the old<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    // value here still it is ok to continue because we will not be resetting<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    // the heap but will continue with the referenced memstore's snapshot. For compactions<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    // any way we don't need the updateReaders at all to happen as we still continue with <a name="line.812"></a>
-<span class="sourceLineNo">813</span>    // the older files<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    if (flushed) {<a name="line.814"></a>
-<span class="sourceLineNo">815</span>      // If there is a flush and the current scan is notified on the flush ensure that the <a name="line.815"></a>
-<span class="sourceLineNo">816</span>      // scan's heap gets reset and we do a seek on the newly flushed file.<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      if(!this.closing) {<a name="line.817"></a>
-<span class="sourceLineNo">818</span>        this.lastTop = this.peek();<a name="line.818"></a>
-<span class="sourceLineNo">819</span>      } else {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>        return false;<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      }<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      // reset the flag<a name="line.822"></a>
-<span class="sourceLineNo">823</span>      flushed = false;<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      return true;<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    }<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return false;<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>  @Override<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  public long getSequenceID() {<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    return 0;<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>  /**<a name="line.834"></a>
-<span class="sourceLineNo">835</span>   * Seek storefiles in parallel to optimize IO latency as much as possible<a name="line.835"></a>
-<span class="sourceLineNo">836</span>   * @param scanners the list {@link KeyValueScanner}s to be read from<a name="line.836"></a>
-<span class="sourceLineNo">837</span>   * @param kv the KeyValue on which the operation is being requested<a name="line.837"></a>
-<span class="sourceLineNo">838</span>   * @throws IOException<a name="line.838"></a>
-<span class="sourceLineNo">839</span>   */<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  private void parallelSeek(final List&lt;? extends KeyValueScanner&gt;<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      scanners, final Cell kv) throws IOException {<a name="line.841"></a>
-<span class="sourceLineNo">842</span>    if (scanners.isEmpty()) return;<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    int storeFileScannerCount = scanners.size();<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    CountDownLatch latch = new CountDownLatch(storeFileScannerCount);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    List&lt;ParallelSeekHandler&gt; handlers = <a name="line.845"></a>
-<span class="sourceLineNo">846</span>        new ArrayList&lt;ParallelSeekHandler&gt;(storeFileScannerCount);<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    for (KeyValueScanner scanner : scanners) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>      if (scanner instanceof StoreFileScanner) {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>        ParallelSeekHandler seekHandler = new ParallelSeekHandler(scanner, kv,<a name="line.849"></a>
-<span class="sourceLineNo">850</span>          this.readPt, latch);<a name="line.850"></a>
-<span class="sourceLineNo">851</span>        executor.submit(seekHandler);<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        handlers.add(seekHandler);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>      } else {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>        scanner.seek(kv);<a name="line.854"></a>
-<span class="sourceLineNo">855</span>        latch.countDown();<a name="line.855"></a>
-<span class="sourceLineNo">856</span>      }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    }<a name="line.857"></a>
-<span class="sourceLineNo">858</span><a name="line.858"></a>
-<span class="sourceLineNo">859</span>    try {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      latch.await();<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    } catch (InterruptedException ie) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>      throw (InterruptedIOException)new InterruptedIOException().initCause(ie);<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    }<a name="line.863"></a>
-<span class="sourceLineNo">864</span><a name="line.864"></a>
-<span class="sourceLineNo">865</span>    for (ParallelSeekHandler handler : handlers) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>      if (handler.getErr() != null) {<a name="line.866"></a>
-<span class="sourceLineNo">867</span>        throw new IOException(handler.getErr());<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>  }<a name="line.870"></a>
-<span class="sourceLineNo">871</span><a name="line.871"></a>
-<span class="sourceLineNo">872</span>  /**<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * Used in testing.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * @return all scanners in no particular order<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   */<a name="line.875"></a>
-<span class="sourceLineNo">876</span>  List&lt;KeyValueScanner&gt; getAllScannersForTesting() {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    List&lt;KeyValueScanner&gt; allScanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    KeyValueScanner current = heap.getCurrentForTesting();<a name="line.878"></a>
-<span class="sourceLineNo">879</span>    if (current != null)<a name="line.879"></a>
-<span class="sourceLineNo">880</span>      allScanners.add(current);<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    for (KeyValueScanner scanner : heap.getHeap())<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      allScanners.add(scanner);<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    return allScanners;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>  }<a name="line.884"></a>
-<span class="sourceLineNo">885</span><a name="line.885"></a>
-<span class="sourceLineNo">886</span>  static void enableLazySeekGlobally(boolean enable) {<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    lazySeekEnabledGlobally = enable;<a name="line.887"></a>
+<span class="sourceLineNo">780</span>  protected void resetScannerStack(Cell lastTopKey) throws IOException {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    /* When we have the scan object, should we not pass it to getScanners()<a name="line.781"></a>
+<span class="sourceLineNo">782</span>     * to get a limited set of scanners? We did so in the constructor and we<a name="line.782"></a>
+<span class="sourceLineNo">783</span>     * could have done it now by storing the scan object from the constructor<a name="line.783"></a>
+<span class="sourceLineNo">784</span>     */<a name="line.784"></a>
+<span class="sourceLineNo">785</span><a name="line.785"></a>
+<span class="sourceLineNo">786</span>    final boolean isCompaction = false;<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    boolean usePread = get || scanUsePread;<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    List&lt;KeyValueScanner&gt; scanners = null;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    try {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>      flushLock.lock();<a name="line.790"></a>
+<span class="sourceLineNo">791</span>      scanners = selectScannersFrom(store.getScanners(flushedStoreFiles, cacheBlocks, get, usePread,<a name="line.791"></a>
+<span class="sourceLineNo">792</span>        isCompaction, matcher, scan.getStartRow(), scan.getStopRow(), this.readPt, true));<a name="line.792"></a>
+<span class="sourceLineNo">793</span>      // Clear the current set of flushed store files so that they don't get added again<a name="line.793"></a>
+<span class="sourceLineNo">794</span>      flushedStoreFiles.clear();<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    } finally {<a name="line.795"></a>
+<span class="sourceLineNo">796</span>      flushLock.unlock();<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    }<a name="line.797"></a>
+<span class="sourceLineNo">798</span><a name="line.798"></a>
+<span class="sourceLineNo">799</span>    // Seek the new scanners to the last key<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    seekScanners(scanners, lastTopKey, false, parallelSeekEnabled);<a name="line.800"></a>
+<span class="sourceLineNo">801</span>    // remove the older memstore scanner<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    for (int i = 0; i &lt; currentScanners.size(); i++) {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      if (!currentScanners.get(i).isFileScanner()) {<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        currentScanners.remove(i);<a name="line.804"></a>
+<span class="sourceLineNo">805</span>        break;<a name="line.805"></a>
+<span class="sourceLineNo">806</span>      }<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    }<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    // add the newly created scanners on the flushed files and the current active memstore scanner<a name="line.808"></a>
+<span class="sourceLineNo">809</span>    addCurrentScanners(scanners);<a name="line.809"></a>
+<span class="sourceLineNo">810</span>    // Combine all seeked scanners with a heap<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    resetKVHeap(this.currentScanners, store.getComparator());<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    // Reset the state of the Query Matcher and set to top row.<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    // Only reset and call setRow if the row changes; avoids confusing the<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    // query matcher if scanning intra-row.<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    Cell cell = heap.peek();<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    if (cell == null) {<a name="line.816"></a>
+<span class="sourceLineNo">817</span>      cell = lastTopKey;<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    }<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    if ((matcher.curCell == null) || !CellUtil.matchingRows(cell, matcher.curCell)) {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>      this.countPerRow = 0;<a name="line.820"></a>
+<span class="sourceLineNo">821</span>      // The setToNewRow will call reset internally<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      matcher.setToNewRow(cell);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    }<a name="line.823"></a>
+<span class="sourceLineNo">824</span>  }<a name="line.824"></a>
+<span class="sourceLineNo">825</span><a name="line.825"></a>
+<span class="sourceLineNo">826</span>  /**<a name="line.826"></a>
+<span class="sourceLineNo">827</span>   * Check whether scan as expected order<a name="line.827"></a>
+<span class="sourceLineNo">828</span>   * @param prevKV<a name="line.828"></a>
+<span class="sourceLineNo">829</span>   * @param kv<a name="line.829"></a>
+<span class="sourceLineNo">830</span>   * @param comparator<a name="line.830"></a>
+<span class="sourceLineNo">831</span>   * @throws IOException<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   */<a name="line.832"></a>
+<span class="sourceLineNo">833</span>  protected void checkScanOrder(Cell prevKV, Cell kv,<a name="line.833"></a>
+<span class="sourceLineNo">834</span>      CellComparator comparator) throws IOException {<a name="line.834"></a>
+<span class="sourceLineNo">835</span>    // Check that the heap gives us KVs in an increasing order.<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    assert prevKV == null || comparator == null<a name="line.836"></a>
+<span class="sourceLineNo">837</span>        || comparator.compare(prevKV, kv) &lt;= 0 : "Key " + prevKV<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        + " followed by a " + "smaller key " + kv + " in cf " + store;<a name="line.838"></a>
+<span class="sourceLineNo">839</span>  }<a name="line.839"></a>
+<span class="sourceLineNo">840</span><a name="line.840"></a>
+<span class="sourceLineNo">841</span>  protected boolean seekToNextRow(Cell c) throws IOException {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    return reseek(CellUtil.createLastOnRow(c));<a name="line.842"></a>
+<span class="sourceLineNo">843</span>  }<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>   * Do a reseek in a normal StoreScanner(scan forward)<a name="line.846"></a>
+<span class="sourceLineNo">847</span>   * @param kv<a name="line.847"></a>
+<span class="sourceLineNo">848</span>   * @return true if scanner has values left, false if end of scanner<a name="line.848"></a>
+<span class="sourceLineNo">849</span>   * @throws IOException<a name="line.849"></a>
+<span class="sourceLineNo">850</span>   */<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  protected boolean seekAsDirection(Cell kv)<a name="line.851"></a>
+<span class="sourceLineNo">852</span>      throws IOException {<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    return reseek(kv);<a name="line.853"></a>
+<span class="sourceLineNo">854</span>  }<a name="line.854"></a>
+<span class="sourceLineNo">855</span><a name="line.855"></a>
+<span class="sourceLineNo">856</span>  @Override<a name="line.856"></a>
+<span class="sourceLineNo">857</span>  public boolean reseek(Cell kv) throws IOException {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    boolean flushed = checkFlushed();<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    // Heap will not be null, if this is called from next() which.<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    // If called from RegionScanner.reseek(...) make sure the scanner<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    // stack is reset if needed.<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    checkReseek(flushed);<a name="line.862"></a>
+<span class="sourceLineNo">863</span>    if (explicitColumnQuery &amp;&amp; lazySeekEnabledGlobally) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      return heap.requestSeek(kv, true, useRowColBloom);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    }<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    return heap.reseek(kv);<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>  protected boolean checkFlushed() {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    // check the var without any lock. Suppose even if we see the old<a name="line.870"></a>
+<span class="sourceLineNo">871</span>    // value here still it is ok to continue because we will not be resetting<a name="line.871"></a>
+<span class="sourceLineNo">872</span>    // the heap but will continue with the referenced memstore's snapshot. For compactions<a name="line.872"></a>
+<span class="sourceLineNo">873</span>    // any way we don't need the updateReaders at all to happen as we still continue with<a name="line.873"></a>
+<span class="sourceLineNo">874</span>    // the older files<a name="line.874"></a>
+<span class="sourceLineNo">875</span>    if (flushed) {<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      // If there is a flush and the current scan is notified on the flush ensure that the<a name="line.876"></a>
+<span class="sourceLineNo">877</span>      // scan's heap gets reset and we do a seek on the newly flushed file.<a name="line.877"></a>
+<span class="sourceLineNo">878</span>      if(!this.closing) {<a name="line.878"></a>
+<span class="sourceLineNo">879</span>        this.lastTop = this.peek();<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      } else {<a name="line.880"></a>
+<span class="sourceLineNo">881</span>        return false;<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      }<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      // reset the flag<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      flushed = false;<a name="line.884"></a>
+<span class="sourceLineNo">885</span>      return true;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    }<a name="line.886"></a>
+<span class="sourceLineNo">887</span>    return false;<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>   * @return The estimated number of KVs seen by this scanner (includes some skipped KVs).<a name="line.891"></a>
-<span class="sourceLineNo">892</span>   */<a name="line.892"></a>
-<span class="sourceLineNo">893</span>  public long getEstimatedNumberOfKvsScanned() {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    return this.kvsScanned;<a name="line.894"></a>
-<span class="sourceLineNo">895</span>  }<a name="line.895"></a>
-<span class="sourceLineNo">896</span><a name="line.896"></a>
-<span class="sourceLineNo">897</span>  @Override<a name="line.897"></a>
-<span class="sourceLineNo">898</span>  public Cell getNextIndexedKey() {<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    return this.heap.getNextIndexedKey();<a name="line.899"></a>
-<span class="sourceLineNo">900</span>  }<a name="line.900"></a>
-<span class="sourceLineNo">901</span><a name="line.901"></a>
-<span class="sourceLineNo">902</span>  @Override<a name="line.902"></a>
-<span class="sourceLineNo">903</span>  public void shipped() throws IOException {<a name="line.903"></a>
-<span class="sourceLineNo">904</span>    for (KeyValueHeap h : this.heapsForDelayedClose) {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      h.close();// There wont be further fetch of Cells from these scanners. Just close.<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    }<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    this.heapsForDelayedClose.clear();<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    if (this.heap != null) {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      this.heap.shipped();<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    }<a name="line.910"></a>
-<span class="sourceLineNo">911</span>  }<a name="line.911"></a>
-<span class="sourceLineNo">912</span>}<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
+<span class="sourceLineNo">890</span>  @Override<a name="line.890"></a>
+<span class="sourceLineNo">891</span>  public long getSequenceID() {<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    return 0;<a name="line.892"></a>
+<span class="sourceLineNo">893</span>  }<a name="line.893"></a>
+<span class="sourceLineNo">894</span><a name="line.894"></a>
+<span class="sourceLineNo">895</span>  /**<a name="line.895"></a>
+<span class="sourceLineNo">896</span>   * Seek storefiles in parallel to optimize IO latency as much as possible<a name="line.896"></a>
+<span class="sourceLineNo">897</span>   * @param scanners the list {@link KeyValueScanner}s to be read from<a name="line.897"></a>
+<span class="sourceLineNo">898</span>   * @param kv the KeyValue on which the operation is being requested<a name="line.898"></a>
+<span class="sourceLineNo">899</span>   * @throws IOException<a name="line.899"></a>
+<span class="sourceLineNo">900</span>   */<a name="line.900"></a>
+<span class="sourceLineNo">901</span>  private void parallelSeek(final List&lt;? extends KeyValueScanner&gt;<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      scanners, final Cell kv) throws IOException {<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    if (scanners.isEmpty()) return;<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    int storeFileScannerCount = scanners.size();<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    CountDownLatch latch = new CountDownLatch(storeFileScannerCount);<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    List&lt;ParallelSeekHandler&gt; handlers =<a name="line.906"></a>
+<span class="sourceLineNo">907</span>        new ArrayList&lt;ParallelSeekHandler&gt;(storeFileScannerCount);<a name="line.907"></a>
+<span class="sourceLineNo">908</span>    for (KeyValueScanner scanner : scanners) {<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      if (scanner instanceof StoreFileScanner) {<a name="line.909"></a>
+<span class="sourceLineNo">910</span>        ParallelSeekHandler seekHandler = new ParallelSeekHandler(scanner, kv,<a name="line.910"></a>
+<span class="sourceLineNo">911</span>          this.readPt, latch);<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        executor.submit(seekHandler);<a name="line.912"></a>
+<span class="sourceLineNo">913</span>        handlers.add(seekHandler);<a name="line.913"></a>
+<span class="sourceLineNo">914</span>      } else {<a name="line.914"></a>
+<span class="sourceLineNo">915</span>        scanner.seek(kv);<a name="line.915"></a>
+<span class="sourceLineNo">916</span>        latch.countDown();<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      }<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>    try {<a name="line.920"></a>
+<span class="sourceLineNo">921</span>      latch.await();<a name="line.921"></a>
+<span class="sourceLineNo">922</span>    } catch (InterruptedException ie) {<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      throw (InterruptedIOException)new InterruptedIOException().initCause(ie);<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    }<a name="line.924"></a>
+<span class="sourceLineNo">925</span><a name="line.925"></a>
+<span class="sourceLineNo">926</span>    for (ParallelSeekHandler handler : handlers) {<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      if (handler.getErr() != null) {<a name="line.927"></a>
+<span class="sourceLineNo">928</span>        throw new IOException(handler.getErr());<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      }<a name="line.929"></a>
+<span class="sourceLineNo">930</span>    }<a name="line.930"></a>
+<span class="sourceLineNo">931</span>  }<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>  /**<a name="line.933"></a>
+<span class="sourceLineNo">934</span>   * Used in testing.<a name="line.934"></a>
+<span class="sourceLineNo">935</span>   * @return all scanners in no particular order<a name="line.935"></a>
+<span class="sourceLineNo">936</span>   */<a name="line.936"></a>
+<span class="sourceLineNo">937</span>  List&lt;KeyValueScanner&gt; getAllScannersForTesting() {<a name="line.937"></a>
+<span class="sourceLineNo">938</span>    List&lt;KeyValueScanner&gt; allScanners = new ArrayList&lt;KeyValueScanner&gt;();<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    KeyValueScanner current = heap.getCurrentForTesting();<a name="line.939"></a>
+<span class="sourceLineNo">940</span>    if (current != null)<a name="line.940"></a>
+<span class="sourceLineNo">941</span>      allScanners.add(current);<a name="line.941"></a>
+<span class="sourceLineNo">942</span>    for (KeyValueScanner scanner : heap.getHeap())<a name="line.942"></a>
+<span class="sourceLineNo">943</span>      allScanners.add(scanner);<a name="line.943"></a>
+<span class="sourceLineNo">944</span>    return allScanners;<a name="line.944"></a>
+<span class="sourceLineNo">945</span>  }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>  static void enableLazySeekGlobally(boolean enable) {<a name="line.947"></a>
+<span class="sourceLineNo">948</span>    lazySeekEnabledGlobally = enable;<a name="line.948"></a>
+<span class="sourceLineNo">949</span>  }<a name="line.949"></a>
+<span class="sourceLineNo">950</span><a name="line.950"></a>
+<span class="sourceLineNo">951</span>  /**<a name="line.951"></a>
+<span class="sourceLineNo">952</span>   * @return The estimated number of KVs seen by this scanner (includes some skipped KVs).<a name="line.952"></a>
+<span class="sourceLineNo">953</span>   */<a name="line.953"></a>
+<span class="sourceLineNo">954</span>  public long getEstimatedNumberOfKvsScanned() {<a name="line.954"></a>
+<span class="sourceLineNo">955</span>    return this.kvsScanned;<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>  @Override<a name="line.958"></a>
+<span class="sourceLineNo">959</span>  public Cell getNextIndexedKey() {<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    return this.heap.getNextIndexedKey();<a name="line.960"></a>
+<span class="sourceLineNo">961</span>  }<a name="line.961"></a>
+<span class="sourceLineNo">962</span><a name="line.962"></a>
+<span class="sourceLineNo">963</span>  @Override<a name="line.963"></a>
+<span class="sourceLineNo">964</span>  public void shipped() throws IOException {<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    for (KeyValueHeap h : this.heapsForDelayedClose) {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      h.close();// There wont be further fetch of Cells from these scanners. Just close.<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    }<a name="line.967"></a>
+<span class="sourceLineNo">968</span>    this.heapsForDelayedClose.clear();<a name="line.968"></a>
+<span class="sourceLineNo">969</span>    if (this.heap != null) {<a name="line.969"></a>
+<span class="sourceLineNo">970</span>      this.heap.shipped();<a name="line.970"></a>
+<span class="sourceLineNo">971</span>    }<a name="line.971"></a>
+<span class="sourceLineNo">972</span>  }<a name="line.972"></a>
+<span class="sourceLineNo">973</span>}<a name="line.973"></a>
+<span class="sourceLineNo">974</span><a name="line.974"></a>
 
 
 


[51/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.


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

Branch: refs/heads/asf-site
Commit: f30982bde33992c77f16eeeaf2023b6a150ce08c
Parents: 123539c
Author: jenkins <bu...@apache.org>
Authored: Thu Mar 24 15:29:37 2016 +0000
Committer: Misty Stanley-Jones <ms...@cloudera.com>
Committed: Thu Mar 24 08:53:51 2016 -0700

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                |     4 +-
 apache_hbase_reference_guide.pdfmarks           |     4 +-
 apidocs/index-all.html                          |     8 +
 .../org/apache/hadoop/hbase/class-use/Cell.html |    56 +-
 .../hadoop/hbase/filter/TimestampsFilter.html   |    82 +-
 .../hadoop/hbase/filter/TimestampsFilter.html   |   353 +-
 .../hadoop/hbase/snapshot/ExportSnapshot.html   |     4 +-
 .../hadoop/hbase/snapshot/SnapshotInfo.html     |     4 +-
 book.html                                       |     2 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       | 19724 +++++++++--------
 checkstyle.rss                                  |    10 +-
 coc.html                                        |     4 +-
 cygwin.html                                     |     4 +-
 dependencies.html                               |     4 +-
 dependency-convergence.html                     |     6 +-
 dependency-info.html                            |     4 +-
 dependency-management.html                      |     6 +-
 devapidocs/constant-values.html                 |     7 +
 devapidocs/index-all.html                       |    42 +-
 .../org/apache/hadoop/hbase/CellComparator.html |     2 +-
 .../org/apache/hadoop/hbase/class-use/Cell.html |    58 +-
 .../class-use/InterfaceAudience.Private.html    |     3 +-
 .../class-use/InterfaceStability.Unstable.html  |    12 +-
 .../hbase/classification/package-tree.html      |     6 +-
 .../AsyncProcess.AsyncRequestFutureImpl.html    |    32 +-
 .../hadoop/hbase/client/AsyncProcess.Retry.html |    12 +-
 .../hadoop/hbase/client/AsyncProcess.html       |    26 +-
 .../client/MetricsConnection.CallStats.html     |    28 +-
 .../client/MetricsConnection.CallTracker.html   |    18 +-
 .../client/MetricsConnection.NewMetric.html     |     4 +-
 .../client/MetricsConnection.RegionStats.html   |    12 +-
 .../client/MetricsConnection.RunnerStats.html   |    16 +-
 .../hadoop/hbase/client/MetricsConnection.html  |    98 +-
 .../hadoop/hbase/client/package-tree.html       |     6 +-
 ...ManagerCoordination.CreateAsyncCallback.html |     2 +-
 ...rCoordination.CreateRescanAsyncCallback.html |     2 +-
 ...ManagerCoordination.DeleteAsyncCallback.html |     2 +-
 ...anagerCoordination.GetDataAsyncCallback.html |     2 +-
 ...WorkerCoordination.GetDataAsyncCallback.html |     2 +-
 .../hadoop/hbase/filter/TimestampsFilter.html   |   111 +-
 .../hadoop/hbase/filter/package-tree.html       |     8 +-
 .../CombinedBlockCache.CombinedCacheStats.html  |    42 +-
 .../hbase/io/hfile/CombinedBlockCache.html      |    26 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     6 +-
 .../ipc/AsyncRpcChannel.CallWriteListener.html  |    10 +-
 .../hadoop/hbase/ipc/AsyncRpcChannel.html       |   152 +-
 .../hbase/ipc/AsyncServerResponseHandler.html   |    82 +-
 .../apache/hadoop/hbase/ipc/package-tree.html   |     4 +
 .../hadoop/hbase/mapreduce/package-tree.html    |     4 +-
 .../hadoop/hbase/master/package-tree.html       |     4 +-
 .../hbase/master/procedure/package-tree.html    |     2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |     8 +-
 .../hadoop/hbase/quotas/package-tree.html       |     2 +-
 .../hadoop/hbase/regionserver/KeyValueHeap.html |     5 +-
 .../hbase/regionserver/KeyValueScanner.html     |    39 +-
 .../regionserver/MobCompactionStoreScanner.html |     2 +-
 .../hbase/regionserver/MobStoreScanner.html     |     2 +-
 .../regionserver/NonLazyKeyValueScanner.html    |     5 +-
 .../regionserver/ReversedMobStoreScanner.html   |     2 +-
 .../regionserver/ReversedStoreScanner.html      |     2 +-
 .../ScanQueryMatcher.MatchCode.html             |    22 +-
 .../hbase/regionserver/ScanQueryMatcher.html    |    89 +-
 .../hbase/regionserver/StoreFileScanner.html    |     5 +-
 .../hadoop/hbase/regionserver/StoreScanner.html |    93 +-
 .../regionserver/class-use/KeyValueScanner.html |     3 +-
 .../class-use/NonLazyKeyValueScanner.html       |     3 +-
 .../NonReversedNonLazyKeyValueScanner.html      |     3 +-
 .../class-use/ScanQueryMatcher.MatchCode.html   |    12 +-
 .../hbase/regionserver/class-use/Shipper.html   |     3 +-
 .../hadoop/hbase/regionserver/package-tree.html |    26 +-
 .../hadoop/hbase/rest/model/package-tree.html   |     2 +-
 .../hbase/security/access/package-tree.html     |     2 +-
 .../hadoop/hbase/security/package-tree.html     |     2 +-
 .../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 +-
 .../hbase/util/CollectionBackedScanner.html     |    37 +-
 .../hadoop/hbase/util/package-summary.html      |     3 +-
 .../apache/hadoop/hbase/util/package-tree.html  |     6 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 devapidocs/overview-tree.html                   |     2 +-
 .../CellComparator.MetaCellComparator.html      |     2 +-
 .../hbase/CellComparator.RowComparator.html     |     2 +-
 .../org/apache/hadoop/hbase/CellComparator.html |     2 +-
 .../client/AsyncProcess.AsyncRequestFuture.html |  1348 +-
 ...stFutureImpl.ReplicaCallIssuingRunnable.html |  1348 +-
 ...tFutureImpl.SingleServerRequestRunnable.html |  1348 +-
 .../AsyncProcess.AsyncRequestFutureImpl.html    |  1348 +-
 .../hbase/client/AsyncProcess.BatchErrors.html  |  1348 +-
 .../client/AsyncProcess.ReplicaResultState.html |  1348 +-
 .../hadoop/hbase/client/AsyncProcess.Retry.html |  1348 +-
 .../hadoop/hbase/client/AsyncProcess.html       |  1348 +-
 .../client/MetricsConnection.CallStats.html     |   810 +-
 .../client/MetricsConnection.CallTracker.html   |   810 +-
 .../client/MetricsConnection.NewMetric.html     |   810 +-
 .../client/MetricsConnection.RegionStats.html   |   810 +-
 .../client/MetricsConnection.RunnerStats.html   |   810 +-
 .../hadoop/hbase/client/MetricsConnection.html  |   810 +-
 .../hadoop/hbase/filter/TimestampsFilter.html   |   353 +-
 .../CombinedBlockCache.CombinedCacheStats.html  |   367 +-
 .../hbase/io/hfile/CombinedBlockCache.html      |   367 +-
 .../hadoop/hbase/io/hfile/HFileWriterImpl.html  |     2 +-
 .../ipc/AsyncRpcChannel.CallWriteListener.html  |  1393 +-
 .../hadoop/hbase/ipc/AsyncRpcChannel.html       |  1393 +-
 .../hbase/ipc/AsyncServerResponseHandler.html   |   194 +-
 .../hbase/regionserver/KeyValueScanner.html     |   280 +-
 .../ScanQueryMatcher.MatchCode.html             |  1056 +-
 .../hbase/regionserver/ScanQueryMatcher.html    |  1056 +-
 ...StoreScanner.StoreScannerCompactionRace.html |   677 +-
 .../hadoop/hbase/regionserver/StoreScanner.html |   677 +-
 .../hbase/snapshot/ExportSnapshot.Counter.html  |     4 +-
 .../snapshot/ExportSnapshot.ExportMapper.html   |     4 +-
 ...hotInputFormat.ExportSnapshotInputSplit.html |     4 +-
 ...tInputFormat.ExportSnapshotRecordReader.html |     4 +-
 ...xportSnapshot.ExportSnapshotInputFormat.html |     4 +-
 .../hadoop/hbase/snapshot/ExportSnapshot.html   |     4 +-
 .../SnapshotInfo.SnapshotStats.FileInfo.html    |     4 +-
 .../snapshot/SnapshotInfo.SnapshotStats.html    |     4 +-
 .../hadoop/hbase/snapshot/SnapshotInfo.html     |     4 +-
 .../tmpl/master/MasterStatusTmpl.ImplData.html  |   270 +-
 .../tmpl/master/MasterStatusTmpl.Intf.html      |   270 +-
 .../hbase/tmpl/master/MasterStatusTmpl.html     |   270 +-
 .../hbase/tmpl/master/MasterStatusTmplImpl.html |    72 +-
 .../regionserver/RSStatusTmpl.ImplData.html     |   120 +-
 .../tmpl/regionserver/RSStatusTmpl.Intf.html    |   120 +-
 .../hbase/tmpl/regionserver/RSStatusTmpl.html   |   120 +-
 .../tmpl/regionserver/RSStatusTmplImpl.html     |    32 +-
 .../hbase/util/CollectionBackedScanner.html     |   193 +-
 distribution-management.html                    |     4 +-
 export_control.html                             |     4 +-
 hbase-annotations/checkstyle.html               |     6 +-
 hbase-annotations/dependencies.html             |     6 +-
 hbase-annotations/dependency-convergence.html   |     8 +-
 hbase-annotations/dependency-info.html          |     6 +-
 hbase-annotations/dependency-management.html    |     8 +-
 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-archetypes/dependencies.html              |     6 +-
 hbase-archetypes/dependency-convergence.html    |     8 +-
 hbase-archetypes/dependency-info.html           |     6 +-
 hbase-archetypes/dependency-management.html     |     8 +-
 hbase-archetypes/distribution-management.html   |     6 +-
 .../hbase-archetype-builder/dependencies.html   |     6 +-
 .../dependency-convergence.html                 |     8 +-
 .../dependency-info.html                        |     6 +-
 .../dependency-management.html                  |     8 +-
 .../distribution-management.html                |     6 +-
 .../hbase-archetype-builder/index.html          |     6 +-
 .../hbase-archetype-builder/integration.html    |     6 +-
 .../hbase-archetype-builder/issue-tracking.html |     6 +-
 .../hbase-archetype-builder/license.html        |     6 +-
 .../hbase-archetype-builder/mail-lists.html     |     6 +-
 .../plugin-management.html                      |     6 +-
 .../hbase-archetype-builder/plugins.html        |     6 +-
 .../hbase-archetype-builder/project-info.html   |     6 +-
 .../project-summary.html                        |     6 +-
 .../source-repository.html                      |     6 +-
 .../hbase-archetype-builder/team-list.html      |     6 +-
 .../hbase-client-project/checkstyle.html        |     6 +-
 .../hbase-client-project/dependencies.html      |    32 +-
 .../dependency-convergence.html                 |     8 +-
 .../hbase-client-project/dependency-info.html   |     6 +-
 .../dependency-management.html                  |     8 +-
 .../distribution-management.html                |     6 +-
 .../hbase-client-project/index.html             |     6 +-
 .../hbase-client-project/integration.html       |     6 +-
 .../hbase-client-project/issue-tracking.html    |     6 +-
 .../hbase-client-project/license.html           |     6 +-
 .../hbase-client-project/mail-lists.html        |     6 +-
 .../hbase-client-project/plugin-management.html |     6 +-
 .../hbase-client-project/plugins.html           |     6 +-
 .../hbase-client-project/project-info.html      |     6 +-
 .../hbase-client-project/project-reports.html   |     6 +-
 .../hbase-client-project/project-summary.html   |     6 +-
 .../hbase-client-project/source-repository.html |     6 +-
 .../hbase-client-project/team-list.html         |     6 +-
 .../hbase-shaded-client-project/checkstyle.html |     6 +-
 .../dependencies.html                           |    32 +-
 .../dependency-convergence.html                 |     8 +-
 .../dependency-info.html                        |     6 +-
 .../dependency-management.html                  |     8 +-
 .../distribution-management.html                |     6 +-
 .../hbase-shaded-client-project/index.html      |     6 +-
 .../integration.html                            |     6 +-
 .../issue-tracking.html                         |     6 +-
 .../hbase-shaded-client-project/license.html    |     6 +-
 .../hbase-shaded-client-project/mail-lists.html |     6 +-
 .../plugin-management.html                      |     6 +-
 .../hbase-shaded-client-project/plugins.html    |     6 +-
 .../project-info.html                           |     6 +-
 .../project-reports.html                        |     6 +-
 .../project-summary.html                        |     6 +-
 .../source-repository.html                      |     6 +-
 .../hbase-shaded-client-project/team-list.html  |     6 +-
 hbase-archetypes/index.html                     |     6 +-
 hbase-archetypes/integration.html               |     6 +-
 hbase-archetypes/issue-tracking.html            |     6 +-
 hbase-archetypes/license.html                   |     6 +-
 hbase-archetypes/mail-lists.html                |     6 +-
 hbase-archetypes/modules.html                   |     6 +-
 hbase-archetypes/plugin-management.html         |     6 +-
 hbase-archetypes/plugins.html                   |     6 +-
 hbase-archetypes/project-info.html              |     6 +-
 hbase-archetypes/project-summary.html           |     6 +-
 hbase-archetypes/source-repository.html         |     6 +-
 hbase-archetypes/team-list.html                 |     6 +-
 hbase-spark/checkstyle.html                     |     6 +-
 hbase-spark/dependencies.html                   |    34 +-
 hbase-spark/dependency-convergence.html         |     8 +-
 hbase-spark/dependency-info.html                |     6 +-
 hbase-spark/dependency-management.html          |     8 +-
 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/allclasses-frame.html            |     2 +
 testdevapidocs/allclasses-noframe.html          |     2 +
 testdevapidocs/constant-values.html             |    68 +
 testdevapidocs/index-all.html                   |   102 +-
 .../hbase/class-use/HBaseTestingUtility.html    |    48 +-
 .../apache/hadoop/hbase/io/hfile/TestHFile.html |    25 +-
 .../ipc/AbstractTestIPC.TestRpcServer.html      |    10 +-
 .../ipc/AbstractTestIPC.TestRpcServer1.html     |     8 +-
 .../hadoop/hbase/ipc/AbstractTestIPC.html       |    38 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    12 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     2 +-
 .../hbase/regionserver/KeyValueScanFixture.html |    12 +-
 .../TestStoreScanner.CellGridStoreScanner.html  |   419 +
 .../hbase/regionserver/TestStoreScanner.html    |   420 +-
 .../hbase/regionserver/TestStripeCompactor.html |     4 +-
 .../regionserver/TestTimeRangeTracker.html      |     4 +-
 .../TestTimestampFilterSeekHint.html            |   448 +
 .../hbase/regionserver/TestWALLockup.html       |     4 +-
 .../TestStoreScanner.CellGridStoreScanner.html  |   115 +
 .../class-use/TestTimestampFilterSeekHint.html  |   115 +
 .../hbase/regionserver/package-frame.html       |     2 +
 .../hbase/regionserver/package-summary.html     |    28 +-
 .../hadoop/hbase/regionserver/package-tree.html |     8 +-
 .../apache/hadoop/hbase/test/package-tree.html  |     2 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 .../TestRecoverableZooKeeper.ZookeeperStub.html |     2 +-
 testdevapidocs/overview-tree.html               |     6 +
 .../apache/hadoop/hbase/io/hfile/TestHFile.html |   286 +-
 .../ipc/AbstractTestIPC.TestRpcServer.html      |   721 +-
 .../ipc/AbstractTestIPC.TestRpcServer1.html     |   721 +-
 .../hadoop/hbase/ipc/AbstractTestIPC.html       |   721 +-
 .../hbase/regionserver/KeyValueScanFixture.html |    28 +-
 .../regionserver/TestKeyValueScanFixture.html   |    57 +-
 .../TestStoreScanner.CellGridStoreScanner.html  |   923 +
 .../hbase/regionserver/TestStoreScanner.html    |  1406 +-
 .../TestTimestampFilterSeekHint.html            |   178 +
 xref-test/allclasses-frame.html                 |     6 +
 .../apache/hadoop/hbase/io/hfile/TestHFile.html |   286 +-
 .../hadoop/hbase/ipc/AbstractTestIPC.html       |   721 +-
 .../hbase/regionserver/KeyValueScanFixture.html |    28 +-
 .../regionserver/TestKeyValueScanFixture.html   |    57 +-
 .../hbase/regionserver/TestStoreScanner.html    |  1406 +-
 .../TestTimestampFilterSeekHint.html            |   120 +
 .../hbase/regionserver/package-frame.html       |     6 +
 .../hbase/regionserver/package-summary.html     |    10 +
 .../org/apache/hadoop/hbase/CellComparator.html |     2 +-
 .../hadoop/hbase/client/AsyncProcess.html       |  1348 +-
 .../hadoop/hbase/client/MetricsConnection.html  |   810 +-
 .../hadoop/hbase/filter/TimestampsFilter.html   |   353 +-
 .../hbase/io/hfile/CombinedBlockCache.html      |   367 +-
 .../hadoop/hbase/io/hfile/HFileWriterImpl.html  |     2 +-
 .../hadoop/hbase/ipc/AsyncRpcChannel.html       |  1393 +-
 .../hbase/ipc/AsyncServerResponseHandler.html   |   194 +-
 .../hbase/regionserver/KeyValueScanner.html     |   280 +-
 .../hbase/regionserver/ScanQueryMatcher.html    |  1056 +-
 .../hadoop/hbase/regionserver/StoreScanner.html |   677 +-
 .../hadoop/hbase/snapshot/ExportSnapshot.html   |     4 +-
 .../hadoop/hbase/snapshot/SnapshotInfo.html     |     4 +-
 .../hbase/tmpl/common/TaskMonitorTmpl.html      |    90 +-
 .../hbase/tmpl/common/TaskMonitorTmplImpl.html  |    24 +-
 .../hbase/tmpl/master/MasterStatusTmpl.html     |   270 +-
 .../hbase/tmpl/master/MasterStatusTmplImpl.html |    72 +-
 .../hbase/tmpl/regionserver/RSStatusTmpl.html   |   120 +-
 .../tmpl/regionserver/RSStatusTmplImpl.html     |    32 +-
 .../hbase/util/CollectionBackedScanner.html     |   193 +-
 326 files changed, 34506 insertions(+), 30304 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 0d84d6f..e51eefc 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="20160323" />
+    <meta name="Date-Revision-yyyymmdd" content="20160324" />
     <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-03-23</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2016-03-24</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index b14229d..7f74e77 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:20160323145803+00'00')
-/ModDate (D:20160323145803+00'00')
+/CreationDate (D:20160324151749+00'00')
+/ModDate (D:20160324151749+00'00')
 >>
 endobj
 2 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/apache_hbase_reference_guide.pdfmarks
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdfmarks b/apache_hbase_reference_guide.pdfmarks
index 95e17a8..4589beb 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:20160323145949)
-  /CreationDate (D:20160323145949)
+  /ModDate (D:20160324151926)
+  /CreationDate (D:20160324151926)
   /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/f30982bd/apidocs/index-all.html
----------------------------------------------------------------------
diff --git a/apidocs/index-all.html b/apidocs/index-all.html
index 3564ce7b6..7950e5f 100644
--- a/apidocs/index-all.html
+++ b/apidocs/index-all.html
@@ -5424,6 +5424,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint(Cell)</a></span> - Method in class org.apache.hadoop.hbase.filter.<a href="./org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html" title="class in org.apache.hadoop.hbase.filter">MultiRowRangeFilter</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/filter/TimestampsFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint(Cell)</a></span> - Method in class org.apache.hadoop.hbase.filter.<a href="./org/apache/hadoop/hbase/filter/TimestampsFilter.html" title="class in org.apache.hadoop.hbase.filter">TimestampsFilter</a></dt>
+<dd>
+<div class="block">Pick the next cell that the scanner should seek to.</div>
+</dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/client/HConnection.html#getNonceGenerator()">getNonceGenerator()</a></span> - Method in interface org.apache.hadoop.hbase.client.<a href="./org/apache/hadoop/hbase/client/HConnection.html" title="interface in org.apache.hadoop.hbase.client">HConnection</a></dt>
 <dd>
 <div class="block"><span class="strong">Deprecated.</span>
@@ -13494,6 +13498,10 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 </dd>
 <dt><span class="strong"><a href="./org/apache/hadoop/hbase/filter/TimestampsFilter.html#TimestampsFilter(java.util.List)">TimestampsFilter(List&lt;Long&gt;)</a></span> - Constructor for class org.apache.hadoop.hbase.filter.<a href="./org/apache/hadoop/hbase/filter/TimestampsFilter.html" title="class in org.apache.hadoop.hbase.filter">TimestampsFilter</a></dt>
 <dd>
+<div class="block">Constructor for filter that retains only the specified timestamps in the list.</div>
+</dd>
+<dt><span class="strong"><a href="./org/apache/hadoop/hbase/filter/TimestampsFilter.html#TimestampsFilter(java.util.List,%20boolean)">TimestampsFilter(List&lt;Long&gt;, boolean)</a></span> - Constructor for class org.apache.hadoop.hbase.filter.<a href="./org/apache/hadoop/hbase/filter/TimestampsFilter.html" title="class in org.apache.hadoop.hbase.filter">TimestampsFilter</a></dt>
+<dd>
 <div class="block">Constructor for filter that retains only those
  cells whose timestamp (version) is in the specified
  list of timestamps.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/apidocs/org/apache/hadoop/hbase/class-use/Cell.html
----------------------------------------------------------------------
diff --git a/apidocs/org/apache/hadoop/hbase/class-use/Cell.html b/apidocs/org/apache/hadoop/hbase/class-use/Cell.html
index cb78c4b..1932bec 100644
--- a/apidocs/org/apache/hadoop/hbase/class-use/Cell.html
+++ b/apidocs/org/apache/hadoop/hbase/class-use/Cell.html
@@ -1047,55 +1047,61 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <td class="colLast"><span class="strong">MultiRowRangeFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentKV)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
+<td class="colLast"><span class="strong">TimestampsFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code>
+<div class="block">Pick the next cell that the scanner should seek to.</div>
+</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>abstract <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">Filter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code>
 <div class="block">If the filter returns the match code SEEK_NEXT_USING_HINT, then it should also tell which is
  the next key it must seek to.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">ColumnPaginationFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/ColumnPaginationFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">FuzzyRowFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">MultipleColumnPrefixFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">ColumnRangeFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/ColumnRangeFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">ColumnPrefixFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">FilterList.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>abstract <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">Filter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code>
 <div class="block">Give the filter a chance to transform the passed KeyValue.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">WhileMatchFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/WhileMatchFilter.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">SkipFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/SkipFilter.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">FilterList.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">KeyOnlyFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/KeyOnlyFilter.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>&nbsp;</td>
 </tr>
@@ -1331,55 +1337,61 @@ Input/OutputFormats, a table indexing MapReduce job, and utility methods.</div>
 <td class="colLast"><span class="strong">MultiRowRangeFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/MultiRowRangeFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentKV)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
+<td class="colLast"><span class="strong">TimestampsFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code>
+<div class="block">Pick the next cell that the scanner should seek to.</div>
+</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>abstract <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">Filter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code>
 <div class="block">If the filter returns the match code SEEK_NEXT_USING_HINT, then it should also tell which is
  the next key it must seek to.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">ColumnPaginationFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/ColumnPaginationFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">FuzzyRowFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">MultipleColumnPrefixFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/MultipleColumnPrefixFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">ColumnRangeFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/ColumnRangeFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">ColumnPrefixFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/ColumnPrefixFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">FilterList.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>abstract <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">Filter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code>
 <div class="block">Give the filter a chance to transform the passed KeyValue.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">WhileMatchFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/WhileMatchFilter.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">SkipFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/SkipFilter.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">FilterList.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
 <td class="colLast"><span class="strong">KeyOnlyFilter.</span><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/KeyOnlyFilter.html#transformCell(org.apache.hadoop.hbase.Cell)">transformCell</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/apidocs/org/apache/hadoop/hbase/filter/TimestampsFilter.html
----------------------------------------------------------------------
diff --git a/apidocs/org/apache/hadoop/hbase/filter/TimestampsFilter.html b/apidocs/org/apache/hadoop/hbase/filter/TimestampsFilter.html
index 0ce0fb0..a118f4b 100644
--- a/apidocs/org/apache/hadoop/hbase/filter/TimestampsFilter.html
+++ b/apidocs/org/apache/hadoop/hbase/filter/TimestampsFilter.html
@@ -107,7 +107,7 @@
 <br>
 <pre>@InterfaceAudience.Public
 @InterfaceStability.Stable
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.45">TimestampsFilter</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.46">TimestampsFilter</a>
 extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <div class="block">Filter that returns only cells whose timestamp (version) is
  in the specified list of timestamps (versions).
@@ -165,6 +165,12 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 </tr>
 <tr class="altColor">
 <td class="colOne"><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#TimestampsFilter(java.util.List)">TimestampsFilter</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/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;timestamps)</code>
+<div class="block">Constructor for filter that retains only the specified timestamps in the list.</div>
+</td>
+</tr>
+<tr class="rowColor">
+<td class="colOne"><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#TimestampsFilter(java.util.List,%20boolean)">TimestampsFilter</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/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;timestamps,
+                                boolean&nbsp;canHint)</code>
 <div class="block">Constructor for filter that retains only those
  cells whose timestamp (version) is in the specified
  list of timestamps.</div>
@@ -208,26 +214,32 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 </td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a></code></td>
+<td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#getNextCellHint(org.apache.hadoop.hbase.Cell)">getNextCellHint</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)</code>
+<div class="block">Pick the next cell that the scanner should seek to.</div>
+</td>
+</tr>
+<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="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;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#getTimestamps()">getTimestamps</a></strong>()</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html" title="class in org.apache.hadoop.hbase.filter">TimestampsFilter</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#parseFrom(byte[])">parseFrom</a></strong>(byte[]&nbsp;pbBytes)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>byte[]</code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html#toByteArray()">toByteArray</a></strong>()</code>
 <div class="block">Return length 0 byte array for Filters that don't require special serialization</div>
 </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/filter/TimestampsFilter.html#toString()">toString</a></strong>()</code>
 <div class="block">Return filter's info for debugging and logging purpose.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected <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/filter/TimestampsFilter.html#toString(int)">toString</a></strong>(int&nbsp;maxTimestamps)</code>&nbsp;</td>
 </tr>
@@ -237,7 +249,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.filter.FilterBase</h3>
-<code>filterAllRemaining, filterRow, filterRowCells, filterRowKey, getNextCellHint, hasFilterRow, isFamilyEssential, reset, transformCell</code></li>
+<code>filterAllRemaining, filterRow, filterRowCells, filterRowKey, hasFilterRow, isFamilyEssential, reset, transformCell</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods_inherited_from_class_org.apache.hadoop.hbase.filter.Filter">
@@ -270,14 +282,29 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <a name="TimestampsFilter(java.util.List)">
 <!--   -->
 </a>
+<ul class="blockList">
+<li class="blockList">
+<h4>TimestampsFilter</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.60">TimestampsFilter</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="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;timestamps)</pre>
+<div class="block">Constructor for filter that retains only the specified timestamps in the list.</div>
+<dl><dt><span class="strong">Parameters:</span></dt><dd><code>timestamps</code> - </dd></dl>
+</li>
+</ul>
+<a name="TimestampsFilter(java.util.List, boolean)">
+<!--   -->
+</a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TimestampsFilter</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.61">TimestampsFilter</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="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;timestamps)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.75">TimestampsFilter</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="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;timestamps,
+                boolean&nbsp;canHint)</pre>
 <div class="block">Constructor for filter that retains only those
  cells whose timestamp (version) is in the specified
  list of timestamps.</div>
-<dl><dt><span class="strong">Parameters:</span></dt><dd><code>timestamps</code> - </dd></dl>
+<dl><dt><span class="strong">Parameters:</span></dt><dd><code>timestamps</code> - list of timestamps that are wanted.</dd><dd><code>canHint</code> - should the filter provide a seek hint? This can skip
+                past delete tombstones, so it should only be used when that
+                is not an issue ( no deletes, or don't care if data
+                becomes visible)</dd></dl>
 </li>
 </ul>
 </li>
@@ -294,7 +321,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getTimestamps</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/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.72">getTimestamps</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="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;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.87">getTimestamps</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>the list of timestamps</dd></dl>
 </li>
 </ul>
@@ -304,7 +331,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getMin</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.88">getMin</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.103">getMin</a>()</pre>
 <div class="block">Gets the minimum timestamp requested by filter.</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>minimum timestamp requested by filter.</dd></dl>
 </li>
@@ -315,7 +342,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>filterRowKey</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.93">filterRowKey</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.108">filterRowKey</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"><strong>Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html#filterRowKey(org.apache.hadoop.hbase.Cell)">Filter</a></code></strong></div>
 <div class="block">Filters a row based on the row key. If this returns true, the entire row will be excluded. If
@@ -338,7 +365,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>filterKeyValue</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter">Filter.ReturnCode</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.99">filterKeyValue</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter">Filter.ReturnCode</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.114">filterKeyValue</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;v)</pre>
 <div class="block"><strong>Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html#filterKeyValue(org.apache.hadoop.hbase.Cell)">Filter</a></code></strong></div>
 <div class="block">A way to filter based on the column family, column qualifier and/or the column value. Return
  code is described below. This allows filters to filter only certain number of columns, then
@@ -361,13 +388,34 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <dt><span class="strong">Returns:</span></dt><dd>code as described below</dd><dt><span class="strong">See Also:</span></dt><dd><a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><code>Filter.ReturnCode</code></a></dd></dl>
 </li>
 </ul>
+<a name="getNextCellHint(org.apache.hadoop.hbase.Cell)">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getNextCellHint</h4>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.134">getNextCellHint</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell)
+                     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">Pick the next cell that the scanner should seek to. Since this can skip any number of cells
+ any of which can be a delete this can resurect old data.
+
+ The method will only be used if canHint was set to true while creating the filter.</div>
+<dl>
+<dt><strong>Overrides:</strong></dt>
+<dd><code>getNextCellHint</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.filter.FilterBase</code></dd>
+<dt><span class="strong">Returns:</span></dt><dd>KeyValue which must be next seeked. return null if the filter is not sure which key to
+         seek to next.</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> - This will never happen.</dd></dl>
+</li>
+</ul>
 <a name="createFilterFromArguments(java.util.ArrayList)">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>createFilterFromArguments</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.110">createFilterFromArguments</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;byte[]&gt;&nbsp;filterArguments)</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.html" title="class in org.apache.hadoop.hbase.filter">Filter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.159">createFilterFromArguments</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;byte[]&gt;&nbsp;filterArguments)</pre>
 </li>
 </ul>
 <a name="toByteArray()">
@@ -376,7 +424,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>toByteArray</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.122">toByteArray</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.171">toByteArray</a>()</pre>
 <div class="block"><strong>Description copied from class:&nbsp;<code>org.apache.hadoop.hbase.filter.FilterBase</code></strong></div>
 <div class="block">Return length 0 byte array for Filters that don't require special serialization</div>
 <dl>
@@ -391,7 +439,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>parseFrom</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html" title="class in org.apache.hadoop.hbase.filter">TimestampsFilter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.135">parseFrom</a>(byte[]&nbsp;pbBytes)
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html" title="class in org.apache.hadoop.hbase.filter">TimestampsFilter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.185">parseFrom</a>(byte[]&nbsp;pbBytes)
                                   throws org.apache.hadoop.hbase.exceptions.DeserializationException</pre>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>pbBytes</code> - A pb serialized <a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html" title="class in org.apache.hadoop.hbase.filter"><code>TimestampsFilter</code></a> instance</dd>
 <dt><span class="strong">Returns:</span></dt><dd>An instance of <a href="../../../../../org/apache/hadoop/hbase/filter/TimestampsFilter.html" title="class in org.apache.hadoop.hbase.filter"><code>TimestampsFilter</code></a> made from <code>bytes</code></dd>
@@ -405,7 +453,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <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/filter/TimestampsFilter.html#line.160">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/filter/TimestampsFilter.html#line.211">toString</a>()</pre>
 <div class="block"><strong>Description copied from class:&nbsp;<code>org.apache.hadoop.hbase.filter.FilterBase</code></strong></div>
 <div class="block">Return filter's info for debugging and logging purpose.</div>
 <dl>
@@ -420,7 +468,7 @@ extends org.apache.hadoop.hbase.filter.FilterBase</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toString</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>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.164">toString</a>(int&nbsp;maxTimestamps)</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>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/filter/TimestampsFilter.html#line.215">toString</a>(int&nbsp;maxTimestamps)</pre>
 </li>
 </ul>
 </li>


[17/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 cc3c353..995bce0 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 = "filter", type = "String"),<a name="line.62"></a>
-<span class="sourceLineNo">063</span>    @org.jamon.annotations.Argument(name = "catalogJanitorEnabled", type = "boolean"),<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 = "frags", type = "Map&lt;String,Integer&gt;"),<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    @org.jamon.annotations.Argument(name = "serverManager", type = "ServerManager"),<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    @org.jamon.annotations.Argument(name = "deadServers", type = "Set&lt;ServerName&gt;"),<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    @org.jamon.annotations.Argument(name = "assignmentManager", type = "AssignmentManager"),<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    @org.jamon.annotations.Argument(name = "format", type = "String"),<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 = "format", type = "String"),<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    @org.jamon.annotations.Argument(name = "assignmentManager", type = "AssignmentManager"),<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    @org.jamon.annotations.Argument(name = "filter", type = "String"),<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    @org.jamon.annotations.Argument(name = "servers", type = "List&lt;ServerName&gt;"),<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    @org.jamon.annotations.Argument(name = "deadServers", type = "Set&lt;ServerName&gt;"),<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    @org.jamon.annotations.Argument(name = "serverManager", type = "ServerManager"),<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    @org.jamon.annotations.Argument(name = "catalogJanitorEnabled", type = "boolean"),<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    @org.jamon.annotations.Argument(name = "frags", type = "Map&lt;String,Integer&gt;"),<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    @org.jamon.annotations.Argument(name = "metaLocation", type = "ServerName")})<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>    // 26, 1<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    public void setFilter(String filter)<a name="line.112"></a>
+<span class="sourceLineNo">111</span>    // 27, 1<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    public void setFormat(String format)<a name="line.112"></a>
 <span class="sourceLineNo">113</span>    {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      // 26, 1<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      m_filter = filter;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      m_filter__IsNotDefault = true;<a name="line.116"></a>
+<span class="sourceLineNo">114</span>      // 27, 1<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      m_format = format;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      m_format__IsNotDefault = true;<a name="line.116"></a>
 <span class="sourceLineNo">117</span>    }<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    public String getFilter()<a name="line.118"></a>
+<span class="sourceLineNo">118</span>    public String getFormat()<a name="line.118"></a>
 <span class="sourceLineNo">119</span>    {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      return m_filter;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>      return m_format;<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    private String m_filter;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    public boolean getFilter__IsNotDefault()<a name="line.123"></a>
+<span class="sourceLineNo">122</span>    private String m_format;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    public boolean getFormat__IsNotDefault()<a name="line.123"></a>
 <span class="sourceLineNo">124</span>    {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      return m_filter__IsNotDefault;<a name="line.125"></a>
+<span class="sourceLineNo">125</span>      return m_format__IsNotDefault;<a name="line.125"></a>
 <span class="sourceLineNo">126</span>    }<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    private boolean m_filter__IsNotDefault;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    // 25, 1<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    public void setCatalogJanitorEnabled(boolean catalogJanitorEnabled)<a name="line.129"></a>
+<span class="sourceLineNo">127</span>    private boolean m_format__IsNotDefault;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    // 29, 1<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    public void setAssignmentManager(AssignmentManager assignmentManager)<a name="line.129"></a>
 <span class="sourceLineNo">130</span>    {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      // 25, 1<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      m_catalogJanitorEnabled = catalogJanitorEnabled;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      m_catalogJanitorEnabled__IsNotDefault = true;<a name="line.133"></a>
+<span class="sourceLineNo">131</span>      // 29, 1<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      m_assignmentManager = assignmentManager;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      m_assignmentManager__IsNotDefault = true;<a name="line.133"></a>
 <span class="sourceLineNo">134</span>    }<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    public boolean getCatalogJanitorEnabled()<a name="line.135"></a>
+<span class="sourceLineNo">135</span>    public AssignmentManager getAssignmentManager()<a name="line.135"></a>
 <span class="sourceLineNo">136</span>    {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      return m_catalogJanitorEnabled;<a name="line.137"></a>
+<span class="sourceLineNo">137</span>      return m_assignmentManager;<a name="line.137"></a>
 <span class="sourceLineNo">138</span>    }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    private boolean m_catalogJanitorEnabled;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    public boolean getCatalogJanitorEnabled__IsNotDefault()<a name="line.140"></a>
+<span class="sourceLineNo">139</span>    private AssignmentManager m_assignmentManager;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    public boolean getAssignmentManager__IsNotDefault()<a name="line.140"></a>
 <span class="sourceLineNo">141</span>    {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      return m_catalogJanitorEnabled__IsNotDefault;<a name="line.142"></a>
+<span class="sourceLineNo">142</span>      return m_assignmentManager__IsNotDefault;<a name="line.142"></a>
 <span class="sourceLineNo">143</span>    }<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    private boolean m_catalogJanitorEnabled__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_assignmentManager__IsNotDefault;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    // 26, 1<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    public void setFilter(String filter)<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>      // 26, 1<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      m_filter = filter;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      m_filter__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 String getFilter()<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_filter;<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 String m_filter;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    public boolean getFilter__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_filter__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>    // 21, 1<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public void setFrags(Map&lt;String,Integer&gt; frags)<a name="line.163"></a>
+<span class="sourceLineNo">161</span>    private boolean m_filter__IsNotDefault;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    // 23, 1<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    public void setServers(List&lt;ServerName&gt; servers)<a name="line.163"></a>
 <span class="sourceLineNo">164</span>    {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      // 21, 1<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      m_frags = frags;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      m_frags__IsNotDefault = true;<a name="line.167"></a>
+<span class="sourceLineNo">165</span>      // 23, 1<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      m_servers = servers;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      m_servers__IsNotDefault = true;<a name="line.167"></a>
 <span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    public Map&lt;String,Integer&gt; getFrags()<a name="line.169"></a>
+<span class="sourceLineNo">169</span>    public List&lt;ServerName&gt; getServers()<a name="line.169"></a>
 <span class="sourceLineNo">170</span>    {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      return m_frags;<a name="line.171"></a>
+<span class="sourceLineNo">171</span>      return m_servers;<a name="line.171"></a>
 <span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    private Map&lt;String,Integer&gt; m_frags;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    public boolean getFrags__IsNotDefault()<a name="line.174"></a>
+<span class="sourceLineNo">173</span>    private List&lt;ServerName&gt; m_servers;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    public boolean getServers__IsNotDefault()<a name="line.174"></a>
 <span class="sourceLineNo">175</span>    {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      return m_frags__IsNotDefault;<a name="line.176"></a>
+<span class="sourceLineNo">176</span>      return m_servers__IsNotDefault;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>    }<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    private boolean m_frags__IsNotDefault;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    // 28, 1<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    public void setServerManager(ServerManager serverManager)<a name="line.180"></a>
+<span class="sourceLineNo">178</span>    private boolean m_servers__IsNotDefault;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    // 24, 1<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    public void setDeadServers(Set&lt;ServerName&gt; deadServers)<a name="line.180"></a>
 <span class="sourceLineNo">181</span>    {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      // 28, 1<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      m_serverManager = serverManager;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      m_serverManager__IsNotDefault = true;<a name="line.184"></a>
+<span class="sourceLineNo">182</span>      // 24, 1<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      m_deadServers = deadServers;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      m_deadServers__IsNotDefault = true;<a name="line.184"></a>
 <span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    public ServerManager getServerManager()<a name="line.186"></a>
+<span class="sourceLineNo">186</span>    public Set&lt;ServerName&gt; getDeadServers()<a name="line.186"></a>
 <span class="sourceLineNo">187</span>    {<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      return m_serverManager;<a name="line.188"></a>
+<span class="sourceLineNo">188</span>      return m_deadServers;<a name="line.188"></a>
 <span class="sourceLineNo">189</span>    }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    private ServerManager m_serverManager;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    public boolean getServerManager__IsNotDefault()<a name="line.191"></a>
+<span class="sourceLineNo">190</span>    private Set&lt;ServerName&gt; m_deadServers;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    public boolean getDeadServers__IsNotDefault()<a name="line.191"></a>
 <span class="sourceLineNo">192</span>    {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      return m_serverManager__IsNotDefault;<a name="line.193"></a>
+<span class="sourceLineNo">193</span>      return m_deadServers__IsNotDefault;<a name="line.193"></a>
 <span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    private boolean m_serverManager__IsNotDefault;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    // 24, 1<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    public void setDeadServers(Set&lt;ServerName&gt; deadServers)<a name="line.197"></a>
+<span class="sourceLineNo">195</span>    private boolean m_deadServers__IsNotDefault;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    // 28, 1<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    public void setServerManager(ServerManager serverManager)<a name="line.197"></a>
 <span class="sourceLineNo">198</span>    {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      // 24, 1<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      m_deadServers = deadServers;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      m_deadServers__IsNotDefault = true;<a name="line.201"></a>
+<span class="sourceLineNo">199</span>      // 28, 1<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      m_serverManager = serverManager;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      m_serverManager__IsNotDefault = true;<a name="line.201"></a>
 <span class="sourceLineNo">202</span>    }<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    public Set&lt;ServerName&gt; getDeadServers()<a name="line.203"></a>
+<span class="sourceLineNo">203</span>    public ServerManager getServerManager()<a name="line.203"></a>
 <span class="sourceLineNo">204</span>    {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      return m_deadServers;<a name="line.205"></a>
+<span class="sourceLineNo">205</span>      return m_serverManager;<a name="line.205"></a>
 <span class="sourceLineNo">206</span>    }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private Set&lt;ServerName&gt; m_deadServers;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    public boolean getDeadServers__IsNotDefault()<a name="line.208"></a>
+<span class="sourceLineNo">207</span>    private ServerManager m_serverManager;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    public boolean getServerManager__IsNotDefault()<a name="line.208"></a>
 <span class="sourceLineNo">209</span>    {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      return m_deadServers__IsNotDefault;<a name="line.210"></a>
+<span class="sourceLineNo">210</span>      return m_serverManager__IsNotDefault;<a name="line.210"></a>
 <span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    private boolean m_deadServers__IsNotDefault;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    // 29, 1<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    public void setAssignmentManager(AssignmentManager assignmentManager)<a name="line.214"></a>
+<span class="sourceLineNo">212</span>    private boolean m_serverManager__IsNotDefault;<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    // 25, 1<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    public void setCatalogJanitorEnabled(boolean catalogJanitorEnabled)<a name="line.214"></a>
 <span class="sourceLineNo">215</span>    {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      // 29, 1<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      m_assignmentManager = assignmentManager;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      m_assignmentManager__IsNotDefault = true;<a name="line.218"></a>
+<span class="sourceLineNo">216</span>      // 25, 1<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      m_catalogJanitorEnabled = catalogJanitorEnabled;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      m_catalogJanitorEnabled__IsNotDefault = true;<a name="line.218"></a>
 <span class="sourceLineNo">219</span>    }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    public AssignmentManager getAssignmentManager()<a name="line.220"></a>
+<span class="sourceLineNo">220</span>    public boolean getCatalogJanitorEnabled()<a name="line.220"></a>
 <span class="sourceLineNo">221</span>    {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      return m_assignmentManager;<a name="line.222"></a>
+<span class="sourceLineNo">222</span>      return m_catalogJanitorEnabled;<a name="line.222"></a>
 <span class="sourceLineNo">223</span>    }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    private AssignmentManager m_assignmentManager;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    public boolean getAssignmentManager__IsNotDefault()<a name="line.225"></a>
+<span class="sourceLineNo">224</span>    private boolean m_catalogJanitorEnabled;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public boolean getCatalogJanitorEnabled__IsNotDefault()<a name="line.225"></a>
 <span class="sourceLineNo">226</span>    {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return m_assignmentManager__IsNotDefault;<a name="line.227"></a>
+<span class="sourceLineNo">227</span>      return m_catalogJanitorEnabled__IsNotDefault;<a name="line.227"></a>
 <span class="sourceLineNo">228</span>    }<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    private boolean m_assignmentManager__IsNotDefault;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    // 27, 1<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    public void setFormat(String format)<a name="line.231"></a>
+<span class="sourceLineNo">229</span>    private boolean m_catalogJanitorEnabled__IsNotDefault;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    // 21, 1<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    public void setFrags(Map&lt;String,Integer&gt; frags)<a name="line.231"></a>
 <span class="sourceLineNo">232</span>    {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      // 27, 1<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      m_format = format;<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      m_format__IsNotDefault = true;<a name="line.235"></a>
+<span class="sourceLineNo">233</span>      // 21, 1<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      m_frags = frags;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      m_frags__IsNotDefault = true;<a name="line.235"></a>
 <span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    public String getFormat()<a name="line.237"></a>
+<span class="sourceLineNo">237</span>    public Map&lt;String,Integer&gt; getFrags()<a name="line.237"></a>
 <span class="sourceLineNo">238</span>    {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return m_format;<a name="line.239"></a>
+<span class="sourceLineNo">239</span>      return m_frags;<a name="line.239"></a>
 <span class="sourceLineNo">240</span>    }<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    private String m_format;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    public boolean getFormat__IsNotDefault()<a name="line.242"></a>
+<span class="sourceLineNo">241</span>    private Map&lt;String,Integer&gt; m_frags;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    public boolean getFrags__IsNotDefault()<a name="line.242"></a>
 <span class="sourceLineNo">243</span>    {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      return m_format__IsNotDefault;<a name="line.244"></a>
+<span class="sourceLineNo">244</span>      return m_frags__IsNotDefault;<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    private boolean m_format__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_frags__IsNotDefault;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    // 22, 1<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    public void setMetaLocation(ServerName metaLocation)<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>      // 22, 1<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      m_metaLocation = metaLocation;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      m_metaLocation__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 ServerName getMetaLocation()<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_metaLocation;<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 ServerName m_metaLocation;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    public boolean getMetaLocation__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_metaLocation__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_metaLocation__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 String filter;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFilter(String p_filter)<a name="line.276"></a>
+<span class="sourceLineNo">275</span>  protected String format;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFormat(String p_format)<a name="line.276"></a>
 <span class="sourceLineNo">277</span>  {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    (getImplData()).setFilter(p_filter);<a name="line.278"></a>
+<span class="sourceLineNo">278</span>    (getImplData()).setFormat(p_format);<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 boolean catalogJanitorEnabled;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setCatalogJanitorEnabled(boolean p_catalogJanitorEnabled)<a name="line.283"></a>
+<span class="sourceLineNo">282</span>  protected AssignmentManager assignmentManager;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setAssignmentManager(AssignmentManager p_assignmentManager)<a name="line.283"></a>
 <span class="sourceLineNo">284</span>  {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    (getImplData()).setCatalogJanitorEnabled(p_catalogJanitorEnabled);<a name="line.285"></a>
+<span class="sourceLineNo">285</span>    (getImplData()).setAssignmentManager(p_assignmentManager);<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 String filter;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFilter(String p_filter)<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()).setFilter(p_filter);<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 Map&lt;String,Integer&gt; frags;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFrags(Map&lt;String,Integer&gt; p_frags)<a name="line.297"></a>
+<span class="sourceLineNo">296</span>  protected List&lt;ServerName&gt; servers;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServers(List&lt;ServerName&gt; p_servers)<a name="line.297"></a>
 <span class="sourceLineNo">298</span>  {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    (getImplData()).setFrags(p_frags);<a name="line.299"></a>
+<span class="sourceLineNo">299</span>    (getImplData()).setServers(p_servers);<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 ServerManager serverManager;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServerManager(ServerManager p_serverManager)<a name="line.304"></a>
+<span class="sourceLineNo">303</span>  protected Set&lt;ServerName&gt; deadServers;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setDeadServers(Set&lt;ServerName&gt; p_deadServers)<a name="line.304"></a>
 <span class="sourceLineNo">305</span>  {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    (getImplData()).setServerManager(p_serverManager);<a name="line.306"></a>
+<span class="sourceLineNo">306</span>    (getImplData()).setDeadServers(p_deadServers);<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 Set&lt;ServerName&gt; deadServers;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setDeadServers(Set&lt;ServerName&gt; p_deadServers)<a name="line.311"></a>
+<span class="sourceLineNo">310</span>  protected ServerManager serverManager;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setServerManager(ServerManager p_serverManager)<a name="line.311"></a>
 <span class="sourceLineNo">312</span>  {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    (getImplData()).setDeadServers(p_deadServers);<a name="line.313"></a>
+<span class="sourceLineNo">313</span>    (getImplData()).setServerManager(p_serverManager);<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 AssignmentManager assignmentManager;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setAssignmentManager(AssignmentManager p_assignmentManager)<a name="line.318"></a>
+<span class="sourceLineNo">317</span>  protected boolean catalogJanitorEnabled;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setCatalogJanitorEnabled(boolean p_catalogJanitorEnabled)<a name="line.318"></a>
 <span class="sourceLineNo">319</span>  {<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    (getImplData()).setAssignmentManager(p_assignmentManager);<a name="line.320"></a>
+<span class="sourceLineNo">320</span>    (getImplData()).setCatalogJanitorEnabled(p_catalogJanitorEnabled);<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 String format;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFormat(String p_format)<a name="line.325"></a>
+<span class="sourceLineNo">324</span>  protected Map&lt;String,Integer&gt; frags;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setFrags(Map&lt;String,Integer&gt; p_frags)<a name="line.325"></a>
 <span class="sourceLineNo">326</span>  {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    (getImplData()).setFormat(p_format);<a name="line.327"></a>
+<span class="sourceLineNo">327</span>    (getImplData()).setFrags(p_frags);<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 ServerName metaLocation;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  public final org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl setMetaLocation(ServerName p_metaLocation)<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()).setMetaLocation(p_metaLocation);<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/f30982bd/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 8f0ce0a..2851d34 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 String filter;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  private final boolean catalogJanitorEnabled;<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 Map&lt;String,Integer&gt; frags;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>  private final ServerManager serverManager;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  private final Set&lt;ServerName&gt; deadServers;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  private final AssignmentManager assignmentManager;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>  private final String format;<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 String format;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>  private final AssignmentManager assignmentManager;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>  private final String filter;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>  private final List&lt;ServerName&gt; servers;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>  private final Set&lt;ServerName&gt; deadServers;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  private final ServerManager serverManager;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  private final boolean catalogJanitorEnabled;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  private final Map&lt;String,Integer&gt; frags;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  private final ServerName metaLocation;<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.getFilter__IsNotDefault())<a name="line.101"></a>
+<span class="sourceLineNo">101</span>    if(! p_implData.getFormat__IsNotDefault())<a name="line.101"></a>
 <span class="sourceLineNo">102</span>    {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      p_implData.setFilter("general");<a name="line.103"></a>
+<span class="sourceLineNo">103</span>      p_implData.setFormat("html");<a name="line.103"></a>
 <span class="sourceLineNo">104</span>    }<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    if(! p_implData.getCatalogJanitorEnabled__IsNotDefault())<a name="line.105"></a>
+<span class="sourceLineNo">105</span>    if(! p_implData.getAssignmentManager__IsNotDefault())<a name="line.105"></a>
 <span class="sourceLineNo">106</span>    {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      p_implData.setCatalogJanitorEnabled(true);<a name="line.107"></a>
+<span class="sourceLineNo">107</span>      p_implData.setAssignmentManager(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.getFilter__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.setFilter("general");<a name="line.111"></a>
 <span class="sourceLineNo">112</span>    }<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    if(! p_implData.getFrags__IsNotDefault())<a name="line.113"></a>
+<span class="sourceLineNo">113</span>    if(! p_implData.getServers__IsNotDefault())<a name="line.113"></a>
 <span class="sourceLineNo">114</span>    {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      p_implData.setFrags(null);<a name="line.115"></a>
+<span class="sourceLineNo">115</span>      p_implData.setServers(null);<a name="line.115"></a>
 <span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    if(! p_implData.getServerManager__IsNotDefault())<a name="line.117"></a>
+<span class="sourceLineNo">117</span>    if(! p_implData.getDeadServers__IsNotDefault())<a name="line.117"></a>
 <span class="sourceLineNo">118</span>    {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      p_implData.setServerManager(null);<a name="line.119"></a>
+<span class="sourceLineNo">119</span>      p_implData.setDeadServers(null);<a name="line.119"></a>
 <span class="sourceLineNo">120</span>    }<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    if(! p_implData.getDeadServers__IsNotDefault())<a name="line.121"></a>
+<span class="sourceLineNo">121</span>    if(! p_implData.getServerManager__IsNotDefault())<a name="line.121"></a>
 <span class="sourceLineNo">122</span>    {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      p_implData.setDeadServers(null);<a name="line.123"></a>
+<span class="sourceLineNo">123</span>      p_implData.setServerManager(null);<a name="line.123"></a>
 <span class="sourceLineNo">124</span>    }<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    if(! p_implData.getAssignmentManager__IsNotDefault())<a name="line.125"></a>
+<span class="sourceLineNo">125</span>    if(! p_implData.getCatalogJanitorEnabled__IsNotDefault())<a name="line.125"></a>
 <span class="sourceLineNo">126</span>    {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      p_implData.setAssignmentManager(null);<a name="line.127"></a>
+<span class="sourceLineNo">127</span>      p_implData.setCatalogJanitorEnabled(true);<a name="line.127"></a>
 <span class="sourceLineNo">128</span>    }<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    if(! p_implData.getFormat__IsNotDefault())<a name="line.129"></a>
+<span class="sourceLineNo">129</span>    if(! p_implData.getFrags__IsNotDefault())<a name="line.129"></a>
 <span class="sourceLineNo">130</span>    {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      p_implData.setFormat("html");<a name="line.131"></a>
+<span class="sourceLineNo">131</span>      p_implData.setFrags(null);<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.getMetaLocation__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.setMetaLocation(null);<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>    filter = p_implData.getFilter();<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    catalogJanitorEnabled = p_implData.getCatalogJanitorEnabled();<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    metaLocation = p_implData.getMetaLocation();<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    frags = p_implData.getFrags();<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    serverManager = p_implData.getServerManager();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    deadServers = p_implData.getDeadServers();<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    assignmentManager = p_implData.getAssignmentManager();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    format = p_implData.getFormat();<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    servers = p_implData.getServers();<a name="line.151"></a>
+<span class="sourceLineNo">143</span>    format = p_implData.getFormat();<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    assignmentManager = p_implData.getAssignmentManager();<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    filter = p_implData.getFilter();<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    servers = p_implData.getServers();<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    deadServers = p_implData.getDeadServers();<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    serverManager = p_implData.getServerManager();<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    catalogJanitorEnabled = p_implData.getCatalogJanitorEnabled();<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    frags = p_implData.getFrags();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    metaLocation = p_implData.getMetaLocation();<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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 d02b86d..372987f 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 = "bcv", 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 = "format", 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 = "format", type = "String"),<a name="line.28"></a>
+<span class="sourceLineNo">029</span>    @org.jamon.annotations.Argument(name = "filter", 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 = "bcn", 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>    // 24, 1<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    public void setBcv(String bcv)<a name="line.73"></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">074</span>    {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      // 24, 1<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      m_bcv = bcv;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      m_bcv__IsNotDefault = true;<a name="line.77"></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">078</span>    }<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public String getBcv()<a name="line.79"></a>
+<span class="sourceLineNo">079</span>    public String getFormat()<a name="line.79"></a>
 <span class="sourceLineNo">080</span>    {<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      return m_bcv;<a name="line.81"></a>
+<span class="sourceLineNo">081</span>      return m_format;<a name="line.81"></a>
 <span class="sourceLineNo">082</span>    }<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    private String m_bcv;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    public boolean getBcv__IsNotDefault()<a name="line.84"></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">085</span>    {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      return m_bcv__IsNotDefault;<a name="line.86"></a>
+<span class="sourceLineNo">086</span>      return m_format__IsNotDefault;<a name="line.86"></a>
 <span class="sourceLineNo">087</span>    }<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    private boolean m_bcv__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_format__IsNotDefault;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    // 21, 1<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    public void setFilter(String filter)<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>      // 21, 1<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      m_filter = filter;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      m_filter__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 getFilter()<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_filter;<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_filter;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    public boolean getFilter__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_filter__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>    // 22, 1<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void setFormat(String format)<a name="line.107"></a>
+<span class="sourceLineNo">105</span>    private boolean m_filter__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">108</span>    {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      // 22, 1<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      m_format = format;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>      m_format__IsNotDefault = true;<a name="line.111"></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">112</span>    }<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public String getFormat()<a name="line.113"></a>
+<span class="sourceLineNo">113</span>    public String getBcv()<a name="line.113"></a>
 <span class="sourceLineNo">114</span>    {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      return m_format;<a name="line.115"></a>
+<span class="sourceLineNo">115</span>      return m_bcv;<a name="line.115"></a>
 <span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    private String m_format;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    public boolean getFormat__IsNotDefault()<a name="line.118"></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">119</span>    {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      return m_format__IsNotDefault;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>      return m_bcv__IsNotDefault;<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    private boolean m_format__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_bcv__IsNotDefault;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    // 23, 1<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    public void setBcn(String bcn)<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>      // 23, 1<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      m_bcn = bcn;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      m_bcn__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 getBcn()<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_bcn;<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_bcn;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    public boolean getBcn__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_bcn__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_bcn__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 bcv;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcv(String p_bcv)<a name="line.152"></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">153</span>  {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    (getImplData()).setBcv(p_bcv);<a name="line.154"></a>
+<span class="sourceLineNo">154</span>    (getImplData()).setFormat(p_format);<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 filter;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFilter(String p_filter)<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()).setFilter(p_filter);<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 format;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFormat(String p_format)<a name="line.166"></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">167</span>  {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    (getImplData()).setFormat(p_format);<a name="line.168"></a>
+<span class="sourceLineNo">168</span>    (getImplData()).setBcv(p_bcv);<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 bcn;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcn(String p_bcn)<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()).setBcn(p_bcn);<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/f30982bd/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 d02b86d..372987f 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 = "bcv", 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 = "format", 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 = "format", type = "String"),<a name="line.28"></a>
+<span class="sourceLineNo">029</span>    @org.jamon.annotations.Argument(name = "filter", 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 = "bcn", 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>    // 24, 1<a name="line.72"></a>
-<span class="sourceLineNo">073</span>    public void setBcv(String bcv)<a name="line.73"></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">074</span>    {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      // 24, 1<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      m_bcv = bcv;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>      m_bcv__IsNotDefault = true;<a name="line.77"></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">078</span>    }<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    public String getBcv()<a name="line.79"></a>
+<span class="sourceLineNo">079</span>    public String getFormat()<a name="line.79"></a>
 <span class="sourceLineNo">080</span>    {<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      return m_bcv;<a name="line.81"></a>
+<span class="sourceLineNo">081</span>      return m_format;<a name="line.81"></a>
 <span class="sourceLineNo">082</span>    }<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    private String m_bcv;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    public boolean getBcv__IsNotDefault()<a name="line.84"></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">085</span>    {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      return m_bcv__IsNotDefault;<a name="line.86"></a>
+<span class="sourceLineNo">086</span>      return m_format__IsNotDefault;<a name="line.86"></a>
 <span class="sourceLineNo">087</span>    }<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    private boolean m_bcv__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_format__IsNotDefault;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    // 21, 1<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    public void setFilter(String filter)<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>      // 21, 1<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      m_filter = filter;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      m_filter__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 getFilter()<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_filter;<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_filter;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    public boolean getFilter__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_filter__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>    // 22, 1<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public void setFormat(String format)<a name="line.107"></a>
+<span class="sourceLineNo">105</span>    private boolean m_filter__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">108</span>    {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      // 22, 1<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      m_format = format;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>      m_format__IsNotDefault = true;<a name="line.111"></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">112</span>    }<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public String getFormat()<a name="line.113"></a>
+<span class="sourceLineNo">113</span>    public String getBcv()<a name="line.113"></a>
 <span class="sourceLineNo">114</span>    {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      return m_format;<a name="line.115"></a>
+<span class="sourceLineNo">115</span>      return m_bcv;<a name="line.115"></a>
 <span class="sourceLineNo">116</span>    }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    private String m_format;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    public boolean getFormat__IsNotDefault()<a name="line.118"></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">119</span>    {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      return m_format__IsNotDefault;<a name="line.120"></a>
+<span class="sourceLineNo">120</span>      return m_bcv__IsNotDefault;<a name="line.120"></a>
 <span class="sourceLineNo">121</span>    }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    private boolean m_format__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_bcv__IsNotDefault;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    // 23, 1<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    public void setBcn(String bcn)<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>      // 23, 1<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      m_bcn = bcn;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      m_bcn__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 getBcn()<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_bcn;<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_bcn;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    public boolean getBcn__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_bcn__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_bcn__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 bcv;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcv(String p_bcv)<a name="line.152"></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">153</span>  {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    (getImplData()).setBcv(p_bcv);<a name="line.154"></a>
+<span class="sourceLineNo">154</span>    (getImplData()).setFormat(p_format);<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 filter;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFilter(String p_filter)<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()).setFilter(p_filter);<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 format;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setFormat(String p_format)<a name="line.166"></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">167</span>  {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    (getImplData()).setFormat(p_format);<a name="line.168"></a>
+<span class="sourceLineNo">168</span>    (getImplData()).setBcv(p_bcv);<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 bcn;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public final org.apache.hadoop.hbase.tmpl.regionserver.RSStatusTmpl setBcn(String p_bcn)<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()).setBcn(p_bcn);<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>


[22/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html
index 289df25..2470b8f 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html
@@ -101,7 +101,7 @@
 <span class="sourceLineNo">093</span>  /* row is not private for tests */<a name="line.93"></a>
 <span class="sourceLineNo">094</span>  /** Row the query is on */<a name="line.94"></a>
 <span class="sourceLineNo">095</span>  Cell curCell;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  <a name="line.96"></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>   * Oldest put in any of the involved store files<a name="line.98"></a>
 <span class="sourceLineNo">099</span>   * Used to decide whether it is ok to delete<a name="line.99"></a>
@@ -127,7 +127,7 @@
 <span class="sourceLineNo">119</span>   * first column.<a name="line.119"></a>
 <span class="sourceLineNo">120</span>   * */<a name="line.120"></a>
 <span class="sourceLineNo">121</span>  private boolean hasNullColumn = true;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  <a name="line.122"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
 <span class="sourceLineNo">123</span>  private RegionCoprocessorHost regionCoprocessorHost= null;<a name="line.123"></a>
 <span class="sourceLineNo">124</span><a name="line.124"></a>
 <span class="sourceLineNo">125</span>  // By default, when hbase.hstore.time.to.purge.deletes is 0ms, a delete<a name="line.125"></a>
@@ -148,22 +148,22 @@
 <span class="sourceLineNo">140</span>  // currently influencing. This is because Puts, that this delete can<a name="line.140"></a>
 <span class="sourceLineNo">141</span>  // influence.  may appear out of order.<a name="line.141"></a>
 <span class="sourceLineNo">142</span>  private final long timeToPurgeDeletes;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  <a name="line.143"></a>
+<span class="sourceLineNo">143</span><a name="line.143"></a>
 <span class="sourceLineNo">144</span>  private final boolean isUserScan;<a name="line.144"></a>
 <span class="sourceLineNo">145</span><a name="line.145"></a>
 <span class="sourceLineNo">146</span>  private final boolean isReversed;<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>   * Construct a QueryMatcher for a scan<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * @param scan<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * @param scanInfo The store's immutable scan info<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * @param columns<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * @param scanType Type of the scan<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * @param earliestPutTs Earliest put seen in any of the store files.<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * @param oldestUnexpiredTS the oldest timestamp we are interested in,<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   *  based on TTL<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * @param regionCoprocessorHost <a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * @throws IOException <a name="line.158"></a>
+<span class="sourceLineNo">149</span>   * True if we are doing a 'Get' Scan. Every Get is actually a one-row Scan.<a name="line.149"></a>
+<span class="sourceLineNo">150</span>   */<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private final boolean get;<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>   * Construct a QueryMatcher for a scan<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * @param scanInfo The store's immutable scan info<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   * @param scanType Type of the scan<a name="line.156"></a>
+<span class="sourceLineNo">157</span>   * @param earliestPutTs Earliest put seen in any of the store files.<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   * @param oldestUnexpiredTS the oldest timestamp we are interested in, based on TTL<a name="line.158"></a>
 <span class="sourceLineNo">159</span>   */<a name="line.159"></a>
 <span class="sourceLineNo">160</span>  public ScanQueryMatcher(Scan scan, ScanInfo scanInfo, NavigableSet&lt;byte[]&gt; columns,<a name="line.160"></a>
 <span class="sourceLineNo">161</span>      ScanType scanType, long readPointToUse, long earliestPutTs, long oldestUnexpiredTS,<a name="line.161"></a>
@@ -174,518 +174,524 @@
 <span class="sourceLineNo">166</span>    } else {<a name="line.166"></a>
 <span class="sourceLineNo">167</span>      this.tr = timeRange;<a name="line.167"></a>
 <span class="sourceLineNo">168</span>    }<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    this.rowComparator = scanInfo.getComparator();<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    this.regionCoprocessorHost = regionCoprocessorHost;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    this.deletes =  instantiateDeleteTracker();<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    this.stopRow = scan.getStopRow();<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    this.startKey = CellUtil.createFirstDeleteFamilyCellOnRow(scan.getStartRow(),<a name="line.173"></a>
-<span class="sourceLineNo">174</span>        scanInfo.getFamily());<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    this.filter = scan.getFilter();<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    this.earliestPutTs = earliestPutTs;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    this.oldestUnexpiredTS = oldestUnexpiredTS;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    this.now = now;<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>    this.maxReadPointToTrackVersions = readPointToUse;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    this.timeToPurgeDeletes = scanInfo.getTimeToPurgeDeletes();<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    this.ttl = oldestUnexpiredTS;<a name="line.182"></a>
-<span class="sourceLineNo">183</span><a name="line.183"></a>
-<span class="sourceLineNo">184</span>    /* how to deal with deletes */<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    this.isUserScan = scanType == ScanType.USER_SCAN;<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    // keep deleted cells: if compaction or raw scan<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    this.keepDeletedCells = scan.isRaw() ? KeepDeletedCells.TRUE :<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      isUserScan ? KeepDeletedCells.FALSE : scanInfo.getKeepDeletedCells();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    // retain deletes: if minor compaction or raw scanisDone<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    this.retainDeletesInOutput = scanType == ScanType.COMPACT_RETAIN_DELETES || scan.isRaw();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    // seePastDeleteMarker: user initiated scans<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    this.seePastDeleteMarkers =<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        scanInfo.getKeepDeletedCells() != KeepDeletedCells.FALSE &amp;&amp; isUserScan;<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>    int maxVersions =<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        scan.isRaw() ? scan.getMaxVersions() : Math.min(scan.getMaxVersions(),<a name="line.196"></a>
-<span class="sourceLineNo">197</span>          scanInfo.getMaxVersions());<a name="line.197"></a>
-<span class="sourceLineNo">198</span><a name="line.198"></a>
-<span class="sourceLineNo">199</span>    // Single branch to deal with two types of reads (columns vs all in family)<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    if (columns == null || columns.size() == 0) {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      // there is always a null column in the wildcard column query.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      hasNullColumn = true;<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span>      // use a specialized scan for wildcard column tracker.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      this.columns = new ScanWildcardColumnTracker(<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          scanInfo.getMinVersions(), maxVersions, oldestUnexpiredTS);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    } else {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      // whether there is null column in the explicit column query<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      hasNullColumn = (columns.first().length == 0);<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>      // We can share the ExplicitColumnTracker, diff is we reset<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      // between rows, not between storefiles.<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      this.columns = new ExplicitColumnTracker(columns, scanInfo.getMinVersions(), maxVersions,<a name="line.213"></a>
-<span class="sourceLineNo">214</span>          oldestUnexpiredTS);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    this.isReversed = scan.isReversed();<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  }<a name="line.217"></a>
-<span class="sourceLineNo">218</span><a name="line.218"></a>
-<span class="sourceLineNo">219</span>  private DeleteTracker instantiateDeleteTracker() throws IOException {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    DeleteTracker tracker = new ScanDeleteTracker();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    if (regionCoprocessorHost != null) {<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      tracker = regionCoprocessorHost.postInstantiateDeleteTracker(tracker);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    return tracker;<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>  /**<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * Construct a QueryMatcher for a scan that drop deletes from a limited range of rows.<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   * @param scan<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * @param scanInfo The store's immutable scan info<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   * @param columns<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * @param earliestPutTs Earliest put seen in any of the store files.<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * @param oldestUnexpiredTS the oldest timestamp we are interested in, based on TTL<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * @param now the current server time<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   * @param dropDeletesFromRow The inclusive left bound of the range; can be EMPTY_START_ROW.<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * @param dropDeletesToRow The exclusive right bound of the range; can be EMPTY_END_ROW.<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @param regionCoprocessorHost <a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @throws IOException <a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public ScanQueryMatcher(Scan scan, ScanInfo scanInfo, NavigableSet&lt;byte[]&gt; columns,<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      long readPointToUse, long earliestPutTs, long oldestUnexpiredTS, long now,<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      byte[] dropDeletesFromRow, byte[] dropDeletesToRow,<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      RegionCoprocessorHost regionCoprocessorHost) throws IOException {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    this(scan, scanInfo, columns, ScanType.COMPACT_RETAIN_DELETES, readPointToUse, earliestPutTs,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>        oldestUnexpiredTS, now, regionCoprocessorHost);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    Preconditions.checkArgument((dropDeletesFromRow != null) &amp;&amp; (dropDeletesToRow != null));<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    this.dropDeletesFromRow = dropDeletesFromRow;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    this.dropDeletesToRow = dropDeletesToRow;<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>   * Constructor for tests<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  ScanQueryMatcher(Scan scan, ScanInfo scanInfo,<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      NavigableSet&lt;byte[]&gt; columns, long oldestUnexpiredTS, long now) throws IOException {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    this(scan, scanInfo, columns, ScanType.USER_SCAN,<a name="line.256"></a>
-<span class="sourceLineNo">257</span>          Long.MAX_VALUE, /* max Readpoint to track versions */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        HConstants.LATEST_TIMESTAMP, oldestUnexpiredTS, now, null);<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>   * @return  whether there is an null column in the query<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public boolean hasNullColumnInQuery() {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    return hasNullColumn;<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>   * Determines if the caller should do one of several things:<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * - seek/skip to the next row (MatchCode.SEEK_NEXT_ROW)<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * - seek/skip to the next column (MatchCode.SEEK_NEXT_COL)<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   * - include the current KeyValue (MatchCode.INCLUDE)<a name="line.273"></a>
-<span class="sourceLineNo">274</span>   * - ignore the current KeyValue (MatchCode.SKIP)<a name="line.274"></a>
-<span class="sourceLineNo">275</span>   * - got to the next row (MatchCode.DONE)<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   *<a name="line.276"></a>
-<span class="sourceLineNo">277</span>   * @param cell KeyValue to check<a name="line.277"></a>
-<span class="sourceLineNo">278</span>   * @return The match code instance.<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   * @throws IOException in case there is an internal consistency problem<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   *      caused by a data corruption.<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   */<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  public MatchCode match(Cell cell) throws IOException {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      if (filter != null &amp;&amp; filter.filterAllRemaining()) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      return MatchCode.DONE_SCAN;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    }<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    if (curCell != null) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      int ret = this.rowComparator.compareRows(curCell, cell);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      if (!this.isReversed) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>        if (ret &lt;= -1) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          return MatchCode.DONE;<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        } else if (ret &gt;= 1) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          // could optimize this, if necessary?<a name="line.292"></a>
-<span class="sourceLineNo">293</span>          // Could also be called SEEK_TO_CURRENT_ROW, but this<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          // should be rare/never happens.<a name="line.294"></a>
-<span class="sourceLineNo">295</span>          return MatchCode.SEEK_NEXT_ROW;<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      } else {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        if (ret &lt;= -1) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>          return MatchCode.SEEK_NEXT_ROW;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        } else if (ret &gt;= 1) {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>          return MatchCode.DONE;<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>    } else {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      // Since the curCell is null it means we are already sure that we have moved over to the next row<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      return MatchCode.DONE;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    }<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>    // optimize case.<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    if (this.stickyNextRow) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      return MatchCode.SEEK_NEXT_ROW;<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>    if (this.columns.done()) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      stickyNextRow = true;<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      return MatchCode.SEEK_NEXT_ROW;<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>    long timestamp = cell.getTimestamp();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    // check for early out based on timestamp alone<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    if (columns.isDone(timestamp)) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      return columns.getNextRowOrNextColumn(cell);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    // check if the cell is expired by cell TTL<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    if (HStore.isCellTTLExpired(cell, this.oldestUnexpiredTS, this.now)) {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      return MatchCode.SKIP;<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">330</span>     * The delete logic is pretty complicated now.<a name="line.330"></a>
-<span class="sourceLineNo">331</span>     * This is corroborated by the following:<a name="line.331"></a>
-<span class="sourceLineNo">332</span>     * 1. The store might be instructed to keep deleted rows around.<a name="line.332"></a>
-<span class="sourceLineNo">333</span>     * 2. A scan can optionally see past a delete marker now.<a name="line.333"></a>
-<span class="sourceLineNo">334</span>     * 3. If deleted rows are kept, we have to find out when we can<a name="line.334"></a>
-<span class="sourceLineNo">335</span>     *    remove the delete markers.<a name="line.335"></a>
-<span class="sourceLineNo">336</span>     * 4. Family delete markers are always first (regardless of their TS)<a name="line.336"></a>
-<span class="sourceLineNo">337</span>     * 5. Delete markers should not be counted as version<a name="line.337"></a>
-<span class="sourceLineNo">338</span>     * 6. Delete markers affect puts of the *same* TS<a name="line.338"></a>
-<span class="sourceLineNo">339</span>     * 7. Delete marker need to be version counted together with puts<a name="line.339"></a>
-<span class="sourceLineNo">340</span>     *    they affect<a name="line.340"></a>
-<span class="sourceLineNo">341</span>     */<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    byte typeByte = cell.getTypeByte();<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    long mvccVersion = cell.getSequenceId();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    if (CellUtil.isDelete(cell)) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      if (keepDeletedCells == KeepDeletedCells.FALSE<a name="line.345"></a>
-<span class="sourceLineNo">346</span>          || (keepDeletedCells == KeepDeletedCells.TTL &amp;&amp; timestamp &lt; ttl)) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>        // first ignore delete markers if the scanner can do so, and the<a name="line.347"></a>
-<span class="sourceLineNo">348</span>        // range does not include the marker<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        //<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        // during flushes and compactions also ignore delete markers newer<a name="line.350"></a>
-<span class="sourceLineNo">351</span>        // than the readpoint of any open scanner, this prevents deleted<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        // rows that could still be seen by a scanner from being collected<a name="line.352"></a>
-<span class="sourceLineNo">353</span>        boolean includeDeleteMarker = seePastDeleteMarkers ?<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            tr.withinTimeRange(timestamp) :<a name="line.354"></a>
-<span class="sourceLineNo">355</span>            tr.withinOrAfterTimeRange(timestamp);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        if (includeDeleteMarker<a name="line.356"></a>
-<span class="sourceLineNo">357</span>            &amp;&amp; mvccVersion &lt;= maxReadPointToTrackVersions) {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>          this.deletes.add(cell);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        // Can't early out now, because DelFam come before any other keys<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      }<a name="line.361"></a>
-<span class="sourceLineNo">362</span>     <a name="line.362"></a>
-<span class="sourceLineNo">363</span>      if ((!isUserScan)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          &amp;&amp; timeToPurgeDeletes &gt; 0<a name="line.364"></a>
-<span class="sourceLineNo">365</span>          &amp;&amp; (EnvironmentEdgeManager.currentTime() - timestamp) <a name="line.365"></a>
-<span class="sourceLineNo">366</span>            &lt;= timeToPurgeDeletes) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        return MatchCode.INCLUDE;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      } else if (retainDeletesInOutput || mvccVersion &gt; maxReadPointToTrackVersions) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        // always include or it is not time yet to check whether it is OK<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        // to purge deltes or not<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        if (!isUserScan) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          // if this is not a user scan (compaction), we can filter this deletemarker right here<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          // otherwise (i.e. a "raw" scan) we fall through to normal version and timerange checking<a name="line.373"></a>
-<span class="sourceLineNo">374</span>          return MatchCode.INCLUDE;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        }<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      } else if (keepDeletedCells == KeepDeletedCells.TRUE<a name="line.376"></a>
-<span class="sourceLineNo">377</span>          || (keepDeletedCells == KeepDeletedCells.TTL &amp;&amp; timestamp &gt;= ttl)) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>        if (timestamp &lt; earliestPutTs) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>          // keeping delete rows, but there are no puts older than<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          // this delete in the store files.<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          return columns.getNextRowOrNextColumn(cell);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        }<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        // else: fall through and do version counting on the<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        // delete markers<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      } else {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        return MatchCode.SKIP;<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      // note the following next else if...<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      // delete marker are not subject to other delete markers<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    } else if (!this.deletes.isEmpty()) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      DeleteResult deleteResult = deletes.isDeleted(cell);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      switch (deleteResult) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        case FAMILY_DELETED:<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        case COLUMN_DELETED:<a name="line.394"></a>
-<span class="sourceLineNo">395</span>          return columns.getNextRowOrNextColumn(cell);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        case VERSION_DELETED:<a name="line.396"></a>
-<span class="sourceLineNo">397</span>        case FAMILY_VERSION_DELETED:<a name="line.397"></a>
-<span class="sourceLineNo">398</span>          return MatchCode.SKIP;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>        case NOT_DELETED:<a name="line.399"></a>
-<span class="sourceLineNo">400</span>          break;<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        default:<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          throw new RuntimeException("UNEXPECTED");<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>    int timestampComparison = tr.compare(timestamp);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (timestampComparison &gt;= 1) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      return MatchCode.SKIP;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    } else if (timestampComparison &lt;= -1) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      return columns.getNextRowOrNextColumn(cell);<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>    // STEP 1: Check if the column is part of the requested columns<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    MatchCode colChecker = columns.checkColumn(cell, typeByte);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    if (colChecker == MatchCode.INCLUDE) {<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      ReturnCode filterResponse = ReturnCode.SKIP;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      // STEP 2: Yes, the column is part of the requested columns. Check if filter is present<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      if (filter != null) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>        // STEP 3: Filter the key value and return if it filters out<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        filterResponse = filter.filterKeyValue(cell);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>        switch (filterResponse) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        case SKIP:<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          return MatchCode.SKIP;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>        case NEXT_COL:<a name="line.424"></a>
-<span class="sourceLineNo">425</span>          return columns.getNextRowOrNextColumn(cell);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        case NEXT_ROW:<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          stickyNextRow = true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          return MatchCode.SEEK_NEXT_ROW;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        case SEEK_NEXT_USING_HINT:<a name="line.429"></a>
-<span class="sourceLineNo">430</span>          return MatchCode.SEEK_NEXT_USING_HINT;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        default:<a name="line.431"></a>
-<span class="sourceLineNo">432</span>          //It means it is either include or include and seek next<a name="line.432"></a>
-<span class="sourceLineNo">433</span>          break;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      }<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      /*<a name="line.436"></a>
-<span class="sourceLineNo">437</span>       * STEP 4: Reaching this step means the column is part of the requested columns and either<a name="line.437"></a>
-<span class="sourceLineNo">438</span>       * the filter is null or the filter has returned INCLUDE or INCLUDE_AND_NEXT_COL response.<a name="line.438"></a>
-<span class="sourceLineNo">439</span>       * Now check the number of versions needed. This method call returns SKIP, INCLUDE,<a name="line.439"></a>
-<span class="sourceLineNo">440</span>       * INCLUDE_AND_SEEK_NEXT_ROW, INCLUDE_AND_SEEK_NEXT_COL.<a name="line.440"></a>
-<span class="sourceLineNo">441</span>       *<a name="line.441"></a>
-<span class="sourceLineNo">442</span>       * FilterResponse            ColumnChecker               Desired behavior<a name="line.442"></a>
-<span class="sourceLineNo">443</span>       * INCLUDE                   SKIP                        row has already been included, SKIP.<a name="line.443"></a>
-<span class="sourceLineNo">444</span>       * INCLUDE                   INCLUDE                     INCLUDE<a name="line.444"></a>
-<span class="sourceLineNo">445</span>       * INCLUDE                   INCLUDE_AND_SEEK_NEXT_COL   INCLUDE_AND_SEEK_NEXT_COL<a name="line.445"></a>
-<span class="sourceLineNo">446</span>       * INCLUDE                   INCLUDE_AND_SEEK_NEXT_ROW   INCLUDE_AND_SEEK_NEXT_ROW<a name="line.446"></a>
-<span class="sourceLineNo">447</span>       * INCLUDE_AND_SEEK_NEXT_COL SKIP                        row has already been included, SKIP.<a name="line.447"></a>
-<span class="sourceLineNo">448</span>       * INCLUDE_AND_SEEK_NEXT_COL INCLUDE                     INCLUDE_AND_SEEK_NEXT_COL<a name="line.448"></a>
-<span class="sourceLineNo">449</span>       * INCLUDE_AND_SEEK_NEXT_COL INCLUDE_AND_SEEK_NEXT_COL   INCLUDE_AND_SEEK_NEXT_COL<a name="line.449"></a>
-<span class="sourceLineNo">450</span>       * INCLUDE_AND_SEEK_NEXT_COL INCLUDE_AND_SEEK_NEXT_ROW   INCLUDE_AND_SEEK_NEXT_ROW<a name="line.450"></a>
-<span class="sourceLineNo">451</span>       *<a name="line.451"></a>
-<span class="sourceLineNo">452</span>       * In all the above scenarios, we return the column checker return value except for<a name="line.452"></a>
-<span class="sourceLineNo">453</span>       * FilterResponse (INCLUDE_AND_SEEK_NEXT_COL) and ColumnChecker(INCLUDE)<a name="line.453"></a>
-<span class="sourceLineNo">454</span>       */<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      colChecker = columns.checkVersions(cell, timestamp, typeByte,<a name="line.455"></a>
-<span class="sourceLineNo">456</span>          mvccVersion &gt; maxReadPointToTrackVersions);<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      //Optimize with stickyNextRow<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      boolean seekNextRowFromEssential = filterResponse == ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW &amp;&amp;<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          filter.isFamilyEssential(cell.getFamilyArray());<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      if (colChecker == MatchCode.INCLUDE_AND_SEEK_NEXT_ROW || seekNextRowFromEssential) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>        stickyNextRow = true;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      if (filterResponse == ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        if (colChecker != MatchCode.SKIP) {<a name="line.464"></a>
-<span class="sourceLineNo">465</span>          return MatchCode.INCLUDE_AND_SEEK_NEXT_ROW;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        }<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        return MatchCode.SEEK_NEXT_ROW;<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      return (filterResponse == ReturnCode.INCLUDE_AND_NEXT_COL &amp;&amp;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          colChecker == MatchCode.INCLUDE) ? MatchCode.INCLUDE_AND_SEEK_NEXT_COL<a name="line.470"></a>
-<span class="sourceLineNo">471</span>          : colChecker;<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    stickyNextRow = (colChecker == MatchCode.SEEK_NEXT_ROW) ? true<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        : stickyNextRow;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    return colChecker;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
-<span class="sourceLineNo">477</span><a name="line.477"></a>
-<span class="sourceLineNo">478</span>  /** Handle partial-drop-deletes. As we match keys in order, when we have a range from which<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * we can drop deletes, we can set retainDeletesInOutput to false for the duration of this<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   * range only, and maintain consistency. */<a name="line.480"></a>
-<span class="sourceLineNo">481</span>  private void checkPartialDropDeleteRange(Cell curCell) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    // If partial-drop-deletes are used, initially, dropDeletesFromRow and dropDeletesToRow<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    // are both set, and the matcher is set to retain deletes. We assume ordered keys. When<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    // dropDeletesFromRow is leq current kv, we start dropping deletes and reset<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    // dropDeletesFromRow; thus the 2nd "if" starts to apply.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    if ((dropDeletesFromRow != null)<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        &amp;&amp; (Arrays.equals(dropDeletesFromRow, HConstants.EMPTY_START_ROW) ||<a name="line.487"></a>
-<span class="sourceLineNo">488</span>            (CellComparator.COMPARATOR.compareRows(curCell, dropDeletesFromRow, 0,<a name="line.488"></a>
-<span class="sourceLineNo">489</span>                dropDeletesFromRow.length) &gt;= 0))) {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>      retainDeletesInOutput = false;<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      dropDeletesFromRow = null;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    }<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    // If dropDeletesFromRow is null and dropDeletesToRow is set, we are inside the partial-<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    // drop-deletes range. When dropDeletesToRow is leq current kv, we stop dropping deletes,<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    // and reset dropDeletesToRow so that we don't do any more compares.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    if ((dropDeletesFromRow == null)<a name="line.496"></a>
-<span class="sourceLineNo">497</span>        &amp;&amp; (dropDeletesToRow != null)<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        &amp;&amp; !Arrays.equals(dropDeletesToRow, HConstants.EMPTY_END_ROW)<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        &amp;&amp; (CellComparator.COMPARATOR<a name="line.499"></a>
-<span class="sourceLineNo">500</span>            .compareRows(curCell, dropDeletesToRow, 0, dropDeletesToRow.length) &gt;= 0)) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      retainDeletesInOutput = true;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      dropDeletesToRow = null;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    }<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>  public boolean moreRowsMayExistAfter(Cell kv) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    if (this.isReversed) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      if (rowComparator.compareRows(kv, stopRow, 0, stopRow.length) &lt;= 0) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        return false;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      } else {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        return true;<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      }<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    if (!Bytes.equals(stopRow , HConstants.EMPTY_END_ROW) &amp;&amp;<a name="line.514"></a>
-<span class="sourceLineNo">515</span>        rowComparator.compareRows(kv, stopRow, 0, stopRow.length) &gt;= 0) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      // KV &gt;= STOPROW<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      // then NO there is nothing left.<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      return false;<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    } else {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      return true;<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    }<a name="line.521"></a>
-<span class="sourceLineNo">522</span>  }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>  /**<a name="line.524"></a>
-<span class="sourceLineNo">525</span>   * Set the row when there is change in row<a name="line.525"></a>
-<span class="sourceLineNo">526</span>   * @param curCell<a name="line.526"></a>
-<span class="sourceLineNo">527</span>   */<a name="line.527"></a>
-<span class="sourceLineNo">528</span>  public void setToNewRow(Cell curCell) {<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    checkPartialDropDeleteRange(curCell);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    this.curCell = curCell;<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    reset();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>  }<a name="line.532"></a>
-<span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>  public void reset() {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    this.deletes.reset();<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    this.columns.reset();<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>    stickyNextRow = false;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   *<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   * @return the start key<a name="line.543"></a>
-<span class="sourceLineNo">544</span>   */<a name="line.544"></a>
-<span class="sourceLineNo">545</span>  public Cell getStartKey() {<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    return this.startKey;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  /**<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   *<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @return the Filter<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  Filter getFilter() {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return this.filter;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  public Cell getNextKeyHint(Cell kv) throws IOException {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    if (filter == null) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      return null;<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    } else {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      return filter.getNextCellHint(kv);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>  }<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>  public Cell getKeyForNextColumn(Cell kv) {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    ColumnCount nextColumn = columns.getColumnHint();<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    if (nextColumn == null) {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      return CellUtil.createLastOnRowCol(kv);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    } else {<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      return CellUtil.createFirstOnRowCol(kv, nextColumn.getBuffer(), nextColumn.getOffset(),<a name="line.570"></a>
-<span class="sourceLineNo">571</span>          nextColumn.getLength());<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    }<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  }<a name="line.573"></a>
-<span class="sourceLineNo">574</span><a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public Cell getKeyForNextRow(Cell c) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    return CellUtil.createLastOnRow(c);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>  }<a name="line.577"></a>
-<span class="sourceLineNo">578</span><a name="line.578"></a>
-<span class="sourceLineNo">579</span>  /**<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   * @param nextIndexed the key of the next entry in the block index (if any)<a name="line.580"></a>
-<span class="sourceLineNo">581</span>   * @param kv The Cell we're using to calculate the seek key<a name="line.581"></a>
-<span class="sourceLineNo">582</span>   * @return result of the compare between the indexed key and the key portion of the passed cell<a name="line.582"></a>
-<span class="sourceLineNo">583</span>   */<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  public int compareKeyForNextRow(Cell nextIndexed, Cell kv) {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return rowComparator.compareKeyBasedOnColHint(nextIndexed, kv, 0, 0, null, 0, 0,<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        HConstants.OLDEST_TIMESTAMP, Type.Minimum.getCode());<a name="line.586"></a>
-<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
-<span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>  /**<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * @param nextIndexed the key of the next entry in the block index (if any)<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   * @param currentCell The Cell we're using to calculate the seek key<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @return result of the compare between the indexed key and the key portion of the passed cell<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  public int compareKeyForNextColumn(Cell nextIndexed, Cell currentCell) {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    ColumnCount nextColumn = columns.getColumnHint();<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    if (nextColumn == null) {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      return rowComparator.compareKeyBasedOnColHint(nextIndexed, currentCell, 0, 0, null, 0, 0,<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          HConstants.OLDEST_TIMESTAMP, Type.Minimum.getCode());<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    } else {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      return rowComparator.compareKeyBasedOnColHint(nextIndexed, currentCell,<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          currentCell.getFamilyOffset(), currentCell.getFamilyLength(), nextColumn.getBuffer(),<a name="line.601"></a>
-<span class="sourceLineNo">602</span>          nextColumn.getOffset(), nextColumn.getLength(), HConstants.LATEST_TIMESTAMP,<a name="line.602"></a>
-<span class="sourceLineNo">603</span>          Type.Maximum.getCode());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  //Used only for testing purposes<a name="line.607"></a>
-<span class="sourceLineNo">608</span>  static MatchCode checkColumn(ColumnTracker columnTracker, byte[] bytes, int offset,<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      int length, long ttl, byte type, boolean ignoreCount) throws IOException {<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    KeyValue kv = KeyValueUtil.createFirstOnRow(HConstants.EMPTY_BYTE_ARRAY, 0, 0,<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        HConstants.EMPTY_BYTE_ARRAY, 0, 0, bytes, offset, length);<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    MatchCode matchCode = columnTracker.checkColumn(kv, type);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    if (matchCode == MatchCode.INCLUDE) {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      return columnTracker.checkVersions(kv, ttl, type, ignoreCount);<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    }<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    return matchCode;<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * {@link #match} return codes.  These instruct the scanner moving through<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * memstores and StoreFiles what to do with the current KeyValue.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * &lt;p&gt;<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * Additionally, this contains "early-out" language to tell the scanner to<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * move on to the next File (memstore or Storefile), or to return immediately.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  public static enum MatchCode {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    /**<a name="line.627"></a>
-<span class="sourceLineNo">628</span>     * Include KeyValue in the returned result<a name="line.628"></a>
-<span class="sourceLineNo">629</span>     */<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    INCLUDE,<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    /**<a name="line.632"></a>
-<span class="sourceLineNo">633</span>     * Do not include KeyValue in the returned result<a name="line.633"></a>
-<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    SKIP,<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>    /**<a name="line.637"></a>
-<span class="sourceLineNo">638</span>     * Do not include, jump to next StoreFile or memstore (in time order)<a name="line.638"></a>
-<span class="sourceLineNo">639</span>     */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    NEXT,<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>    /**<a name="line.642"></a>
-<span class="sourceLineNo">643</span>     * Do not include, return current result<a name="line.643"></a>
-<span class="sourceLineNo">644</span>     */<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    DONE,<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>    /**<a name="line.647"></a>
-<span class="sourceLineNo">648</span>     * These codes are used by the ScanQueryMatcher<a name="line.648"></a>
-<span class="sourceLineNo">649</span>     */<a name="line.649"></a>
-<span class="sourceLineNo">650</span><a name="line.650"></a>
-<span class="sourceLineNo">651</span>    /**<a name="line.651"></a>
-<span class="sourceLineNo">652</span>     * Done with the row, seek there.<a name="line.652"></a>
-<span class="sourceLineNo">653</span>     */<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    SEEK_NEXT_ROW,<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    /**<a name="line.655"></a>
-<span class="sourceLineNo">656</span>     * Done with column, seek to next.<a name="line.656"></a>
-<span class="sourceLineNo">657</span>     */<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    SEEK_NEXT_COL,<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>    /**<a name="line.660"></a>
-<span class="sourceLineNo">661</span>     * Done with scan, thanks to the row filter.<a name="line.661"></a>
-<span class="sourceLineNo">662</span>     */<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    DONE_SCAN,<a name="line.663"></a>
-<span class="sourceLineNo">664</span><a name="line.664"></a>
-<span class="sourceLineNo">665</span>    /*<a name="line.665"></a>
-<span class="sourceLineNo">666</span>     * Seek to next key which is given as hint.<a name="line.666"></a>
-<span class="sourceLineNo">667</span>     */<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    SEEK_NEXT_USING_HINT,<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    /**<a name="line.670"></a>
-<span class="sourceLineNo">671</span>     * Include KeyValue and done with column, seek to next.<a name="line.671"></a>
-<span class="sourceLineNo">672</span>     */<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    INCLUDE_AND_SEEK_NEXT_COL,<a name="line.673"></a>
-<span class="sourceLineNo">674</span><a name="line.674"></a>
-<span class="sourceLineNo">675</span>    /**<a name="line.675"></a>
-<span class="sourceLineNo">676</span>     * Include KeyValue and done with row, seek to next.<a name="line.676"></a>
-<span class="sourceLineNo">677</span>     */<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    INCLUDE_AND_SEEK_NEXT_ROW,<a name="line.678"></a>
-<span class="sourceLineNo">679</span>  }<a name="line.679"></a>
-<span class="sourceLineNo">680</span>}<a name="line.680"></a>
+<span class="sourceLineNo">169</span>    this.get = scan.isGetScan();<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    this.rowComparator = scanInfo.getComparator();<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    this.regionCoprocessorHost = regionCoprocessorHost;<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    this.deletes =  instantiateDeleteTracker();<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    this.stopRow = scan.getStopRow();<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    this.startKey = CellUtil.createFirstDeleteFamilyCellOnRow(scan.getStartRow(),<a name="line.174"></a>
+<span class="sourceLineNo">175</span>        scanInfo.getFamily());<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    this.filter = scan.getFilter();<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    this.earliestPutTs = earliestPutTs;<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    this.oldestUnexpiredTS = oldestUnexpiredTS;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    this.now = now;<a name="line.179"></a>
+<span class="sourceLineNo">180</span><a name="line.180"></a>
+<span class="sourceLineNo">181</span>    this.maxReadPointToTrackVersions = readPointToUse;<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    this.timeToPurgeDeletes = scanInfo.getTimeToPurgeDeletes();<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    this.ttl = oldestUnexpiredTS;<a name="line.183"></a>
+<span class="sourceLineNo">184</span><a name="line.184"></a>
+<span class="sourceLineNo">185</span>    /* how to deal with deletes */<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    this.isUserScan = scanType == ScanType.USER_SCAN;<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    // keep deleted cells: if compaction or raw scan<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    this.keepDeletedCells = scan.isRaw() ? KeepDeletedCells.TRUE :<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      isUserScan ? KeepDeletedCells.FALSE : scanInfo.getKeepDeletedCells();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    // retain deletes: if minor compaction or raw scanisDone<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    this.retainDeletesInOutput = scanType == ScanType.COMPACT_RETAIN_DELETES || scan.isRaw();<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    // seePastDeleteMarker: user initiated scans<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    this.seePastDeleteMarkers =<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        scanInfo.getKeepDeletedCells() != KeepDeletedCells.FALSE &amp;&amp; isUserScan;<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>    int maxVersions =<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        scan.isRaw() ? scan.getMaxVersions() : Math.min(scan.getMaxVersions(),<a name="line.197"></a>
+<span class="sourceLineNo">198</span>          scanInfo.getMaxVersions());<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>    // Single branch to deal with two types of reads (columns vs all in family)<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    if (columns == null || columns.size() == 0) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      // there is always a null column in the wildcard column query.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      hasNullColumn = true;<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>      // use a specialized scan for wildcard column tracker.<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      this.columns = new ScanWildcardColumnTracker(<a name="line.206"></a>
+<span class="sourceLineNo">207</span>          scanInfo.getMinVersions(), maxVersions, oldestUnexpiredTS);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    } else {<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      // whether there is null column in the explicit column query<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      hasNullColumn = (columns.first().length == 0);<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>      // We can share the ExplicitColumnTracker, diff is we reset<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      // between rows, not between storefiles.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      this.columns = new ExplicitColumnTracker(columns, scanInfo.getMinVersions(), maxVersions,<a name="line.214"></a>
+<span class="sourceLineNo">215</span>          oldestUnexpiredTS);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    }<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    this.isReversed = scan.isReversed();<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>  private DeleteTracker instantiateDeleteTracker() throws IOException {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    DeleteTracker tracker = new ScanDeleteTracker();<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    if (regionCoprocessorHost != null) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      tracker = regionCoprocessorHost.postInstantiateDeleteTracker(tracker);<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    return tracker;<a name="line.225"></a>
+<span class="sourceLineNo">226</span>  }<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>   * Construct a QueryMatcher for a scan that drop deletes from a limited range of rows.<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * @param scan<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * @param scanInfo The store's immutable scan info<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   * @param columns<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * @param earliestPutTs Earliest put seen in any of the store files.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @param oldestUnexpiredTS the oldest timestamp we are interested in, based on TTL<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @param now the current server time<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   * @param dropDeletesFromRow The inclusive left bound of the range; can be EMPTY_START_ROW.<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * @param dropDeletesToRow The exclusive right bound of the range; can be EMPTY_END_ROW.<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param regionCoprocessorHost<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @throws IOException<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public ScanQueryMatcher(Scan scan, ScanInfo scanInfo, NavigableSet&lt;byte[]&gt; columns,<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      long readPointToUse, long earliestPutTs, long oldestUnexpiredTS, long now,<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      byte[] dropDeletesFromRow, byte[] dropDeletesToRow,<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      RegionCoprocessorHost regionCoprocessorHost) throws IOException {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    this(scan, scanInfo, columns, ScanType.COMPACT_RETAIN_DELETES, readPointToUse, earliestPutTs,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        oldestUnexpiredTS, now, regionCoprocessorHost);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    Preconditions.checkArgument((dropDeletesFromRow != null) &amp;&amp; (dropDeletesToRow != null));<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    this.dropDeletesFromRow = dropDeletesFromRow;<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    this.dropDeletesToRow = dropDeletesToRow;<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>   * Constructor for tests<a name="line.253"></a>
+<span class="sourceLineNo">254</span>   */<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  ScanQueryMatcher(Scan scan, ScanInfo scanInfo,<a name="line.255"></a>
+<span class="sourceLineNo">256</span>      NavigableSet&lt;byte[]&gt; columns, long oldestUnexpiredTS, long now) throws IOException {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    this(scan, scanInfo, columns, ScanType.USER_SCAN,<a name="line.257"></a>
+<span class="sourceLineNo">258</span>          Long.MAX_VALUE, /* max Readpoint to track versions */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        HConstants.LATEST_TIMESTAMP, oldestUnexpiredTS, now, null);<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>   *<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * @return  whether there is an null column in the query<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public boolean hasNullColumnInQuery() {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    return hasNullColumn;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Determines if the caller should do one of several things:<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * - seek/skip to the next row (MatchCode.SEEK_NEXT_ROW)<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * - seek/skip to the next column (MatchCode.SEEK_NEXT_COL)<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * - include the current KeyValue (MatchCode.INCLUDE)<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   * - ignore the current KeyValue (MatchCode.SKIP)<a name="line.275"></a>
+<span class="sourceLineNo">276</span>   * - got to the next row (MatchCode.DONE)<a name="line.276"></a>
+<span class="sourceLineNo">277</span>   *<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   * @param cell KeyValue to check<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * @return The match code instance.<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   * @throws IOException in case there is an internal consistency problem<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   *      caused by a data corruption.<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   */<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public MatchCode match(Cell cell) throws IOException {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    if (filter != null &amp;&amp; filter.filterAllRemaining()) {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      return MatchCode.DONE_SCAN;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    if (curCell != null) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      int ret = this.rowComparator.compareRows(curCell, cell);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      if (!this.isReversed) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        if (ret &lt;= -1) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>          return MatchCode.DONE;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        } else if (ret &gt;= 1) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>          // could optimize this, if necessary?<a name="line.293"></a>
+<span class="sourceLineNo">294</span>          // Could also be called SEEK_TO_CURRENT_ROW, but this<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          // should be rare/never happens.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          return MatchCode.SEEK_NEXT_ROW;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>        }<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      } else {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>        if (ret &lt;= -1) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>          return MatchCode.SEEK_NEXT_ROW;<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        } else if (ret &gt;= 1) {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          return MatchCode.DONE;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    } else {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      // Since the curCell is null it means we are already sure that we have moved over to the next row<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      return MatchCode.DONE;<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>    // optimize case.<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    if (this.stickyNextRow) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      return MatchCode.SEEK_NEXT_ROW;<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>    if (this.columns.done()) {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      stickyNextRow = true;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      return MatchCode.SEEK_NEXT_ROW;<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>    long timestamp = cell.getTimestamp();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    // check for early out based on timestamp alone<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    if (columns.isDone(timestamp)) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      return columns.getNextRowOrNextColumn(cell);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    }<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    // check if the cell is expired by cell TTL<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    if (HStore.isCellTTLExpired(cell, this.oldestUnexpiredTS, this.now)) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      return MatchCode.SKIP;<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">330</span>    /*<a name="line.330"></a>
+<span class="sourceLineNo">331</span>     * The delete logic is pretty complicated now.<a name="line.331"></a>
+<span class="sourceLineNo">332</span>     * This is corroborated by the following:<a name="line.332"></a>
+<span class="sourceLineNo">333</span>     * 1. The store might be instructed to keep deleted rows around.<a name="line.333"></a>
+<span class="sourceLineNo">334</span>     * 2. A scan can optionally see past a delete marker now.<a name="line.334"></a>
+<span class="sourceLineNo">335</span>     * 3. If deleted rows are kept, we have to find out when we can<a name="line.335"></a>
+<span class="sourceLineNo">336</span>     *    remove the delete markers.<a name="line.336"></a>
+<span class="sourceLineNo">337</span>     * 4. Family delete markers are always first (regardless of their TS)<a name="line.337"></a>
+<span class="sourceLineNo">338</span>     * 5. Delete markers should not be counted as version<a name="line.338"></a>
+<span class="sourceLineNo">339</span>     * 6. Delete markers affect puts of the *same* TS<a name="line.339"></a>
+<span class="sourceLineNo">340</span>     * 7. Delete marker need to be version counted together with puts<a name="line.340"></a>
+<span class="sourceLineNo">341</span>     *    they affect<a name="line.341"></a>
+<span class="sourceLineNo">342</span>     */<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    byte typeByte = cell.getTypeByte();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    long mvccVersion = cell.getSequenceId();<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    if (CellUtil.isDelete(cell)) {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      if (keepDeletedCells == KeepDeletedCells.FALSE<a name="line.346"></a>
+<span class="sourceLineNo">347</span>          || (keepDeletedCells == KeepDeletedCells.TTL &amp;&amp; timestamp &lt; ttl)) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        // first ignore delete markers if the scanner can do so, and the<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        // range does not include the marker<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        //<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        // during flushes and compactions also ignore delete markers newer<a name="line.351"></a>
+<span class="sourceLineNo">352</span>        // than the readpoint of any open scanner, this prevents deleted<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        // rows that could still be seen by a scanner from being collected<a name="line.353"></a>
+<span class="sourceLineNo">354</span>        boolean includeDeleteMarker = seePastDeleteMarkers ?<a name="line.354"></a>
+<span class="sourceLineNo">355</span>            tr.withinTimeRange(timestamp) :<a name="line.355"></a>
+<span class="sourceLineNo">356</span>            tr.withinOrAfterTimeRange(timestamp);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        if (includeDeleteMarker<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            &amp;&amp; mvccVersion &lt;= maxReadPointToTrackVersions) {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>          this.deletes.add(cell);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        }<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        // Can't early out now, because DelFam come before any other keys<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      }<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>      if ((!isUserScan)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>          &amp;&amp; timeToPurgeDeletes &gt; 0<a name="line.365"></a>
+<span class="sourceLineNo">366</span>          &amp;&amp; (EnvironmentEdgeManager.currentTime() - timestamp)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>            &lt;= timeToPurgeDeletes) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        return MatchCode.INCLUDE;<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      } else if (retainDeletesInOutput || mvccVersion &gt; maxReadPointToTrackVersions) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>        // always include or it is not time yet to check whether it is OK<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        // to purge deltes or not<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        if (!isUserScan) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>          // if this is not a user scan (compaction), we can filter this deletemarker right here<a name="line.373"></a>
+<span class="sourceLineNo">374</span>          // otherwise (i.e. a "raw" scan) we fall through to normal version and timerange checking<a name="line.374"></a>
+<span class="sourceLineNo">375</span>          return MatchCode.INCLUDE;<a name="line.375"></a>
+<span class="sourceLineNo">376</span>        }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      } else if (keepDeletedCells == KeepDeletedCells.TRUE<a name="line.377"></a>
+<span class="sourceLineNo">378</span>          || (keepDeletedCells == KeepDeletedCells.TTL &amp;&amp; timestamp &gt;= ttl)) {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        if (timestamp &lt; earliestPutTs) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>          // keeping delete rows, but there are no puts older than<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          // this delete in the store files.<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          return columns.getNextRowOrNextColumn(cell);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>        }<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        // else: fall through and do version counting on the<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        // delete markers<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      } else {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        return MatchCode.SKIP;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      // note the following next else if...<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      // delete marker are not subject to other delete markers<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    } else if (!this.deletes.isEmpty()) {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      DeleteResult deleteResult = deletes.isDeleted(cell);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>      switch (deleteResult) {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>        case FAMILY_DELETED:<a name="line.394"></a>
+<span class="sourceLineNo">395</span>        case COLUMN_DELETED:<a name="line.395"></a>
+<span class="sourceLineNo">396</span>          return columns.getNextRowOrNextColumn(cell);<a name="line.396"></a>
+<span class="sourceLineNo">397</span>        case VERSION_DELETED:<a name="line.397"></a>
+<span class="sourceLineNo">398</span>        case FAMILY_VERSION_DELETED:<a name="line.398"></a>
+<span class="sourceLineNo">399</span>          return MatchCode.SKIP;<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        case NOT_DELETED:<a name="line.400"></a>
+<span class="sourceLineNo">401</span>          break;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>        default:<a name="line.402"></a>
+<span class="sourceLineNo">403</span>          throw new RuntimeException("UNEXPECTED");<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    int timestampComparison = tr.compare(timestamp);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    if (timestampComparison &gt;= 1) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      return MatchCode.SKIP;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    } else if (timestampComparison &lt;= -1) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      return columns.getNextRowOrNextColumn(cell);<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>    // STEP 1: Check if the column is part of the requested columns<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    MatchCode colChecker = columns.checkColumn(cell, typeByte);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    if (colChecker == MatchCode.INCLUDE) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      ReturnCode filterResponse = ReturnCode.SKIP;<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      // STEP 2: Yes, the column is part of the requested columns. Check if filter is present<a name="line.418"></a>
+<span class="sourceLineNo">419</span>      if (filter != null) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        // STEP 3: Filter the key value and return if it filters out<a name="line.420"></a>
+<span class="sourceLineNo">421</span>        filterResponse = filter.filterKeyValue(cell);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        switch (filterResponse) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        case SKIP:<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          return MatchCode.SKIP;<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        case NEXT_COL:<a name="line.425"></a>
+<span class="sourceLineNo">426</span>          return columns.getNextRowOrNextColumn(cell);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        case NEXT_ROW:<a name="line.427"></a>
+<span class="sourceLineNo">428</span>          stickyNextRow = true;<a name="line.428"></a>
+<span class="sourceLineNo">429</span>          return MatchCode.SEEK_NEXT_ROW;<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        case SEEK_NEXT_USING_HINT:<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          return MatchCode.SEEK_NEXT_USING_HINT;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>        default:<a name="line.432"></a>
+<span class="sourceLineNo">433</span>          //It means it is either include or include and seek next<a name="line.433"></a>
+<span class="sourceLineNo">434</span>          break;<a name="line.434"></a>
+<span class="sourceLineNo">435</span>        }<a name="line.435"></a>
+<span class="sourceLineNo">436</span>      }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      /*<a name="line.437"></a>
+<span class="sourceLineNo">438</span>       * STEP 4: Reaching this step means the column is part of the requested columns and either<a name="line.438"></a>
+<span class="sourceLineNo">439</span>       * the filter is null or the filter has returned INCLUDE or INCLUDE_AND_NEXT_COL response.<a name="line.439"></a>
+<span class="sourceLineNo">440</span>       * Now check the number of versions needed. This method call returns SKIP, INCLUDE,<a name="line.440"></a>
+<span class="sourceLineNo">441</span>       * INCLUDE_AND_SEEK_NEXT_ROW, INCLUDE_AND_SEEK_NEXT_COL.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>       *<a name="line.442"></a>
+<span class="sourceLineNo">443</span>       * FilterResponse            ColumnChecker               Desired behavior<a name="line.443"></a>
+<span class="sourceLineNo">444</span>       * INCLUDE                   SKIP                        row has already been included, SKIP.<a name="line.444"></a>
+<span class="sourceLineNo">445</span>       * INCLUDE                   INCLUDE                     INCLUDE<a name="line.445"></a>
+<span class="sourceLineNo">446</span>       * INCLUDE                   INCLUDE_AND_SEEK_NEXT_COL   INCLUDE_AND_SEEK_NEXT_COL<a name="line.446"></a>
+<span class="sourceLineNo">447</span>       * INCLUDE                   INCLUDE_AND_SEEK_NEXT_ROW   INCLUDE_AND_SEEK_NEXT_ROW<a name="line.447"></a>
+<span class="sourceLineNo">448</span>       * INCLUDE_AND_SEEK_NEXT_COL SKIP                        row has already been included, SKIP.<a name="line.448"></a>
+<span class="sourceLineNo">449</span>       * INCLUDE_AND_SEEK_NEXT_COL INCLUDE                     INCLUDE_AND_SEEK_NEXT_COL<a name="line.449"></a>
+<span class="sourceLineNo">450</span>       * INCLUDE_AND_SEEK_NEXT_COL INCLUDE_AND_SEEK_NEXT_COL   INCLUDE_AND_SEEK_NEXT_COL<a name="line.450"></a>
+<span class="sourceLineNo">451</span>       * INCLUDE_AND_SEEK_NEXT_COL INCLUDE_AND_SEEK_NEXT_ROW   INCLUDE_AND_SEEK_NEXT_ROW<a name="line.451"></a>
+<span class="sourceLineNo">452</span>       *<a name="line.452"></a>
+<span class="sourceLineNo">453</span>       * In all the above scenarios, we return the column checker return value except for<a name="line.453"></a>
+<span class="sourceLineNo">454</span>       * FilterResponse (INCLUDE_AND_SEEK_NEXT_COL) and ColumnChecker(INCLUDE)<a name="line.454"></a>
+<span class="sourceLineNo">455</span>       */<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      colChecker = columns.checkVersions(cell, timestamp, typeByte,<a name="line.456"></a>
+<span class="sourceLineNo">457</span>          mvccVersion &gt; maxReadPointToTrackVersions);<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      //Optimize with stickyNextRow<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      boolean seekNextRowFromEssential = filterResponse == ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW &amp;&amp;<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          filter.isFamilyEssential(cell.getFamilyArray());<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      if (colChecker == MatchCode.INCLUDE_AND_SEEK_NEXT_ROW || seekNextRowFromEssential) {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>        stickyNextRow = true;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      if (filterResponse == ReturnCode.INCLUDE_AND_SEEK_NEXT_ROW) {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>        if (colChecker != MatchCode.SKIP) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          return MatchCode.INCLUDE_AND_SEEK_NEXT_ROW;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        }<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        return MatchCode.SEEK_NEXT_ROW;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      }<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      return (filterResponse == ReturnCode.INCLUDE_AND_NEXT_COL &amp;&amp;<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          colChecker == MatchCode.INCLUDE) ? MatchCode.INCLUDE_AND_SEEK_NEXT_COL<a name="line.471"></a>
+<span class="sourceLineNo">472</span>          : colChecker;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    }<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    stickyNextRow = (colChecker == MatchCode.SEEK_NEXT_ROW) ? true<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        : stickyNextRow;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    return colChecker;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>  }<a name="line.477"></a>
+<span class="sourceLineNo">478</span><a name="line.478"></a>
+<span class="sourceLineNo">479</span>  /** Handle partial-drop-deletes. As we match keys in order, when we have a range from which<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * we can drop deletes, we can set retainDeletesInOutput to false for the duration of this<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * range only, and maintain consistency. */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  private void checkPartialDropDeleteRange(Cell curCell) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    // If partial-drop-deletes are used, initially, dropDeletesFromRow and dropDeletesToRow<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // are both set, and the matcher is set to retain deletes. We assume ordered keys. When<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // dropDeletesFromRow is leq current kv, we start dropping deletes and reset<a name="line.485"></

<TRUNCATED>

[43/51] [partial] hbase-site git commit: Published site at 52fd70500e0a00e273e2ec0c09d7c914b89432ce.

Posted by mi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/regionserver/StoreScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/StoreScanner.html b/devapidocs/org/apache/hadoop/hbase/regionserver/StoreScanner.html
index 489aee9..dcc1555 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/StoreScanner.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/StoreScanner.html
@@ -514,9 +514,11 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 </td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a></code></td>
+<td class="colFirst"><code>protected <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a></code></td>
 <td class="colLast"><code><strong><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#optimize(org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode,%20org.apache.hadoop.hbase.Cell)">optimize</a></strong>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a>&nbsp;qcode,
-                <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>&nbsp;</td>
+                <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>
+<div class="block">See if we should actually SEEK or rather just SKIP to the next Cell (see HBASE-13109).</div>
+</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
@@ -1324,8 +1326,58 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>optimize</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.656">optimize</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a>&nbsp;qcode,
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.711">optimize</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a>&nbsp;qcode,
                                   <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
+<div class="block">See if we should actually SEEK or rather just SKIP to the next Cell (see HBASE-13109).
+ This method works together with ColumnTrackers and Filters. ColumnTrackers may issue SEEK
+ hints, such as seek to next column, next row, or seek to an arbitrary seek key.
+ This method intercepts these qcodes and decides whether a seek is the most efficient _actual_
+ way to get us to the requested cell (SEEKs are more expensive than SKIP, SKIP, SKIP inside the
+ current, loaded block).
+ It does this by looking at the next indexed key of the current HFile. This key
+ is then compared with the _SEEK_ key, where a SEEK key is an artificial 'last possible key
+ on the row' (only in here, we avoid actually creating a SEEK key; in the compare we work with
+ the current Cell but compare as though it were a seek key; see down in
+ matcher.compareKeyForNextRow, etc). If the compare gets us onto the
+ next block we *_SEEK, otherwise we just INCLUDE or SKIP, and let the ColumnTrackers or Filters
+ go through the next Cell, and so on)
+
+ <p>The ColumnTrackers and Filters must behave correctly in all cases, i.e. if they are past the
+ Cells they care about they must issues a SKIP or SEEK.
+
+ <p>Other notes:
+ <ul>
+ <li>Rows can straddle block boundaries</li>
+ <li>Versions of columns can straddle block boundaries (i.e. column C1 at T1 might be in a
+ different block than column C1 at T2)</li>
+ <li>We want to SKIP and INCLUDE if the chance is high that we'll find the desired Cell after a
+ few SKIPs...</li>
+ <li>We want to INCLUDE_AND_SEEK and SEEK when the chance is high that we'll be able to seek
+ past many Cells, especially if we know we need to go to the next block.</li>
+ </ul>
+ <p>A good proxy (best effort) to determine whether INCLUDE/SKIP is better than SEEK is whether
+ we'll likely end up seeking to the next block (or past the next block) to get our next column.
+ Example:
+ <pre>
+ |    BLOCK 1              |     BLOCK 2                   |
+ |  r1/c1, r1/c2, r1/c3    |    r1/c4, r1/c5, r2/c1        |
+                                   ^         ^
+                                   |         |
+                           Next Index Key   SEEK_NEXT_ROW (before r2/c1)
+
+
+ |    BLOCK 1                       |     BLOCK 2                      |
+ |  r1/c1/t5, r1/c1/t4, r1/c1/t3    |    r1/c1/t2, r1/c1/T1, r1/c2/T3  |
+                                            ^              ^
+                                            |              |
+                                    Next Index Key        SEEK_NEXT_COL
+ </pre>
+ Now imagine we want columns c1 and c3 (see first diagram above), the 'Next Index Key' of r1/c4
+ is > r1/c3 so we should seek to get to the c1 on the next row, r2. In second case, say we only
+ want one version of c1, after we have it, a SEEK_COL will be issued to get to c2. Looking at
+ the 'Next Index Key', it would land us in the next block, so we should SEEK. In other scenarios
+ where the SEEK will not land us in the next block, it is very likely better to issues a series
+ of SKIPs.</div>
 </li>
 </ul>
 <a name="updateReaders(java.util.List)">
@@ -1334,7 +1386,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>updateReaders</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.686">updateReaders</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/StoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFile</a>&gt;&nbsp;sfs)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.747">updateReaders</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/StoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFile</a>&gt;&nbsp;sfs)
                    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/ChangedReadersObserver.html#updateReaders(java.util.List)">ChangedReadersObserver</a></code></strong></div>
 <div class="block">Notify observers.</div>
@@ -1351,7 +1403,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>checkReseek</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.703">checkReseek</a>(boolean&nbsp;flushed)
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.764">checkReseek</a>(boolean&nbsp;flushed)
                        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>flushed</code> - indicates if there was a flush</dd>
 <dt><span class="strong">Returns:</span></dt><dd>true if top of heap has changed (and KeyValueHeap has to try the
@@ -1366,7 +1418,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>resetScannerStack</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.719">resetScannerStack</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;lastTopKey)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.780">resetScannerStack</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;lastTopKey)
                           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>
@@ -1378,7 +1430,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>checkScanOrder</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.772">checkScanOrder</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;prevKV,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.833">checkScanOrder</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;prevKV,
                   <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv,
                   <a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="class in org.apache.hadoop.hbase">CellComparator</a>&nbsp;comparator)
                        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>
@@ -1394,7 +1446,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>seekToNextRow</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.780">seekToNextRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.841">seekToNextRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;c)
                          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>
@@ -1406,7 +1458,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>seekAsDirection</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.790">seekAsDirection</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv)
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.851">seekAsDirection</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">Do a reseek in a normal StoreScanner(scan forward)</div>
 <dl><dt><span class="strong">Parameters:</span></dt><dd><code>kv</code> - </dd>
@@ -1421,7 +1473,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>reseek</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.796">reseek</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;kv)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.857">reseek</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"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#reseek(org.apache.hadoop.hbase.Cell)">KeyValueScanner</a></code></strong></div>
 <div class="block">Reseek the scanner at or after the specified KeyValue.
@@ -1443,7 +1495,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>checkFlushed</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.808">checkFlushed</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.869">checkFlushed</a>()</pre>
 </li>
 </ul>
 <a name="getSequenceID()">
@@ -1452,7 +1504,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>getSequenceID</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.830">getSequenceID</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.891">getSequenceID</a>()</pre>
 <div class="block"><strong>Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#getSequenceID()">KeyValueScanner</a></code></strong></div>
 <div class="block">Get the sequence id associated with this KeyValueScanner. This is required
  for comparing multiple files to find out which one has the latest data.
@@ -1470,7 +1522,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>parallelSeek</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.840">parallelSeek</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;? extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;scanners,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.901">parallelSeek</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;? extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;scanners,
                 <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">Seek storefiles in parallel to optimize IO latency as much as possible</div>
@@ -1485,7 +1537,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>getAllScannersForTesting</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/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.876">getAllScannersForTesting</a>()</pre>
+<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/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.937">getAllScannersForTesting</a>()</pre>
 <div class="block">Used in testing.</div>
 <dl><dt><span class="strong">Returns:</span></dt><dd>all scanners in no particular order</dd></dl>
 </li>
@@ -1496,7 +1548,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>enableLazySeekGlobally</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.886">enableLazySeekGlobally</a>(boolean&nbsp;enable)</pre>
+<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.947">enableLazySeekGlobally</a>(boolean&nbsp;enable)</pre>
 </li>
 </ul>
 <a name="getEstimatedNumberOfKvsScanned()">
@@ -1505,7 +1557,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>getEstimatedNumberOfKvsScanned</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.893">getEstimatedNumberOfKvsScanned</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.954">getEstimatedNumberOfKvsScanned</a>()</pre>
 <dl><dt><span class="strong">Returns:</span></dt><dd>The estimated number of KVs seen by this scanner (includes some skipped KVs).</dd></dl>
 </li>
 </ul>
@@ -1515,14 +1567,15 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockList">
 <li class="blockList">
 <h4>getNextIndexedKey</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.898">getNextIndexedKey</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.959">getNextIndexedKey</a>()</pre>
 <dl>
 <dt><strong>Specified by:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html#getNextIndexedKey()">getNextIndexedKey</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a></code></dd>
 <dt><strong>Overrides:</strong></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/NonLazyKeyValueScanner.html#getNextIndexedKey()">getNextIndexedKey</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/NonLazyKeyValueScanner.html" title="class in org.apache.hadoop.hbase.regionserver">NonLazyKeyValueScanner</a></code></dd>
-<dt><span class="strong">Returns:</span></dt><dd>the next key in the index (the key to seek to the next block)
- if known, or null otherwise</dd></dl>
+<dt><span class="strong">Returns:</span></dt><dd>the next key in the index, usually the first key of next block OR a key that falls
+ between last key of current block and first key of next block..
+ see HFileWriterImpl#getMidpoint, or null if not known.</dd></dl>
 </li>
 </ul>
 <a name="shipped()">
@@ -1531,7 +1584,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValue
 <ul class="blockListLast">
 <li class="blockList">
 <h4>shipped</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.903">shipped</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/StoreScanner.html#line.964">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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/KeyValueScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/KeyValueScanner.html b/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/KeyValueScanner.html
index 523d957..99b2bf4 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/KeyValueScanner.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/KeyValueScanner.html
@@ -914,8 +914,7 @@
 <tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/util/CollectionBackedScanner.html" title="class in org.apache.hadoop.hbase.util">CollectionBackedScanner</a></strong></code>
-<div class="block">Utility scanner that wraps a sortable collection and serves
- as a KeyValueScanner.</div>
+<div class="block">Utility scanner that wraps a sortable collection and serves as a KeyValueScanner.</div>
 </td>
 </tr>
 </tbody>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/NonLazyKeyValueScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/NonLazyKeyValueScanner.html b/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/NonLazyKeyValueScanner.html
index aa95a3a..4c6b6fa 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/NonLazyKeyValueScanner.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/NonLazyKeyValueScanner.html
@@ -172,8 +172,7 @@
 <tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/util/CollectionBackedScanner.html" title="class in org.apache.hadoop.hbase.util">CollectionBackedScanner</a></strong></code>
-<div class="block">Utility scanner that wraps a sortable collection and serves
- as a KeyValueScanner.</div>
+<div class="block">Utility scanner that wraps a sortable collection and serves as a KeyValueScanner.</div>
 </td>
 </tr>
 </tbody>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/NonReversedNonLazyKeyValueScanner.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/NonReversedNonLazyKeyValueScanner.html b/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/NonReversedNonLazyKeyValueScanner.html
index 27ab08a..e4d1fd8 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/NonReversedNonLazyKeyValueScanner.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/NonReversedNonLazyKeyValueScanner.html
@@ -159,8 +159,7 @@
 <tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/util/CollectionBackedScanner.html" title="class in org.apache.hadoop.hbase.util">CollectionBackedScanner</a></strong></code>
-<div class="block">Utility scanner that wraps a sortable collection and serves
- as a KeyValueScanner.</div>
+<div class="block">Utility scanner that wraps a sortable collection and serves as a KeyValueScanner.</div>
 </td>
 </tr>
 </tbody>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/ScanQueryMatcher.MatchCode.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/ScanQueryMatcher.MatchCode.html b/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/ScanQueryMatcher.MatchCode.html
index bfe6525..325857d 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/ScanQueryMatcher.MatchCode.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/ScanQueryMatcher.MatchCode.html
@@ -186,9 +186,11 @@
 </td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a></code></td>
+<td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a></code></td>
 <td class="colLast"><span class="strong">StoreScanner.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#optimize(org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode,%20org.apache.hadoop.hbase.Cell)">optimize</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a>&nbsp;qcode,
-                <a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>&nbsp;</td>
+                <a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>
+<div class="block">See if we should actually SEEK or rather just SKIP to the next Cell (see HBASE-13109).</div>
+</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a></code></td>
@@ -213,9 +215,11 @@ the order they are declared.</div>
 </tr>
 <tbody>
 <tr class="altColor">
-<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a></code></td>
+<td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a></code></td>
 <td class="colLast"><span class="strong">StoreScanner.</span><code><strong><a href="../../../../../../org/apache/hadoop/hbase/regionserver/StoreScanner.html#optimize(org.apache.hadoop.hbase.regionserver.ScanQueryMatcher.MatchCode,%20org.apache.hadoop.hbase.Cell)">optimize</a></strong>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver">ScanQueryMatcher.MatchCode</a>&nbsp;qcode,
-                <a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>&nbsp;</td>
+                <a href="../../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</code>
+<div class="block">See if we should actually SEEK or rather just SKIP to the next Cell (see HBASE-13109).</div>
+</td>
 </tr>
 </tbody>
 </table>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/Shipper.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/Shipper.html b/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/Shipper.html
index 9412954..7d1f63a 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/Shipper.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/Shipper.html
@@ -271,8 +271,7 @@
 <tr class="altColor">
 <td class="colFirst"><code>class&nbsp;</code></td>
 <td class="colLast"><code><strong><a href="../../../../../../org/apache/hadoop/hbase/util/CollectionBackedScanner.html" title="class in org.apache.hadoop.hbase.util">CollectionBackedScanner</a></strong></code>
-<div class="block">Utility scanner that wraps a sortable collection and serves
- as a KeyValueScanner.</div>
+<div class="block">Utility scanner that wraps a sortable collection and serves as a KeyValueScanner.</div>
 </td>
 </tr>
 </tbody>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 238db72..29c3051 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -619,24 +619,24 @@
 <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.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/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/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/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.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/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/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/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/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/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/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/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/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/MemStoreScanner.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">MemStoreScanner.Type</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/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/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/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/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/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/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/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/MemStoreScanner.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="strong">MemStoreScanner.Type</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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/f30982bd/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 9b4d86d..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/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>
-<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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index 4eed6cf..e651693 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -152,8 +152,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.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="strong">SaslUtil.QualityOfProtection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="strong">AuthMethod</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="strong">SaslUtil.QualityOfProtection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="strong">SaslStatus</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/f30982bd/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 8da8ad5..107a6d1 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_filter">
+<a name="m_format">
 <!--   -->
 </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.122">m_filter</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.122">m_format</a></pre>
 </li>
 </ul>
-<a name="m_filter__IsNotDefault">
+<a name="m_format__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.127">m_filter__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.127">m_format__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_catalogJanitorEnabled">
+<a name="m_assignmentManager">
 <!--   -->
 </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.139">m_catalogJanitorEnabled</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.139">m_assignmentManager</a></pre>
 </li>
 </ul>
-<a name="m_catalogJanitorEnabled__IsNotDefault">
+<a name="m_assignmentManager__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.144">m_catalogJanitorEnabled__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.144">m_assignmentManager__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_metaLocation">
+<a name="m_filter">
 <!--   -->
 </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_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.156">m_filter</a></pre>
 </li>
 </ul>
-<a name="m_metaLocation__IsNotDefault">
+<a name="m_filter__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_filter__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.161">m_filter__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_frags">
+<a name="m_servers">
 <!--   -->
 </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.173">m_frags</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.173">m_servers</a></pre>
 </li>
 </ul>
-<a name="m_frags__IsNotDefault">
+<a name="m_servers__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.178">m_frags__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.178">m_servers__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_serverManager">
+<a name="m_deadServers">
 <!--   -->
 </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.190">m_serverManager</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.190">m_deadServers</a></pre>
 </li>
 </ul>
-<a name="m_serverManager__IsNotDefault">
+<a name="m_deadServers__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.195">m_serverManager__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.195">m_deadServers__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_deadServers">
+<a name="m_serverManager">
 <!--   -->
 </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.207">m_deadServers</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.207">m_serverManager</a></pre>
 </li>
 </ul>
-<a name="m_deadServers__IsNotDefault">
+<a name="m_serverManager__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.212">m_deadServers__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.212">m_serverManager__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_assignmentManager">
+<a name="m_catalogJanitorEnabled">
 <!--   -->
 </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.224">m_assignmentManager</a></pre>
+<h4>m_catalogJanitorEnabled</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.224">m_catalogJanitorEnabled</a></pre>
 </li>
 </ul>
-<a name="m_assignmentManager__IsNotDefault">
+<a name="m_catalogJanitorEnabled__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.229">m_assignmentManager__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.229">m_catalogJanitorEnabled__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_format">
+<a name="m_frags">
 <!--   -->
 </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.241">m_format</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.241">m_frags</a></pre>
 </li>
 </ul>
-<a name="m_format__IsNotDefault">
+<a name="m_frags__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.246">m_format__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.246">m_frags__IsNotDefault</a></pre>
 </li>
 </ul>
-<a name="m_servers">
+<a name="m_metaLocation">
 <!--   -->
 </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_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.258">m_metaLocation</a></pre>
 </li>
 </ul>
-<a name="m_servers__IsNotDefault">
+<a name="m_metaLocation__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_metaLocation__IsNotDefault</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.263">m_metaLocation__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="setFilter(java.lang.String)">
+<a name="setFormat(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/master/MasterStatusTmpl.ImplData.html#line.112">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>setFormat</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.112">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="getFilter()">
+<a name="getFormat()">
 <!--   -->
 </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.118">getFilter</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.118">getFormat</a>()</pre>
 </li>
 </ul>
-<a name="getFilter__IsNotDefault()">
+<a name="getFormat__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.123">getFilter__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.123">getFormat__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setCatalogJanitorEnabled(boolean)">
+<a name="setAssignmentManager(org.apache.hadoop.hbase.master.AssignmentManager)">
 <!--   -->
 </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.129">setCatalogJanitorEnabled</a>(boolean&nbsp;catalogJanitorEnabled)</pre>
+<h4>setAssignmentManager</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.129">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="getCatalogJanitorEnabled()">
+<a name="getAssignmentManager()">
 <!--   -->
 </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.135">getCatalogJanitorEnabled</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.135">getAssignmentManager</a>()</pre>
 </li>
 </ul>
-<a name="getCatalogJanitorEnabled__IsNotDefault()">
+<a name="getAssignmentManager__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.140">getCatalogJanitorEnabled__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.140">getAssignmentManager__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setMetaLocation(org.apache.hadoop.hbase.ServerName)">
+<a name="setFilter(java.lang.String)">
 <!--   -->
 </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>setFilter</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.146">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="getMetaLocation()">
+<a name="getFilter()">
 <!--   -->
 </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>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.152">getFilter</a>()</pre>
 </li>
 </ul>
-<a name="getMetaLocation__IsNotDefault()">
+<a name="getFilter__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>getFilter__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.157">getFilter__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setFrags(java.util.Map)">
+<a name="setServers(java.util.List)">
 <!--   -->
 </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.163">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>setServers</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.163">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="getFrags()">
+<a name="getServers()">
 <!--   -->
 </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.169">getFrags</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.169">getServers</a>()</pre>
 </li>
 </ul>
-<a name="getFrags__IsNotDefault()">
+<a name="getServers__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.174">getFrags__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.174">getServers__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setServerManager(org.apache.hadoop.hbase.master.ServerManager)">
+<a name="setDeadServers(java.util.Set)">
 <!--   -->
 </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.180">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>setDeadServers</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.180">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="getServerManager()">
+<a name="getDeadServers()">
 <!--   -->
 </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.186">getServerManager</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.186">getDeadServers</a>()</pre>
 </li>
 </ul>
-<a name="getServerManager__IsNotDefault()">
+<a name="getDeadServers__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.191">getServerManager__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.191">getDeadServers__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setDeadServers(java.util.Set)">
+<a name="setServerManager(org.apache.hadoop.hbase.master.ServerManager)">
 <!--   -->
 </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.197">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>setServerManager</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.197">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="getDeadServers()">
+<a name="getServerManager()">
 <!--   -->
 </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.203">getDeadServers</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.203">getServerManager</a>()</pre>
 </li>
 </ul>
-<a name="getDeadServers__IsNotDefault()">
+<a name="getServerManager__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.208">getDeadServers__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.208">getServerManager__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setAssignmentManager(org.apache.hadoop.hbase.master.AssignmentManager)">
+<a name="setCatalogJanitorEnabled(boolean)">
 <!--   -->
 </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.214">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>setCatalogJanitorEnabled</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.214">setCatalogJanitorEnabled</a>(boolean&nbsp;catalogJanitorEnabled)</pre>
 </li>
 </ul>
-<a name="getAssignmentManager()">
+<a name="getCatalogJanitorEnabled()">
 <!--   -->
 </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.220">getAssignmentManager</a>()</pre>
+<h4>getCatalogJanitorEnabled</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.220">getCatalogJanitorEnabled</a>()</pre>
 </li>
 </ul>
-<a name="getAssignmentManager__IsNotDefault()">
+<a name="getCatalogJanitorEnabled__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.225">getAssignmentManager__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.225">getCatalogJanitorEnabled__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setFormat(java.lang.String)">
+<a name="setFrags(java.util.Map)">
 <!--   -->
 </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.231">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>setFrags</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.231">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="getFormat()">
+<a name="getFrags()">
 <!--   -->
 </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.237">getFormat</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.237">getFrags</a>()</pre>
 </li>
 </ul>
-<a name="getFormat__IsNotDefault()">
+<a name="getFrags__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.242">getFormat__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.242">getFrags__IsNotDefault</a>()</pre>
 </li>
 </ul>
-<a name="setServers(java.util.List)">
+<a name="setMetaLocation(org.apache.hadoop.hbase.ServerName)">
 <!--   -->
 </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>setMetaLocation</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.248">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="getServers()">
+<a name="getMetaLocation()">
 <!--   -->
 </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>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.254">getMetaLocation</a>()</pre>
 </li>
 </ul>
-<a name="getServers__IsNotDefault()">
+<a name="getMetaLocation__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>getMetaLocation__IsNotDefault</h4>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#line.259">getMetaLocation__IsNotDefault</a>()</pre>
 </li>
 </ul>
 </li>